--- loncom/lonnet/perl/lonnet.pm 2005/10/14 19:08:42 1.664 +++ loncom/lonnet/perl/lonnet.pm 2005/10/31 18:23:09 1.672 @@ -1,7 +1,7 @@ # The LearningOnline Network # TCP networking package # -# $Id: lonnet.pm,v 1.664 2005/10/14 19:08:42 albertel Exp $ +# $Id: lonnet.pm,v 1.672 2005/10/31 18:23:09 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -166,7 +166,7 @@ sub reply { unless (defined($hostname{$server})) { return 'no_such_host'; } my $answer=subreply($cmd,$server); if (($answer=~/^refused/) || ($answer=~/^rejected/)) { - &logthis("<font color=blue>WARNING:". + &logthis("<font color=\"blue\">WARNING:". " $cmd to $server returned $answer</font>"); } return $answer; @@ -190,14 +190,14 @@ sub reconlonc { sleep 5; if (-e "$peerfile") { return; } &logthis( - "<font color=blue>WARNING: $peerfile still not there, giving up</font>"); + "<font color=\"blue\">WARNING: $peerfile still not there, giving up</font>"); } else { &logthis( - "<font color=blue>WARNING:". + "<font color=\"blue\">WARNING:". " lonc at pid $loncpid not responding, giving up</font>"); } } else { - &logthis('<font color=blue>WARNING: lonc not running, giving up</font>'); + &logthis('<font color="blue">WARNING: lonc not running, giving up</font>'); } } @@ -206,7 +206,7 @@ sub reconlonc { sub critical { my ($cmd,$server)=@_; unless ($hostname{$server}) { - &logthis("<font color=blue>WARNING:". + &logthis("<font color=\"blue\">WARNING:". " Critical message to unknown server ($server)</font>"); return 'no_such_host'; } @@ -240,12 +240,12 @@ sub critical { } chomp($wcmd); if ($wcmd eq $cmd) { - &logthis("<font color=blue>WARNING: ". + &logthis("<font color=\"blue\">WARNING: ". "Connection buffer $dfilename: $cmd</font>"); &logperm("D:$server:$cmd"); return 'con_delayed'; } else { - &logthis("<font color=red>CRITICAL:" + &logthis("<font color=\"red\">CRITICAL:" ." Critical connection failed: $server $cmd</font>"); &logperm("F:$server:$cmd"); return 'con_failed'; @@ -290,7 +290,7 @@ sub appenv { my %newenv=@_; foreach (keys %newenv) { if (($newenv{$_}=~/^user\.role/) || ($newenv{$_}=~/^user\.priv/)) { - &logthis("<font color=blue>WARNING: ". + &logthis("<font color=\"blue\">WARNING: ". "Attempt to modify environment ".$_." to ".$newenv{$_} .'</font>'); delete($newenv{$_}); @@ -304,7 +304,7 @@ sub appenv { return 'error: '.$!; } unless (flock($lockfh,LOCK_EX)) { - &logthis("<font color=blue>WARNING: ". + &logthis("<font color=\"blue\">WARNING: ". 'Could not obtain exclusive lock in appenv: '.$!); close($lockfh); return 'error: '.$!; @@ -349,7 +349,7 @@ sub delenv { my $delthis=shift; my %newenv=(); if (($delthis=~/user\.role/) || ($delthis=~/user\.priv/)) { - &logthis("<font color=blue>WARNING: ". + &logthis("<font color=\"blue\">WARNING: ". "Attempt to delete from environment ".$delthis); return 'error'; } @@ -360,7 +360,7 @@ sub delenv { return 'error'; } unless (flock($fh,LOCK_SH)) { - &logthis("<font color=blue>WARNING: ". + &logthis("<font color=\"blue\">WARNING: ". 'Could not obtain shared lock in delenv: '.$!); close($fh); return 'error: '.$!; @@ -374,7 +374,7 @@ sub delenv { return 'error'; } unless (flock($fh,LOCK_EX)) { - &logthis("<font color=blue>WARNING: ". + &logthis("<font color=\"blue\">WARNING: ". 'Could not obtain exclusive lock in delenv: '.$!); close($fh); return 'error: '.$!; @@ -443,15 +443,15 @@ sub overloaderror { # ------------------------------ Find server with least workload from spare.tab sub spareserver { - my ($loadpercent,$userloadpercent) = @_; + my ($loadpercent,$userloadpercent,$want_server_name) = @_; my $tryserver; my $spareserver=''; if ($userloadpercent !~ /\d/) { $userloadpercent=0; } my $lowestserver=$loadpercent > $userloadpercent? $loadpercent : $userloadpercent; - foreach $tryserver (keys %spareid) { - my $loadans=reply('load',$tryserver); - my $userloadans=reply('userload',$tryserver); + foreach $tryserver (keys(%spareid)) { + my $loadans=&reply('load',$tryserver); + my $userloadans=&reply('userload',$tryserver); if ($loadans !~ /\d/ && $userloadans !~ /\d/) { next; #didn't get a number from the server } @@ -468,7 +468,11 @@ sub spareserver { $answer = $userloadans; } if (($answer =~ /\d/) && ($answer<$lowestserver)) { - $spareserver="http://$hostname{$tryserver}"; + if ($want_server_name) { + $spareserver=$tryserver; + } else { + $spareserver="http://$hostname{$tryserver}"; + } $lowestserver=$answer; } } @@ -1060,7 +1064,7 @@ sub repcopy { if ($response->is_error()) { unlink($transname); my $message=$response->status_line; - &logthis("<font color=blue>WARNING:" + &logthis("<font color=\"blue\">WARNING:" ." LWP get: $message: $filename</font>"); return 'unavailable'; } else { @@ -1070,7 +1074,7 @@ sub repcopy { if ($mresponse->is_error()) { unlink($filename.'.meta'); &logthis( - "<font color=yellow>INFO: No metadata: $filename</font>"); + "<font color=\"yellow\">INFO: No metadata: $filename</font>"); } } rename($transname,$filename); @@ -1176,7 +1180,6 @@ sub process_coursefile { $fetchresult= &reply('fetchuserfile:'.$docudom.'/'.$docuname.'/'.$file, $home); } else { - my $fetchresult = ''; my $fpath = ''; my $fname = $file; ($fpath,$fname) = ($file =~ m|^(.*)/([^/]+)$|); @@ -1539,7 +1542,7 @@ sub flushcourselogs { } else { &logthis('Failed to flush log buffer for '.$crsid); if (length($courselogs{$crsid})>40000) { - &logthis("<font color=blue>WARNING: Buffer for ".$crsid. + &logthis("<font color=\"blue\">WARNING: Buffer for ".$crsid. " exceeded maximum size, deleting.</font>"); delete $courselogs{$crsid}; } @@ -1950,7 +1953,7 @@ sub checkout { $now.'&'.$ENV{'REMOTE_ADDR'}); my $token=&reply('tmpput:'.$infostr,$lonhost); if ($token=~/^error\:/) { - &logthis("<font color=blue>WARNING: ". + &logthis("<font color=\"blue\">WARNING: ". "Checkout tmpput failed ".$tudom.' - '.$tuname.' - '.$symb. "</font>"); return ''; @@ -1966,7 +1969,7 @@ sub checkout { unless (&cstore(\%infohash,$symb,$tcrsid,$tudom,$tuname) eq 'ok') { return ''; } else { - &logthis("<font color=blue>WARNING: ". + &logthis("<font color=\"blue\">WARNING: ". "Checkout cstore failed ".$tudom.' - '.$tuname.' - '.$symb. "</font>"); } @@ -1976,7 +1979,7 @@ sub checkout { $token)) ne 'ok') { return ''; } else { - &logthis("<font color=blue>WARNING: ". + &logthis("<font color=\"blue\">WARNING: ". "Checkout log failed ".$tudom.' - '.$tuname.' - '.$symb. "</font>"); } @@ -2955,6 +2958,29 @@ sub eget { return %returnhash; } +# ------------------------------------------------------------ tmpput interface +sub tmpput { + my ($storehash,$server)=@_; + my $items=''; + foreach (keys(%$storehash)) { + $items.=&escape($_).'='.&freeze_escape($$storehash{$_}).'&'; + } + $items=~s/\&$//; + return &reply("tmpput:$items",$server); +} + +# ------------------------------------------------------------ tmpget interface +sub tmpget { + my ($token)=@_; + my $rep=&reply("tmpget:$token",$perlvar{'lonHostID'}); + my %returnhash; + foreach my $item (split(/\&/,$rep)) { + my ($key,$value)=split(/=/,$item); + $returnhash{&unescape($key)}=&thaw_unescape($value); + } + return %returnhash; +} + # ---------------------------------------------- Custom access rule evaluation sub customaccess { @@ -3076,15 +3102,30 @@ sub allowed { $thisallowed.=$1; } -# URI is an uploaded document for this course +# URI is an uploaded document for this course, default permissions don't matter # not allowing 'edit' access (editupload) to uploaded course docs if (($priv eq 'bre') && ($uri=~m|^uploaded/|)) { - my $refuri=$env{'httpref.'.$orguri}; - if ($refuri) { - if ($refuri =~ m|^/adm/|) { - $thisallowed='F'; - } - } + $thisallowed=''; + my ($match)=&is_on_map($uri); + if ($match) { + if ($env{'user.priv.'.$env{'request.role'}.'./'} + =~/\Q$priv\E\&([^\:]*)/) { + $thisallowed.=$1; + } + } else { + my $refuri=$env{'httpref.'.$orguri}; + if ($refuri) { + if ($refuri =~ m|^/adm/|) { + $thisallowed='F'; + } else { + $refuri=&declutter($refuri); + my ($match) = &is_on_map($refuri); + if ($match) { + $thisallowed='F'; + } + } + } + } } # Full access at system, domain or course-wide level? Exit. @@ -4441,7 +4482,7 @@ sub get_userresdata { } #error 2 occurs when the .db doesn't exist if ($tmp!~/error: 2 /) { - &logthis("<font color=blue>WARNING:". + &logthis("<font color=\"blue\">WARNING:". " Trying to get resource data for ". $uname." at ".$udom.": ". $tmp."</font>"); @@ -5786,14 +5827,15 @@ sub filelocation { sub hreflocation { my ($dir,$file)=@_; unless (($file=~m-^http://-i) || ($file=~m-^/-)) { - my $finalpath=filelocation($dir,$file); - $finalpath=~s-^/home/httpd/html--; - $finalpath=~s-^/home/(\w+)/public_html/-/~$1/-; - return $finalpath; - } elsif ($file=~m-^/home-) { - $file=~s-^/home/httpd/html--; + $file=filelocation($dir,$file); + } + if ($file=~m-^\Q$perlvar{'lonDocRoot'}\E-) { + $file=~s-^\Q$perlvar{'lonDocRoot'}\E--; + } elsif ($file=~m-/home/(\w+)/public_html/-) { $file=~s-^/home/(\w+)/public_html/-/~$1/-; - return $file; + } elsif ($file=~m-^\Q$perlvar{'lonUsersDir'}\E-) { + $file=~s-^/home/httpd/lonUsers/([^/]*)/./././([^/]*)/userfiles/ + -/uploaded/$1/$2/-x; } return $file; } @@ -6084,7 +6126,7 @@ $processmarker='_'.time.'_'.$perlvar{'lo $dumpcount=0; &logtouch(); -&logthis('<font color=yellow>INFO: Read configuration</font>'); +&logthis('<font color="yellow">INFO: Read configuration</font>'); $readit=1; { use integer;