--- loncom/xml/lonxml.pm 2001/08/20 16:12:46 1.120
+++ loncom/xml/lonxml.pm 2001/10/05 16:55:12 1.135
@@ -13,7 +13,10 @@
# 6/12,6/13 H. K. Ng
# 6/16 Gerd Kortemeyer
# 7/27 H. K. Ng
-# 8/7,8/9,8/10,8/11,8/15,8/16,8/17,8/18,8/20 Gerd Kortemeyer
+# 8/7,8/9,8/10,8/11,8/15,8/16,8/17,8/18,8/20,8/23,8/24 Gerd Kortemeyer
+# Guy Albertelli
+# 9/26 Gerd Kortemeyer
+
package Apache::lonxml;
use vars
@@ -216,16 +219,17 @@ sub maketoken {
}
sub printtokenheader {
- my ($target,$token,$symb,$tuname,$tudom,$tcrsid)=@_;
+ my ($target,$token,$tsymb,$tcrsid,$tudom,$tuname)=@_;
unless ($token) { return ''; }
- unless ($symb) {
- $symb=&Apache::lonnet::symbread();
+ my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();
+ unless ($tsymb) {
+ $tsymb=$symb;
}
unless ($tuname) {
- $tuname=$ENV{'user.name'};
- $tudom=$ENV{'user.domain'};
- $tcrsid=$ENV{'request.course.id'};
+ $tuname=$name;
+ $tudom=$domain;
+ $tcrsid=$courseid;
}
my %reply=&Apache::lonnet::get('environment',
@@ -245,7 +249,7 @@ sub printtokenheader {
'
DocID: '.$token.
'
Time: '.localtime().'
';
} else {
- return $token;
+ return $token;
}
}
@@ -260,7 +264,11 @@ sub fontsettings() {
sub registerurl {
my $forcereg=shift;
- if ($Apache::lonxml::registered) { return ''; }
+ if ($ENV{'request.publicaccess'}) {
+ return
+ '';
+ }
+ if ($Apache::lonxml::registered && !$forcereg) { return ''; }
$Apache::lonxml::registered=1;
if (($ENV{'REQUEST_URI'}!~/^\/(res\/)*adm\//) || ($forcereg)) {
my $hwkadd='';
@@ -323,7 +331,7 @@ ENDPARM
menu=window.open("","LONCAPAmenu");
menu.currentStale=1;
menu.switchbutton
- (3,1,'reload.gif','return','location','go(currentURL)');
+ (3,1,'reload.gif','return','location','go(currentURL)');
menu.clearbut(7,1);
menu.clearbut(7,2);
menu.clearbut(7,3);
@@ -408,7 +416,9 @@ sub xmlparse {
my $finaloutput = &inner_xmlparse($target,\@stack,\@parstack,\@pars,
$safeeval,\%style_for_target);
-
+ if ($ENV{'request.uri'}) {
+ &writeallows($ENV{'request.uri'});
+ }
return $finaloutput;
}
@@ -435,7 +445,6 @@ sub htmlclean {
sub inner_xmlparse {
my ($target,$stack,$parstack,$pars,$safeeval,$style_for_target)=@_;
- &Apache::lonxml::debug('Reentrant parser starting, again?');
my $finaloutput = '';
my $result;
my $token;
@@ -657,11 +666,17 @@ sub setup_globals {
my ($target)=@_;
$Apache::lonxml::registered = 0;
@Apache::lonxml::pwd=();
+ @Apache::lonxml::extlinks=();
if ($target eq 'meta') {
$Apache::lonxml::redirection = 0;
$Apache::lonxml::metamode = 1;
$Apache::lonxml::evaluate = 1;
$Apache::lonxml::import = 0;
+ } elsif ($target eq 'answer') {
+ $Apache::lonxml::redirection = 0;
+ $Apache::lonxml::metamode = 1;
+ $Apache::lonxml::evaluate = 1;
+ $Apache::lonxml::import = 1;
} elsif ($target eq 'grade') {
&startredirection;
$Apache::lonxml::metamode = 0;
@@ -738,7 +753,10 @@ sub init_safespace {
#need to inspect this class of ops
# $safeeval->deny(":base_orig");
$safeinit .= ';$external::target="'.$target.'";';
- $safeinit .= ';$external::randomseed='.&Apache::lonnet::rndseed().';';
+ my $rndseed;
+ my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();
+ $rndseed=&Apache::lonnet::rndseed($symb,$courseid,$domain,$name);
+ $safeinit .= ';$external::randomseed='.$rndseed.';';
&Apache::run::run($safeinit,$safeeval);
}
@@ -873,6 +891,7 @@ sub parstring {
}
sub writeallows {
+ unless ($#extlinks>=0) { return; }
my $thisurl='/res/'.&Apache::lonnet::declutter(shift);
if ($ENV{'httpref.'.$thisurl}) {
$thisurl=$ENV{'httpref.'.$thisurl};
@@ -882,7 +901,9 @@ sub writeallows {
my %httpref=();
map {
$httpref{'httpref.'.
- &Apache::lonnet::hreflocation($thisdir,$_)}=$thisurl; } @extlinks;
+ &Apache::lonnet::hreflocation($thisdir,$_)}=$thisurl;
+ } @extlinks;
+ @extlinks=();
&Apache::lonnet::appenv(%httpref);
}
@@ -1031,10 +1052,11 @@ ENDNOTFOUND
unless ($ENV{'request.state'} eq 'published') {
$result=&inserteditinfo($result,$filecontents);
}
+
+ writeallows($request->uri);
$request->print($result);
- writeallows($request->uri);
return OK;
}
@@ -1077,7 +1099,25 @@ sub get_param {
if ( ! $context ) { $context = -1; }
my $args ='';
if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; }
- return &Apache::run::run("{$args;".'return $'.$param.'}',$safeeval); #'
+ if ( $args =~ /my \$$param=\"/ ) {
+ return &Apache::run::run("{$args;".'return $'.$param.'}',$safeeval); #'
+ } else {
+ return undef;
+ }
+}
+
+sub get_param_var {
+ my ($param,$parstack,$safeeval,$context) = @_;
+ if ( ! $context ) { $context = -1; }
+ my $args ='';
+ if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; }
+ if ( $args !~ /my \$$param=\"/ ) { return undef; }
+ my $value=&Apache::run::run("{$args;".'return $'.$param.'}',$safeeval); #'
+ if ($value =~ /^[\$\@\%]/) {
+ return &Apache::run::run("return $value",$safeeval,1);
+ } else {
+ return $value;
+ }
}
sub register_insert {
@@ -1090,13 +1130,16 @@ sub register_insert {
if ( $line =~ /^\#/ || $line =~ /^\s*\n/) { next; }
if ( $line =~ /TABLE/ ) { last; }
my ($tag,$descrip,$color,$function,$show) = split(/,/, $line);
- $insertlist{"$tagnum.tag"} = $tag;
- $insertlist{"$tagnum.description"} = $descrip;
- $insertlist{"$tagnum.color"} = $color;
- $insertlist{"$tagnum.function"} = $function;
- $insertlist{"$tagnum.show"}= $show;
- $insertlist{"$tag.num"}=$tagnum;
- $tagnum++;
+ if ($tag) {
+ $insertlist{"$tagnum.tag"} = $tag;
+ $insertlist{"$tagnum.description"} = $descrip;
+ $insertlist{"$tagnum.color"} = $color;
+ $insertlist{"$tagnum.function"} = $function;
+ if (!defined($show)) { $show='yes'; }
+ $insertlist{"$tagnum.show"}= $show;
+ $insertlist{"$tag.num"}=$tagnum;
+ $tagnum++;
+ }
}
$i++; #skipping TABLE line
$tagnum = 0;
@@ -1119,6 +1162,31 @@ sub description {
my ($token)=@_;
return $insertlist{$insertlist{"$token->[1].num"}.'.description'};
}
+
+# ----------------------------------------------------------------- whichuser
+# returns a list of $symb, $courseid, $domain, $name that is correct for
+# calls to lonnet functions for this setup.
+# - looks for form.grade_ parameters
+sub whichuser {
+ my ($symb,$courseid,$domain,$name);
+ if (defined($ENV{'form.grade_symb'})) {
+ my $tmp_courseid=$ENV{'form.grade_courseid'};
+ my $allowed=&Apache::lonnet::allowed('mgr',$tmp_courseid);
+ if ($allowed) {
+ $symb=$ENV{'form.grade_symb'};
+ $courseid=$ENV{'form.grade_courseid'};
+ $domain=$ENV{'form.grade_domain'};
+ $name=$ENV{'form.grade_username'};
+ }
+ } else {
+ $symb=&Apache::lonnet::symbread();
+ $courseid=$ENV{'request.course.id'};
+ $domain=$ENV{'user.domain'};
+ $name=$ENV{'user.name'};
+ }
+ return ($symb,$courseid,$domain,$name);
+}
+
1;
__END__