--- loncom/xml/lonxml.pm 2005/03/31 15:55:47 1.368 +++ loncom/xml/lonxml.pm 2005/05/03 06:44:56 1.373 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # XML Parser Module # -# $Id: lonxml.pm,v 1.368 2005/03/31 15:55:47 albertel Exp $ +# $Id: lonxml.pm,v 1.373 2005/05/03 06:44:56 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -81,7 +81,7 @@ use Apache::languagetags(); use Apache::edit(); use Apache::inputtags(); use Apache::outputtags(); -use Apache::lonnet(); +use Apache::lonnet; use Apache::File(); use Apache::loncommon(); use Apache::lonfeedback(); @@ -152,7 +152,7 @@ sub xmlbegin { my ($style)=@_; my $output=''; @htmlareafields=(); - if ($ENV{'browser.mathml'}) { + if ($env{'browser.mathml'}) { $output='' #.''."\n" # .''.&mt('User').': '.$tuname.' at '.$tudom. '
'.&mt('ID').': '.$idhash{$tuname}. '
'.&mt('CourseID').': '.$tcrsid. - '
'.&mt('Course').': '.$ENV{'course.'.$tcrsid.'.description'}. + '
'.&mt('Course').': '.$env{'course.'.$tcrsid.'.description'}. '
'.&mt('DocID').': '.$token. '
'.&mt('Time').': '.&Apache::lonlocal::locallocaltime().'
'; } else { @@ -298,10 +298,10 @@ sub printtokenheader { sub fontsettings { my $headerstring=''; - if (($ENV{'browser.os'} eq 'mac') && (!$ENV{'browser.mathml'})) { + if (($env{'browser.os'} eq 'mac') && (!$env{'browser.mathml'})) { $headerstring.= ''; - } elsif (!$ENV{'browser.mathml'} && $ENV{'browser.unicode'}) { + } elsif (!$env{'browser.mathml'} && $env{'browser.unicode'}) { $headerstring.= ''; } @@ -321,6 +321,7 @@ sub xmlparse { &setup_globals($request,$target); &Apache::inputtags::initialize_inputtags(); + &Apache::bridgetask::initialize_bridgetask(); &Apache::outputtags::initialize_outputtags(); &Apache::edit::initialize_edit(); &Apache::londefdef::initialize_londefdef(); @@ -329,9 +330,9 @@ sub xmlparse { # do we have a course style file? # - if ($ENV{'request.course.id'} && $ENV{'request.state'} ne 'construct') { + if ($env{'request.course.id'} && $env{'request.state'} ne 'construct') { my $bodytext= - $ENV{'course.'.$ENV{'request.course.id'}.'.default_xml_style'}; + $env{'course.'.$env{'request.course.id'}.'.default_xml_style'}; if ($bodytext) { foreach my $file (split(',',$bodytext)) { my $location=&Apache::lonnet::filelocation('',$file); @@ -342,8 +343,8 @@ sub xmlparse { } } } - } elsif ($ENV{'construct.style'} && ($ENV{'request.state'} eq 'construct')) { - my $location=&Apache::lonnet::filelocation('',$ENV{'construct.style'}); + } elsif ($env{'construct.style'} && ($env{'request.state'} eq 'construct')) { + my $location=&Apache::lonnet::filelocation('',$env{'construct.style'}); my $styletext=&Apache::lonnet::getfile($location); if ($styletext ne '-1') { %style_for_target = (%style_for_target, @@ -352,7 +353,7 @@ sub xmlparse { } #&printalltags(); my @pars = (); - my $pwd=$ENV{'request.filename'}; + my $pwd=$env{'request.filename'}; $pwd =~ s:/[^/]*$::; &newparser(\@pars,\$content_file_string,$pwd); @@ -370,12 +371,12 @@ sub xmlparse { my $finaloutput = &inner_xmlparse($target,\@stack,\@parstack,\@pars, $safeeval,\%style_for_target); - if ($ENV{'request.uri'}) { - &writeallows($ENV{'request.uri'}); + if ($env{'request.uri'}) { + &writeallows($env{'request.uri'}); } &do_registered_ssi(); if ($Apache::lonxml::counter_changed) { &store_counter() } - if ($ENV{'form.return_only_error_and_warning_counts'}) { + if ($env{'form.return_only_error_and_warning_counts'}) { return "$errorcount:$warningcount"; } return $finaloutput; @@ -694,12 +695,15 @@ sub init_safespace { $safeeval->permit(":base_math"); $safeeval->permit("sort"); $safeeval->permit("time"); + $safeeval->deny("rand"); + $safeeval->deny("srand"); $safeeval->deny(":base_io"); $safehole->wrap(\&Apache::scripttag::xmlparse,$safeeval,'&xmlparse'); $safehole->wrap(\&Apache::outputtags::multipart,$safeeval,'&multipart'); $safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT'); $safehole->wrap(\&Apache::chemresponse::chem_standard_order,$safeeval, '&chem_standard_order'); + $safehole->wrap(\&Apache::response::check_status,$safeeval,'&check_status'); $safehole->wrap(\&Math::Cephes::asin,$safeeval,'&asin'); $safehole->wrap(\&Math::Cephes::acos,$safeeval,'&acos'); @@ -780,13 +784,18 @@ sub init_safespace { # $safeeval->deny(":base_orig"); $safeeval->permit("require"); $safeinit .= ';$external::target="'.$target.'";'; - my $rndseed; - my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser(); - $rndseed=&Apache::lonnet::rndseed($symb,$courseid,$domain,$name); - $safeinit .= ';$external::randomseed="'.$rndseed.'";'; - &Apache::lonxml::debug("Setting rndseed to $rndseed"); &Apache::run::run($safeinit,$safeeval); + &initialize_rndseed($safeeval); +} +sub initialize_rndseed { + my ($safeeval)=@_; + my $rndseed; + my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser(); + $rndseed=&Apache::lonnet::rndseed($symb,$courseid,$domain,$name); + my $safeinit = '$external::randomseed="'.$rndseed.'";'; + &Apache::lonxml::debug("Setting rndseed to $rndseed"); + &Apache::run::run($safeinit,$safeeval); } sub default_homework_load { @@ -941,8 +950,8 @@ sub increment_counter { } sub init_counter { - if (defined($ENV{'form.counter'})) { - $Apache::lonxml::counter=$ENV{'form.counter'}; + if (defined($env{'form.counter'})) { + $Apache::lonxml::counter=$env{'form.counter'}; $Apache::lonxml::counter_changed=0; } else { $Apache::lonxml::counter=1; @@ -1084,8 +1093,8 @@ sub parstring { sub writeallows { unless ($#extlinks>=0) { return; } my $thisurl='/res/'.&Apache::lonnet::declutter(shift); - if ($ENV{'httpref.'.$thisurl}) { - $thisurl=$ENV{'httpref.'.$thisurl}; + if ($env{'httpref.'.$thisurl}) { + $thisurl=$env{'httpref.'.$thisurl}; } my $thisdir=$thisurl; $thisdir=~s/\/[^\/]+$//; @@ -1118,24 +1127,24 @@ sub afterburn { my $result=shift; &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['highlight','anchor','link']); - if ($ENV{'form.highlight'}) { - foreach (split(/\,/,$ENV{'form.highlight'})) { + if ($env{'form.highlight'}) { + foreach (split(/\,/,$env{'form.highlight'})) { my $anchorname=$_; my $matchthis=$anchorname; $matchthis=~s/\_+/\\s\+/g; $result=~s/(\Q$matchthis\E)/\$1\<\/font\>/gs; } } - if ($ENV{'form.link'}) { - foreach (split(/\,/,$ENV{'form.link'})) { + if ($env{'form.link'}) { + foreach (split(/\,/,$env{'form.link'})) { my ($anchorname,$linkurl)=split(/\>/,$_); my $matchthis=$anchorname; $matchthis=~s/\_+/\\s\+/g; $result=~s/(\Q$matchthis\E)/\$1\<\/a\>/gs; } } - if ($ENV{'form.anchor'}) { - my $anchorname=$ENV{'form.anchor'}; + if ($env{'form.anchor'}) { + my $anchorname=$env{'form.anchor'}; my $matchthis=$anchorname; $matchthis=~s/\_+/\\s\+/g; $result=~s/(\Q$matchthis\E)/\$1\<\/a\>/s; @@ -1265,24 +1274,24 @@ ENDFOOTER } sub get_target { - my $viewgrades=&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'}); - if ( $ENV{'request.state'} eq 'published') { - if ( defined($ENV{'form.grade_target'}) + my $viewgrades=&Apache::lonnet::allowed('vgr',$env{'request.course.id'}); + if ( $env{'request.state'} eq 'published') { + if ( defined($env{'form.grade_target'}) && ($viewgrades == 'F' )) { - return ($ENV{'form.grade_target'}); - } elsif (defined($ENV{'form.grade_target'})) { - if (($ENV{'form.grade_target'} eq 'web') || - ($ENV{'form.grade_target'} eq 'tex') ) { - return $ENV{'form.grade_target'} + return ($env{'form.grade_target'}); + } elsif (defined($env{'form.grade_target'})) { + if (($env{'form.grade_target'} eq 'web') || + ($env{'form.grade_target'} eq 'tex') ) { + return $env{'form.grade_target'} } else { return 'web'; } } else { return 'web'; } - } elsif ($ENV{'request.state'} eq 'construct') { - if ( defined($ENV{'form.grade_target'})) { - return ($ENV{'form.grade_target'}); + } elsif ($env{'request.state'} eq 'construct') { + if ( defined($env{'form.grade_target'})) { + return ($env{'form.grade_target'}); } else { return 'web'; } @@ -1296,11 +1305,11 @@ sub handler { my $target=&get_target(); - $Apache::lonxml::debug=$ENV{'user.debug'}; + $Apache::lonxml::debug=$env{'user.debug'}; &Apache::loncommon::content_type($request,'text/html'); &Apache::loncommon::no_cache($request); - if ($ENV{'request.state'} eq 'published') { + if ($env{'request.state'} eq 'published') { $request->set_last_modified(&Apache::lonnet::metadata($request->uri, 'lastrevisiondate')); } @@ -1319,9 +1328,9 @@ sub handler { # # Edit action? Save file. # - unless ($ENV{'request.state'} eq 'published') { - if (($ENV{'form.savethisfile'}) || ($ENV{'form.attemptclean'})) { - if (&storefile($file,$ENV{'form.filecont'})) { + unless ($env{'request.state'} eq 'published') { + if (($env{'form.savethisfile'}) || ($env{'form.attemptclean'})) { + if (&storefile($file,$env{'form.filecont'})) { &Apache::lonxml::info("". &mt('Updated').": ". &Apache::lonlocal::locallocaltime(time). @@ -1346,21 +1355,21 @@ $bodytag ENDNOTFOUND $filecontents=''; - if ($ENV{'request.state'} ne 'published') { + if ($env{'request.state'} ne 'published') { if ($filetype eq 'sty') { $filecontents=&createnewsty(); } else { $filecontents=&createnewhtml(); } - $ENV{'form.editmode'}='Edit'; #force edit mode + $env{'form.editmode'}='Edit'; #force edit mode } } else { - unless ($ENV{'request.state'} eq 'published') { + unless ($env{'request.state'} eq 'published') { if ($filecontents=~/BEGIN LON-CAPA Internal/) { &Apache::lonxml::error(&mt('This file appears to be a rendering of a Lon-CAPA resource. If this is correct, this resource will act very oddly and incorrectly.')); } - if ($ENV{'form.attemptclean'}) { + if ($env{'form.attemptclean'}) { $filecontents=&htmlclean($filecontents,1); } # @@ -1368,7 +1377,7 @@ ENDNOTFOUND &Apache::loncommon::get_unprocessed_cgi ($ENV{'QUERY_STRING'},['editmode']); } - if (!$ENV{'form.editmode'} || $ENV{'form.viewmode'}) { + if (!$env{'form.editmode'} || $env{'form.viewmode'}) { $result = &Apache::lonxml::xmlparse($request,$target,$filecontents, '',%mystyle); undef($Apache::lonhomework::parsing_a_task); @@ -1378,12 +1387,12 @@ ENDNOTFOUND # # Edit action? Insert editing commands # - unless ($ENV{'request.state'} eq 'published') { - if ($ENV{'form.editmode'} && (!($ENV{'form.viewmode'}))) { + unless ($env{'request.state'} eq 'published') { + if ($env{'form.editmode'} && (!($env{'form.viewmode'}))) { my $displayfile=$request->uri; $displayfile=~s/^\/[^\/]*//; my $bodytag=''; - if ($ENV{'environment.remote'} eq 'off') { + if ($env{'environment.remote'} eq 'off') { $bodytag=&Apache::loncommon::bodytag(); } $result=''.$bodytag. @@ -1404,10 +1413,10 @@ ENDNOTFOUND sub display_title { my $result; - if ($ENV{'request.state'} eq 'construct') { + if ($env{'request.state'} eq 'construct') { my $title=&Apache::lonnet::gettitle(); if (!defined($title) || $title eq '') { - $title = $ENV{'request.filename'}; + $title = $env{'request.filename'}; $title = substr($title, rindex($title, '/') + 1); } $result = ""; @@ -1426,15 +1435,15 @@ sub debug { } sub show_error_warn_msg { - if ($ENV{'request.filename'} eq '/home/httpd/html/res/lib/templates/simpleproblem.problem' && - &Apache::lonnet::allowed('mdc',$ENV{'request.course.id'})) { + if ($env{'request.filename'} eq '/home/httpd/html/res/lib/templates/simpleproblem.problem' && + &Apache::lonnet::allowed('mdc',$env{'request.course.id'})) { return 1; } return (($Apache::lonxml::debug eq 1) || - ($ENV{'request.state'} eq 'construct') || + ($env{'request.state'} eq 'construct') || ($Apache::lonhomework::browse eq 'F' && - $ENV{'form.show_errors'} eq 'on')); + $env{'form.show_errors'} eq 'on')); } sub error { @@ -1453,11 +1462,11 @@ sub error { $errormsg=&mt("An error occured while processing this resource. The author has been notified."); } #notify author - &Apache::lonmsg::author_res_msg($ENV{'request.filename'},join('
',@_)); + &Apache::lonmsg::author_res_msg($env{'request.filename'},join('
',@_)); #notify course - if ( $symb && $ENV{'request.course.id'} ) { + if ( $symb && $env{'request.course.id'} ) { my (undef,%users)=&Apache::lonfeedback::decide_receiver(undef,0,1,1,1); - my $declutter=&Apache::lonnet::declutter($ENV{'request.filename'}); + my $declutter=&Apache::lonnet::declutter($env{'request.filename'}); my @userlist; foreach (keys %users) { my ($user,$domain) = split(/:/, $_); @@ -1465,7 +1474,7 @@ sub error { &Apache::lonmsg::user_normal_msg($user,$domain, "Error [$declutter]",join('
',@_)); } - if ($ENV{'request.role.adv'}) { + if ($env{'request.role.adv'}) { $errormsg=&mt("An error occured while processing this resource. The course personnel ([_1]) and the author have been notified.",join(', ',@userlist)); } else { $errormsg=&mt("An error occured while processing this resource. The instructor has been notified."); @@ -1478,7 +1487,7 @@ sub error { sub warning { $warningcount++; - if ($ENV{'form.grade_target'} ne 'tex') { + if ($env{'form.grade_target'} ne 'tex') { if ( &show_error_warn_msg() ) { my $request=$Apache::lonxml::request; if (!$request) { $request=Apache->request; } @@ -1491,8 +1500,8 @@ sub warning { } sub info { - if ($ENV{'form.grade_target'} ne 'tex' - && $ENV{'request.state'} eq 'construct') { + if ($env{'form.grade_target'} ne 'tex' + && $env{'request.state'} eq 'construct') { push(@Apache::lonxml::info_messages,join('
',@_)."
\n"); } } @@ -1643,15 +1652,15 @@ sub helpinfo { sub whichuser { my ($passedsymb)=@_; my ($symb,$courseid,$domain,$name,$publicuser); - if (defined($ENV{'form.grade_symb'})) { + if (defined($env{'form.grade_symb'})) { my ($tmp_courseid)= &Apache::loncommon::get_env_multiple('form.grade_courseid'); my $allowed=&Apache::lonnet::allowed('vgr',$tmp_courseid); if (!$allowed && - exists($ENV{'request.course.sec'}) && - $ENV{'request.course.sec'} !~ /^\s*$/) { + exists($env{'request.course.sec'}) && + $env{'request.course.sec'} !~ /^\s*$/) { $allowed=&Apache::lonnet::allowed('vgr',$tmp_courseid. - '/'.$ENV{'request.course.sec'}); + '/'.$env{'request.course.sec'}); } if ($allowed) { ($symb)=&Apache::loncommon::get_env_multiple('form.grade_symb'); @@ -1666,14 +1675,14 @@ sub whichuser { } else { $symb=$passedsymb; } - $courseid=$ENV{'request.course.id'}; - $domain=$ENV{'user.domain'}; - $name=$ENV{'user.name'}; + $courseid=$env{'request.course.id'}; + $domain=$env{'user.domain'}; + $name=$env{'user.name'}; if ($name eq 'public' && $domain eq 'public') { - if (!defined($ENV{'form.username'})) { - $ENV{'form.username'}.=time.rand(10000000); + if (!defined($env{'form.username'})) { + $env{'form.username'}.=time.rand(10000000); } - $name.=$ENV{'form.username'}; + $name.=$env{'form.username'}; } return ($symb,$courseid,$domain,$name,$publicuser); }