http://qs321.pair.com?node_id=126978

Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hi,

I want to use LWP::Simple inside a safe compartment created with the Safe Module. But it ends up with errors like "Can't locate object method "new" via package "LWP::UserAgent" at line... or "Require trapped by operation mask..."

Here is how the code looks like (shortened ;-) ):

$codefromoutside='print wget "http://google.com";'; use LWP::Simple (); sub wget { LWP::Simple::get $_[0] } use Safe; $safe=new Safe; $safe->share(qw(wget)); $safe->reval($codefromoutside); print $@ if $@;
(There is a reason why I use "wget" instead of "get" directly because I have already a subroutine with the name "get" elsewhere)

I tried some other things but they all didn't work. Does anybody know how to use LWP::Simple::get inside a save compartment?

Thanks in advance,

best regards,

Christoph Bergmann

Replies are listed 'Best First'.
Re: How to use LWP::Simpe inside a safe compartment?
by jlongino (Parson) on Nov 23, 2001 at 00:18 UTC
    First of all let me say that I know nothing about how Safe.pm works. However, I was able to run your program without errors with the following change:
    $codefromoutside='print wget "http://google.com";'; use LWP::Simple (); sub wget { LWP::Simple::get $_[0] } use Safe; $safe=new Safe; $safe->share(qw(LWP::Simple::get)); ## <- note change here $safe->reval($codefromoutside); print $@ if $@;
    This may be inappropriate or not, I don't know, but maybe it helps.

    --Jim

      Hi Jim...

      Thanks for your try, but I didn't get any result with this code either. What should happen is that "googe.com" should be downloaded and printed out...

      I tried:

      $safe->share(qw(LWP::Simple::get wget));
      but it gives
      require trapped by operation mask at C:/Perl/5.00503/lib/IO/Socket.pm +line 9.
      which means that LWP::Simple::get tries to load some stuff which is forbidden within the safe compartment.

      Nobody any further ideas!?

      Best regards,

      Christoph Bergmann

        Take a look at http://perldoc.perl.org/Safe.html. You probably want to do a safe->permit('require').

        I can't say that it will make your program work, but it will get you past that particular error.