--- rat/lonuserstate.pm 2000/11/21 20:46:42 1.20 +++ rat/lonuserstate.pm 2000/12/28 21:42:28 1.21 @@ -12,7 +12,7 @@ # # 7/15,7/17,7/18,8/1,8/2,8/4,8/5,8/21,8/22,8/23,8/30, # 9/2,9/4,9/29,9/30,10/2,10/11,10/30,10/31, -# 11/1,11/2,11/14,11/16,11/22 Gerd Kortemeyer +# 11/1,11/2,11/14,11/16,11/22,12/28 Gerd Kortemeyer package Apache::lonuserstate; @@ -24,6 +24,7 @@ use Apache::lonnet(); use GDBM_File; use Apache::lonmsg; use Safe; +use Safe::Hole; use Opcode; # ---------------------------------------------------- Globals for this package @@ -33,6 +34,7 @@ my %hash; # The big tied hash my %parmhash;# The hash with the parameters my @cond; # Array with all of the conditions my $errtext; # variable with all errors +my $retfurl; # variable with the very first URL in the course # --------------------------------------------------------- Loads map from disk @@ -224,6 +226,9 @@ sub traceroute { $sofar=simplify($sofar); unless ($beenhere=~/\&$rid\&/) { $beenhere.=$rid.'&'; + if ($retfurl eq '') { + $retfurl=$hash{'src_'.$rid}; + } if (defined($hash{'conditions_'.$rid})) { $hash{'conditions_'.$rid}=simplify( '('.$hash{'conditions_'.$rid}.')|('.$sofar.')'); @@ -358,6 +363,7 @@ sub readmap { unlink($fn.'_symb.db'); unlink($fn.'.state'); unlink($fn.'parms.db'); + $retfurl=''; if ((tie(%hash,'GDBM_File',"$fn.db",&GDBM_WRCREAT,0640)) && (tie(%parmhash,'GDBM_File',$fn.'_parms.db',&GDBM_WRCREAT,0640))) { %hash=(); @@ -387,13 +393,13 @@ sub readmap { "Could not tie coursemap $fn for $uri."); } &Apache::lonmsg::author_res_msg($ENV{'request.course.uri'},$errtext); - return $errtext; + return ($retfurl,$errtext); } # ------------------------------------------------------- Evaluate state string sub evalstate { - my $safeeval = new Safe; + my $fn=$ENV{'request.course.fn'}.'.state'; my $state='2'; if (-e $fn) { @@ -402,10 +408,12 @@ sub evalstate { my $fh=Apache::File->new($fn); @conditions=<$fh>; } + my $safeeval = new Safe; + my $safehole = new Safe::Hole; $safeeval->permit("entereval"); $safeeval->permit(":base_math"); $safeeval->deny(":base_io"); - $safeeval->share_from('Apache::lonnet',['&EXT']); + $safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT'); map { my $line=$_; chomp($line);