test wrapper for Safe

This commit is contained in:
Xavier Guimard 2010-09-04 11:49:03 +00:00
parent 09b06fecbf
commit 29640f3829
4 changed files with 48 additions and 23 deletions

View File

@ -21,6 +21,7 @@ use Safe;
use Lemonldap::NG::Common::Safelib; #link protected safe Safe object
require POSIX;
use CGI::Util 'expires';
use constant SAFEWRAP => ( Safe->can("wrap_code_re") ? 1 : 0 );
#inherits Cache::Cache
#inherits Apache::Session
@ -373,7 +374,7 @@ sub safe {
}";
$class->lmLog( $@, 'error' ) if ($@);
}
$safe->share_from( 'main', ['%ENV', 'APR::Table::set'] );
$safe->share_from( 'main', [ '%ENV', 'APR::Table::set' ] );
$safe->share_from( 'Lemonldap::NG::Common::Safelib',
$Lemonldap::NG::Common::Safelib::functions );
$safe->share( '&encode_base64', '$datas', '&lmSetHeaderIn',
@ -609,9 +610,13 @@ sub conditionSub {
$cond =~ s/\$datas->{vhost}/\$apacheRequest->hostname/g;
# Eval sub
my $sub =
$class->safe->wrap_code_ref(
$class->safe->reval("sub {return ( $cond )}") );
my $sub = (
SAFEWRAP
? $class->safe->wrap_code_ref(
$class->safe->reval("sub{return($cond)}")
)
: $class->safe->reval("sub{return($cond)}")
);
# Return sub and protected flag
return ( $sub, 1 );
@ -695,8 +700,11 @@ sub forgeHeadersInit {
"lmSetHeaderIn(\$apacheRequest,'$_' => join('',split(/[\\r\\n]+/,"
. $tmp{$_} . ")));";
}
$forgeHeaders =
$class->safe->wrap_code_ref( $class->safe->reval("sub {$sub};") );
$forgeHeaders = (
SAFEWRAP
? $class->safe->wrap_code_ref( $class->safe->reval("sub{$sub}") )
: $class->safe->reval("sub{$sub}")
);
$class->lmLog( "$class: Unable to forge headers: $@: sub {$sub}", 'error' )
if ($@);
1;
@ -737,9 +745,7 @@ sub postUrlInit {
$h{$_} = "'$h{$_}'" if ( $h{$_} =~ /^\w+$/ );
$tmp .= "'$_'=>$h{$_},";
}
my $sub = $class->safe->wrap_code_ref(
$class->safe->reval(
"sub{
my $sub = "sub{
my \$f = shift;
my \$l;
unless(\$f->ctx){
@ -756,7 +762,11 @@ sub postUrlInit {
}
return OK;
}"
)
;
$sub = (
SAFEWRAP
? $class->safe->wrap_code_ref( $class->safe->reval($sub) )
: $class->safe->reval($sub)
);
$class->lmLog( "Compiling POST request for $url", 'debug' );
$transform->{$url} = sub {

View File

@ -8,6 +8,7 @@ package Lemonldap::NG::Handler::Vhost;
use Lemonldap::NG::Handler::Simple qw(:locationRules :headers); #inherits
use strict;
use MIME::Base64;
use constant SAFEWRAP => ( Safe->can("wrap_code_re") ? 1 : 0 );
our $VERSION = '0.55';
@ -78,8 +79,11 @@ sub forgeHeadersInit {
#$sub = "\$forgeHeaders->{'$vhost'} = sub {$sub};";
#eval "$sub";
$forgeHeaders->{$vhost} =
$class->safe->wrap_code_ref( $class->safe->reval("sub {$sub}") );
$forgeHeaders->{$vhost} = (
SAFEWRAP
? $class->safe->wrap_code_ref( $class->safe->reval("sub {$sub}") )
: $class->safe->reval("sub {$sub}")
);
$class->lmLog( "$class: Unable to forge headers: $@: sub {$sub}",
'error' )
if ($@);

View File

@ -11,6 +11,7 @@ require Lemonldap::NG::Common::CGI;
use Lemonldap::NG::Portal::SharedConf;
use Lemonldap::NG::Common::Safelib; #link protected safe Safe object
use Safe;
use constant SAFEWRAP => ( Safe->can("wrap_code_re") ? 1 : 0 );
#inherits Net::LDAP::Control::PasswordPolicy
@ -151,9 +152,13 @@ sub displayModule {
# Else parse display condition
my $cond = $self->{modules}->{$modulename};
$cond =~ s/\$(\w+)/$self->{portalObject}->{sessionInfo}->{$1}/g;
return $self->safe->wrap_code_ref(
$self->_safe->reval("sub {return ( $cond )}") );
return 0;
return (
SAFEWRAP
? $self->safe->wrap_code_ref(
$self->safe->reval("sub{return($cond)}")
)
: $self->safe->reval("sub{return($cond)}")
);
}
## @method string displayTab()
@ -565,10 +570,12 @@ sub _conditionSub {
if ( $cond =~ /^(?:deny$|logout)/i );
$cond =~ s/\$date/&POSIX::strftime("%Y%m%d%H%M%S",localtime())/e;
$cond =~ s/\$(\w+)/\$self->{portalObject}->{sessionInfo}->{$1}/g;
my $sub;
$sub =
$self->safe->wrap_code_ref(
$self->_safe->reval("sub {my \$self = shift; return ( $cond )}") );
my $sub = "sub {my \$self = shift; return ( $cond )}";
$sub = (
SAFEWRAP
? $self->safe->wrap_code_ref( $self->safe->reval($sub) )
: $self->safe->reval($sub)
);
return $sub;
}

View File

@ -8,6 +8,8 @@ package Lemonldap::NG::Portal::_SOAP;
use strict;
use Lemonldap::NG::Portal::Simple;
require SOAP::Lite;
use Safe;
use constant SAFEWRAP => ( Safe->can("wrap_code_re") ? 1 : 0 );
our $VERSION = '0.2';
@ -367,10 +369,12 @@ sub _conditionSub {
if ( !$h or $cond =~ /^(?:deny$|logout)/i );
$cond =~ s/\$date/&POSIX::strftime("%Y%m%d%H%M%S",localtime())/e;
$cond =~ s/\$(\w+)/$h->{$1}/g;
my $sub;
$sub =
$self->safe->wrap_code_ref(
$self->safe->reval("sub {my \$self = shift; return ( $cond )}") );
my $sub = "sub {my \$self = shift; return ( $cond )}";
$sub = (
SAFEWRAP
? $self->safe->wrap_code_ref( $self->safe->reval($sub) )
: $self->safe->reval($sub)
);
return $sub;
}