version 1.587.2.3.2.14, 2005/02/16 22:57:33
|
version 1.614, 2005/03/21 18:53:51
|
Line 35 use HTTP::Headers;
|
Line 35 use HTTP::Headers;
|
use HTTP::Date; |
use HTTP::Date; |
# use Date::Parse; |
# use Date::Parse; |
use vars |
use vars |
qw(%perlvar %hostname %badServerCache %hostip %iphost %spareid %hostdom |
qw(%perlvar %hostname %badServerCache %iphost %spareid %hostdom |
%libserv %pr %prp $memcache %packagetab |
%libserv %pr %prp $memcache %packagetab |
%courselogs %accesshash %userrolehash $processmarker $dumpcount |
%courselogs %accesshash %userrolehash $processmarker $dumpcount |
%coursedombuf %coursenumbuf %coursehombuf %coursedescrbuf %courseinstcodebuf %courseownerbuf |
%coursedombuf %coursenumbuf %coursehombuf %coursedescrbuf %courseinstcodebuf %courseownerbuf |
Line 834 sub getsection {
|
Line 834 sub getsection {
|
return &do_cache_new('getsection',$hashid,'-1',$cachetime); |
return &do_cache_new('getsection',$hashid,'-1',$cachetime); |
} |
} |
|
|
|
|
my $disk_caching_disabled=1; |
|
|
|
sub devalidate_cache { |
|
my ($cache,$id,$name) = @_; |
|
delete $$cache{$id.'.time'}; |
|
delete $$cache{$id.'.file'}; |
|
delete $$cache{$id}; |
|
if (1 || $disk_caching_disabled) { return; } |
|
my $filename=$perlvar{'lonDaemons'}.'/tmp/lonnet_internal_cache_'.$name.".db"; |
|
if (!-e $filename) { return; } |
|
open(DB,">$filename.lock"); |
|
flock(DB,LOCK_EX); |
|
my %hash; |
|
if (tie(%hash,'GDBM_File',$filename,&GDBM_WRCREAT(),0640)) { |
|
eval <<'EVALBLOCK'; |
|
delete($hash{$id}); |
|
delete($hash{$id.'.time'}); |
|
EVALBLOCK |
|
if ($@) { |
|
&logthis("<font color='red'>devalidate_cache blew up :$@:$name</font>"); |
|
unlink($filename); |
|
} |
|
} else { |
|
if (-e $filename) { |
|
&logthis("Unable to tie hash (devalidate cache): $name"); |
|
unlink($filename); |
|
} |
|
} |
|
untie(%hash); |
|
flock(DB,LOCK_UN); |
|
close(DB); |
|
} |
|
|
|
sub is_cached { |
|
my ($cache,$id,$name,$time) = @_; |
|
if (!$time) { $time=300; } |
|
if (!exists($$cache{$id.'.time'})) { |
|
&load_cache_item($cache,$name,$id,$time); |
|
} |
|
if (!exists($$cache{$id.'.time'})) { |
|
# &logthis("Didn't find $id"); |
|
return (undef,undef); |
|
} else { |
|
if (time-($$cache{$id.'.time'})>$time) { |
|
if (exists($$cache{$id.'.file'})) { |
|
foreach my $filename (@{ $$cache{$id.'.file'} }) { |
|
my $mtime=(stat($filename))[9]; |
|
#+1 is to take care of edge effects |
|
if ($mtime && (($mtime+1) < ($$cache{$id.'.time'}))) { |
|
# &logthis("Upping $mtime - ".$$cache{$id.'.time'}. |
|
# "$id because of $filename"); |
|
} else { |
|
&logthis("Devalidating $filename $id - ".(time-($$cache{$id.'.time'}))); |
|
&devalidate_cache($cache,$id,$name); |
|
return (undef,undef); |
|
} |
|
} |
|
$$cache{$id.'.time'}=time; |
|
} else { |
|
# &logthis("Devalidating $id - ".time-($$cache{$id.'.time'})); |
|
&devalidate_cache($cache,$id,$name); |
|
return (undef,undef); |
|
} |
|
} |
|
} |
|
return ($$cache{$id},1); |
|
} |
|
|
|
sub do_cache { |
|
my ($cache,$id,$value,$name) = @_; |
|
$$cache{$id.'.time'}=time; |
|
$$cache{$id}=$value; |
|
# &logthis("Caching $id as :$value:"); |
|
&save_cache_item($cache,$name,$id); |
|
# do_cache implictly return the set value |
|
$$cache{$id}; |
|
} |
|
|
|
my %do_save_item; |
|
my %do_save; |
|
sub save_cache_item { |
|
my ($cache,$name,$id)=@_; |
|
if ($disk_caching_disabled) { return; } |
|
$do_save{$name}=$cache; |
|
if (!exists($do_save_item{$name})) { $do_save_item{$name}={} } |
|
$do_save_item{$name}->{$id}=1; |
|
return; |
|
} |
|
|
|
sub save_cache { |
sub save_cache { |
&purge_remembered(); |
&purge_remembered(); |
if ($disk_caching_disabled) { return; } |
|
my ($cache,$name,$id); |
|
foreach $name (keys(%do_save)) { |
|
$cache=$do_save{$name}; |
|
|
|
my $starttime=&Time::HiRes::time(); |
|
&logthis("Saving :$name:"); |
|
my %hash; |
|
my $filename=$perlvar{'lonDaemons'}.'/tmp/lonnet_internal_cache_'.$name.".db"; |
|
open(DB,">$filename.lock"); |
|
flock(DB,LOCK_EX); |
|
if (tie(%hash,'GDBM_File',$filename,&GDBM_WRCREAT(),0640)) { |
|
foreach $id (keys(%{ $do_save_item{$name} })) { |
|
eval <<'EVALBLOCK'; |
|
$hash{$id.'.time'}=$$cache{$id.'.time'}; |
|
$hash{$id}=freeze({'item'=>$$cache{$id}}); |
|
if (exists($$cache{$id.'.file'})) { |
|
$hash{$id.'.file'}=freeze({'item'=>$$cache{$id.'.file'}}); |
|
} |
|
EVALBLOCK |
|
if ($@) { |
|
&logthis("<font color='red'>save_cache blew up :$@:$name</font>"); |
|
unlink($filename); |
|
last; |
|
} |
|
} |
|
} else { |
|
if (-e $filename) { |
|
&logthis("Unable to tie hash (save cache): $name ($!)"); |
|
unlink($filename); |
|
} |
|
} |
|
untie(%hash); |
|
flock(DB,LOCK_UN); |
|
close(DB); |
|
&logthis("save_cache $name took ".(&Time::HiRes::time()-$starttime)); |
|
} |
|
undef(%do_save); |
|
undef(%do_save_item); |
|
|
|
} |
|
|
|
sub load_cache_item { |
|
my ($cache,$name,$id,$time)=@_; |
|
if ($disk_caching_disabled) { return; } |
|
my $starttime=&Time::HiRes::time(); |
|
# &logthis("Before Loading $name for $id size is ".scalar(%$cache)); |
|
my %hash; |
|
my $filename=$perlvar{'lonDaemons'}.'/tmp/lonnet_internal_cache_'.$name.".db"; |
|
if (!-e $filename) { return; } |
|
open(DB,">$filename.lock"); |
|
flock(DB,LOCK_SH); |
|
if (tie(%hash,'GDBM_File',$filename,&GDBM_READER(),0640)) { |
|
eval <<'EVALBLOCK'; |
|
if (!%$cache) { |
|
my $count; |
|
while (my ($key,$value)=each(%hash)) { |
|
$count++; |
|
if ($key =~ /\.time$/) { |
|
$$cache{$key}=$value; |
|
} else { |
|
my $hashref=thaw($value); |
|
$$cache{$key}=$hashref->{'item'}; |
|
} |
|
} |
|
# &logthis("Initial load: $count"); |
|
} else { |
|
if (($$cache{$id.'.time'}+$time) < time) { |
|
$$cache{$id.'.time'}=$hash{$id.'.time'}; |
|
{ |
|
my $hashref=thaw($hash{$id}); |
|
$$cache{$id}=$hashref->{'item'}; |
|
} |
|
if (exists($hash{$id.'.file'})) { |
|
my $hashref=thaw($hash{$id.'.file'}); |
|
$$cache{$id.'.file'}=$hashref->{'item'}; |
|
} |
|
} |
|
} |
|
EVALBLOCK |
|
if ($@) { |
|
&logthis("<font color='red'>load_cache blew up :$@:$name</font>"); |
|
unlink($filename); |
|
} |
|
} else { |
|
if (-e $filename) { |
|
&logthis("Unable to tie hash (load cache item): $name ($!)"); |
|
unlink($filename); |
|
} |
|
} |
|
untie(%hash); |
|
flock(DB,LOCK_UN); |
|
close(DB); |
|
# &logthis("After Loading $name size is ".scalar(%$cache)); |
|
# &logthis("load_cache_item $name took ".(&Time::HiRes::time()-$starttime)); |
|
} |
} |
|
|
my $to_remember=-1; |
my $to_remember=-1; |
Line 1068 sub do_cache_new {
|
Line 883 sub do_cache_new {
|
$setvalue='__undef__'; |
$setvalue='__undef__'; |
} |
} |
if ($debug) { &Apache::lonnet::logthis("Setting $id to $value"); } |
if ($debug) { &Apache::lonnet::logthis("Setting $id to $value"); } |
$memcache->set($id,$setvalue,300); |
$memcache->set($id,$setvalue,$time); |
&make_room($id,$value,$debug); |
# need to make a copy of $value |
|
#&make_room($id,$value,$debug); |
return $value; |
return $value; |
} |
} |
|
|
Line 1090 sub make_room {
|
Line 906 sub make_room {
|
delete($remembered{$to_kick}); |
delete($remembered{$to_kick}); |
delete($accessed{$to_kick}); |
delete($accessed{$to_kick}); |
$kicks++; |
$kicks++; |
if ($debug) { &logthis("kicking $max_time $kicks\n"); } |
if ($debug) { &logthis("kicking $to_kick $max_time $kicks\n"); } |
return; |
return; |
} |
} |
|
|
sub purge_remembered { |
sub purge_remembered { |
&logthis("Tossing ".scalar(keys(%remembered))); |
#&logthis("Tossing ".scalar(keys(%remembered))); |
&logthis(sprintf("%-20s is %s",'%remembered',length(&freeze(\%remembered)))); |
#&logthis(sprintf("%-20s is %s",'%remembered',length(&freeze(\%remembered)))); |
undef(%remembered); |
undef(%remembered); |
undef(%accessed); |
undef(%accessed); |
} |
} |
Line 1178 sub subscribe {
|
Line 994 sub subscribe {
|
sub repcopy { |
sub repcopy { |
my $filename=shift; |
my $filename=shift; |
$filename=~s/\/+/\//g; |
$filename=~s/\/+/\//g; |
if ($filename=~m|^/home/httpd/html/adm/|) { return OK; } |
if ($filename=~m|^/home/httpd/html/adm/|) { return 'ok'; } |
if ($filename=~m|^/home/httpd/html/lonUsers/|) { return OK; } |
if ($filename=~m|^/home/httpd/html/lonUsers/|) { return 'ok'; } |
if ($filename=~m|^/home/httpd/html/userfiles/| or |
if ($filename=~m|^/home/httpd/html/userfiles/| or |
$filename=~m|^/*uploaded/|) { |
$filename=~m -^/*(uploaded|editupload)/-) { |
return &repcopy_userfile($filename); |
return &repcopy_userfile($filename); |
} |
} |
$filename=~s/[\n\r]//g; |
$filename=~s/[\n\r]//g; |
my $transname="$filename.in.transfer"; |
my $transname="$filename.in.transfer"; |
if ((-e $filename) || (-e $transname)) { return OK; } |
if ((-e $filename) || (-e $transname)) { return 'ok'; } |
my $remoteurl=subscribe($filename); |
my $remoteurl=subscribe($filename); |
if ($remoteurl =~ /^con_lost by/) { |
if ($remoteurl =~ /^con_lost by/) { |
&logthis("Subscribe returned $remoteurl: $filename"); |
&logthis("Subscribe returned $remoteurl: $filename"); |
return HTTP_SERVICE_UNAVAILABLE; |
return 'unavailable'; |
} elsif ($remoteurl eq 'not_found') { |
} elsif ($remoteurl eq 'not_found') { |
#&logthis("Subscribe returned not_found: $filename"); |
#&logthis("Subscribe returned not_found: $filename"); |
return HTTP_NOT_FOUND; |
return 'not_found'; |
} elsif ($remoteurl =~ /^rejected by/) { |
} elsif ($remoteurl =~ /^rejected by/) { |
&logthis("Subscribe returned $remoteurl: $filename"); |
&logthis("Subscribe returned $remoteurl: $filename"); |
return FORBIDDEN; |
return 'forbidden'; |
} elsif ($remoteurl eq 'directory') { |
} elsif ($remoteurl eq 'directory') { |
return OK; |
return 'ok'; |
} else { |
} else { |
my $author=$filename; |
my $author=$filename; |
$author=~s/\/home\/httpd\/html\/res\/([^\/]*)\/([^\/]*).*/$1\/$2/; |
$author=~s/\/home\/httpd\/html\/res\/([^\/]*)\/([^\/]*).*/$1\/$2/; |
Line 1209 sub repcopy {
|
Line 1025 sub repcopy {
|
my $path="/$parts[1]/$parts[2]/$parts[3]/$parts[4]"; |
my $path="/$parts[1]/$parts[2]/$parts[3]/$parts[4]"; |
if ($path ne "$perlvar{'lonDocRoot'}/res") { |
if ($path ne "$perlvar{'lonDocRoot'}/res") { |
&logthis("Malconfiguration for replication: $filename"); |
&logthis("Malconfiguration for replication: $filename"); |
return HTTP_BAD_REQUEST; |
return 'bad_request'; |
} |
} |
my $count; |
my $count; |
for ($count=5;$count<$#parts;$count++) { |
for ($count=5;$count<$#parts;$count++) { |
Line 1226 sub repcopy {
|
Line 1042 sub repcopy {
|
my $message=$response->status_line; |
my $message=$response->status_line; |
&logthis("<font color=blue>WARNING:" |
&logthis("<font color=blue>WARNING:" |
." LWP get: $message: $filename</font>"); |
." LWP get: $message: $filename</font>"); |
return HTTP_SERVICE_UNAVAILABLE; |
return 'unavailable'; |
} else { |
} else { |
if ($remoteurl!~/\.meta$/) { |
if ($remoteurl!~/\.meta$/) { |
my $mrequest=new HTTP::Request('GET',$remoteurl.'.meta'); |
my $mrequest=new HTTP::Request('GET',$remoteurl.'.meta'); |
Line 1238 sub repcopy {
|
Line 1054 sub repcopy {
|
} |
} |
} |
} |
rename($transname,$filename); |
rename($transname,$filename); |
return OK; |
return 'ok'; |
} |
} |
} |
} |
} |
} |
Line 1247 sub repcopy {
|
Line 1063 sub repcopy {
|
# ------------------------------------------------ Get server side include body |
# ------------------------------------------------ Get server side include body |
sub ssi_body { |
sub ssi_body { |
my ($filelink,%form)=@_; |
my ($filelink,%form)=@_; |
|
if (! exists($form{'LONCAPA_INTERNAL_no_discussion'})) { |
|
$form{'LONCAPA_INTERNAL_no_discussion'}='true'; |
|
} |
my $output=($filelink=~/^http\:/?&externalssi($filelink): |
my $output=($filelink=~/^http\:/?&externalssi($filelink): |
&ssi($filelink,%form)); |
&ssi($filelink,%form)); |
$output=~s|//(\s*<!--)? BEGIN LON-CAPA Internal.+// END LON-CAPA Internal\s*(-->)?\s||gs; |
$output=~s|//(\s*<!--)? BEGIN LON-CAPA Internal.+// END LON-CAPA Internal\s*(-->)?\s||gs; |
Line 1380 sub process_coursefile {
|
Line 1199 sub process_coursefile {
|
return $fetchresult; |
return $fetchresult; |
} |
} |
|
|
# --------------- Take an uploaded file and put it into the userfiles directory |
|
# input: name of form element, coursedoc=1 means this is for the course |
|
# output: url of file in userspace |
|
|
|
sub clean_filename { |
sub clean_filename { |
my ($fname)=@_; |
my ($fname)=@_; |
# Replace Windows backslashes by forward slashes |
# Replace Windows backslashes by forward slashes |
Line 1400 sub clean_filename {
|
Line 1215 sub clean_filename {
|
return $fname; |
return $fname; |
} |
} |
|
|
|
# --------------- Take an uploaded file and put it into the userfiles directory |
|
# input: name of form element, coursedoc=1 means this is for the course |
|
# output: url of file in userspace |
|
|
|
|
sub userfileupload { |
sub userfileupload { |
my ($formname,$coursedoc,$subdir)=@_; |
my ($formname,$coursedoc,$subdir)=@_; |
if (!defined($subdir)) { $subdir='unknown'; } |
if (!defined($subdir)) { $subdir='unknown'; } |
Line 1473 sub finishuserfileupload {
|
Line 1293 sub finishuserfileupload {
|
} |
} |
# Notify homeserver to grep it |
# Notify homeserver to grep it |
# |
# |
&Apache::lonnet::logthis("fetching ".$path.$file); |
|
my $fetchresult= &reply('fetchuserfile:'.$path.$file,$docuhome); |
my $fetchresult= &reply('fetchuserfile:'.$path.$file,$docuhome); |
if ($fetchresult eq 'ok') { |
if ($fetchresult eq 'ok') { |
# |
# |
Line 1489 sub finishuserfileupload {
|
Line 1308 sub finishuserfileupload {
|
sub removeuploadedurl { |
sub removeuploadedurl { |
my ($url)=@_; |
my ($url)=@_; |
my (undef,undef,$udom,$uname,$fname)=split('/',$url,5); |
my (undef,undef,$udom,$uname,$fname)=split('/',$url,5); |
return &Apache::lonnet::removeuserfile($uname,$udom,$fname); |
return &removeuserfile($uname,$udom,$fname); |
} |
} |
|
|
sub removeuserfile { |
sub removeuserfile { |
Line 1819 sub get_first_access {
|
Line 1638 sub get_first_access {
|
my ($symb,$courseid,$udom,$uname)=&Apache::lonxml::whichuser(); |
my ($symb,$courseid,$udom,$uname)=&Apache::lonxml::whichuser(); |
if ($argsymb) { $symb=$argsymb; } |
if ($argsymb) { $symb=$argsymb; } |
my ($map,$id,$res)=&decode_symb($symb); |
my ($map,$id,$res)=&decode_symb($symb); |
if ($type eq 'map') { $res=$map; } |
if ($type eq 'map') { |
my %times=&get('firstaccesstimes',[$res],$udom,$uname); |
$res=&symbread($map); |
return $times{$res}; |
} else { |
|
$res=$symb; |
|
} |
|
my %times=&get('firstaccesstimes',["$courseid\0$res"],$udom,$uname); |
|
return $times{"$courseid\0$res"}; |
} |
} |
|
|
sub set_first_access { |
sub set_first_access { |
my ($type)=@_; |
my ($type)=@_; |
my ($symb,$courseid,$udom,$uname)=&Apache::lonxml::whichuser(); |
my ($symb,$courseid,$udom,$uname)=&Apache::lonxml::whichuser(); |
my ($map,$id,$res)=&decode_symb($symb); |
my ($map,$id,$res)=&decode_symb($symb); |
if ($type eq 'map') { $res=$map; } |
if ($type eq 'map') { |
my $firstaccess=&get_first_access($type); |
$res=&symbread($map); |
|
} else { |
|
$res=$symb; |
|
} |
|
my $firstaccess=&get_first_access($type,$symb); |
if (!$firstaccess) { |
if (!$firstaccess) { |
return &put('firstaccesstimes',{$res=>time},$udom,$uname); |
return &put('firstaccesstimes',{"$courseid\0$res"=>time},$udom,$uname); |
} |
} |
return 'already_set'; |
return 'already_set'; |
} |
} |
Line 1889 sub checkin {
|
Line 1716 sub checkin {
|
my $now=time; |
my $now=time; |
my ($ta,$tb,$lonhost)=split(/\*/,$token); |
my ($ta,$tb,$lonhost)=split(/\*/,$token); |
$lonhost=~tr/A-Z/a-z/; |
$lonhost=~tr/A-Z/a-z/; |
my $dtoken=$ta.'_'.$hostip{$lonhost}.'_'.$tb; |
my $dtoken=$ta.'_'.$hostname{$lonhost}.'_'.$tb; |
$dtoken=~s/\W/\_/g; |
$dtoken=~s/\W/\_/g; |
my ($dummy,$tuname,$tudom,$tcrsid,$symb,$chtim,$rmaddr)= |
my ($dummy,$tuname,$tudom,$tcrsid,$symb,$chtim,$rmaddr)= |
split(/\&/,&unescape(&reply('tmpget:'.$dtoken,$lonhost))); |
split(/\&/,&unescape(&reply('tmpget:'.$dtoken,$lonhost))); |
Line 2172 sub tmpreset {
|
Line 1999 sub tmpreset {
|
$namespace=~s/\//\_/g; |
$namespace=~s/\//\_/g; |
$namespace=~s/\W//g; |
$namespace=~s/\W//g; |
|
|
#FIXME needs to do something for /pub resources |
|
if (!$domain) { $domain=$ENV{'user.domain'}; } |
if (!$domain) { $domain=$ENV{'user.domain'}; } |
if (!$stuname) { $stuname=$ENV{'user.name'}; } |
if (!$stuname) { $stuname=$ENV{'user.name'}; } |
|
if ($domain eq 'public' && $stuname eq 'public') { |
|
$stuname=$ENV{'REMOTE_ADDR'}; |
|
} |
my $path=$perlvar{'lonDaemons'}.'/tmp'; |
my $path=$perlvar{'lonDaemons'}.'/tmp'; |
my %hash; |
my %hash; |
if (tie(%hash,'GDBM_File', |
if (tie(%hash,'GDBM_File', |
Line 2207 sub tmpstore {
|
Line 2036 sub tmpstore {
|
} |
} |
$namespace=~s/\//\_/g; |
$namespace=~s/\//\_/g; |
$namespace=~s/\W//g; |
$namespace=~s/\W//g; |
#FIXME needs to do something for /pub resources |
|
if (!$domain) { $domain=$ENV{'user.domain'}; } |
if (!$domain) { $domain=$ENV{'user.domain'}; } |
if (!$stuname) { $stuname=$ENV{'user.name'}; } |
if (!$stuname) { $stuname=$ENV{'user.name'}; } |
|
if ($domain eq 'public' && $stuname eq 'public') { |
|
$stuname=$ENV{'REMOTE_ADDR'}; |
|
} |
my $now=time; |
my $now=time; |
my %hash; |
my %hash; |
my $path=$perlvar{'lonDaemons'}.'/tmp'; |
my $path=$perlvar{'lonDaemons'}.'/tmp'; |
Line 2221 sub tmpstore {
|
Line 2052 sub tmpstore {
|
my $allkeys=''; |
my $allkeys=''; |
foreach my $key (keys(%$storehash)) { |
foreach my $key (keys(%$storehash)) { |
$allkeys.=$key.':'; |
$allkeys.=$key.':'; |
$hash{"$version:$symb:$key"}=$$storehash{$key}; |
$hash{"$version:$symb:$key"}=&freeze_escape($$storehash{$key}); |
} |
} |
$hash{"$version:$symb:timestamp"}=$now; |
$hash{"$version:$symb:timestamp"}=$now; |
$allkeys.='timestamp'; |
$allkeys.='timestamp'; |
Line 2248 sub tmprestore {
|
Line 2079 sub tmprestore {
|
$symb=escape($symb); |
$symb=escape($symb); |
|
|
if (!$namespace) { $namespace=$ENV{'request.state'}; } |
if (!$namespace) { $namespace=$ENV{'request.state'}; } |
#FIXME needs to do something for /pub resources |
|
if (!$domain) { $domain=$ENV{'user.domain'}; } |
if (!$domain) { $domain=$ENV{'user.domain'}; } |
if (!$stuname) { $stuname=$ENV{'user.name'}; } |
if (!$stuname) { $stuname=$ENV{'user.name'}; } |
|
if ($domain eq 'public' && $stuname eq 'public') { |
|
$stuname=$ENV{'REMOTE_ADDR'}; |
|
} |
my %returnhash; |
my %returnhash; |
$namespace=~s/\//\_/g; |
$namespace=~s/\//\_/g; |
$namespace=~s/\W//g; |
$namespace=~s/\W//g; |
Line 2269 sub tmprestore {
|
Line 2102 sub tmprestore {
|
my $key; |
my $key; |
$returnhash{"$scope:keys"}=$vkeys; |
$returnhash{"$scope:keys"}=$vkeys; |
foreach $key (@keys) { |
foreach $key (@keys) { |
$returnhash{"$scope:$key"}=$hash{"$scope:$symb:$key"}; |
$returnhash{"$scope:$key"}=&thaw_unescape($hash{"$scope:$symb:$key"}); |
$returnhash{"$key"}=$hash{"$scope:$symb:$key"}; |
$returnhash{"$key"}=&thaw_unescape($hash{"$scope:$symb:$key"}); |
} |
} |
} |
} |
if (!(untie(%hash))) { |
if (!(untie(%hash))) { |
Line 2311 sub store {
|
Line 2144 sub store {
|
|
|
my $namevalue=''; |
my $namevalue=''; |
foreach (keys %$storehash) { |
foreach (keys %$storehash) { |
$namevalue.=escape($_).'='.escape($$storehash{$_}).'&'; |
$namevalue.=&escape($_).'='.&freeze_escape($$storehash{$_}).'&'; |
} |
} |
$namevalue=~s/\&$//; |
$namevalue=~s/\&$//; |
&courselog($symb.':'.$stuname.':'.$domain.':STORE:'.$namevalue); |
&courselog($symb.':'.$stuname.':'.$domain.':STORE:'.$namevalue); |
Line 2347 sub cstore {
|
Line 2180 sub cstore {
|
|
|
my $namevalue=''; |
my $namevalue=''; |
foreach (keys %$storehash) { |
foreach (keys %$storehash) { |
$namevalue.=escape($_).'='.escape($$storehash{$_}).'&'; |
$namevalue.=&escape($_).'='.&freeze_escape($$storehash{$_}).'&'; |
} |
} |
$namevalue=~s/\&$//; |
$namevalue=~s/\&$//; |
&courselog($symb.':'.$stuname.':'.$domain.':CSTORE:'.$namevalue); |
&courselog($symb.':'.$stuname.':'.$domain.':CSTORE:'.$namevalue); |
Line 2381 sub restore {
|
Line 2214 sub restore {
|
my %returnhash=(); |
my %returnhash=(); |
foreach (split(/\&/,$answer)) { |
foreach (split(/\&/,$answer)) { |
my ($name,$value)=split(/\=/,$_); |
my ($name,$value)=split(/\=/,$_); |
$returnhash{&unescape($name)}=&unescape($value); |
$returnhash{&unescape($name)}=&thaw_unescape($value); |
} |
} |
my $version; |
my $version; |
for ($version=1;$version<=$returnhash{'version'};$version++) { |
for ($version=1;$version<=$returnhash{'version'};$version++) { |
Line 2772 sub putstore {
|
Line 2605 sub putstore {
|
my $key = $1.':keys:'.$2; |
my $key = $1.':keys:'.$2; |
$allitems{$key} .= $3.':'; |
$allitems{$key} .= $3.':'; |
} |
} |
$items.=$_.'='.&escape($$storehash{$_}).'&'; |
$items.=$_.'='.&freeze_escape($$storehash{$_}).'&'; |
} |
} |
foreach (keys %allitems) { |
foreach (keys %allitems) { |
$allitems{$_} =~ s/\:$//; |
$allitems{$_} =~ s/\:$//; |
Line 2873 sub allowed {
|
Line 2706 sub allowed {
|
|
|
# Free bre access to user's own portfolio contents |
# Free bre access to user's own portfolio contents |
my ($space,$domain,$name,$dir)=split('/',$uri); |
my ($space,$domain,$name,$dir)=split('/',$uri); |
if (('uploaded' eq $space) && ($ENV{'user.name'} eq $name) && |
if (($space=~/^(uploaded|ediupload)$/) && ($ENV{'user.name'} eq $name) && |
($ENV{'user.domain'} eq $domain) && ('portfolio' eq $dir)) { |
($ENV{'user.domain'} eq $domain) && ('portfolio' eq $dir)) { |
return 'F'; |
return 'F'; |
} |
} |
Line 2942 sub allowed {
|
Line 2775 sub allowed {
|
} |
} |
|
|
# URI is an uploaded document for this course |
# URI is an uploaded document for this course |
|
# not allowing 'edit' access (editupload) to uploaded course docs |
if (($priv eq 'bre') && ($uri=~m|^uploaded/|)) { |
if (($priv eq 'bre') && ($uri=~m|^uploaded/|)) { |
my $refuri=$ENV{'httpref.'.$orguri}; |
my $refuri=$ENV{'httpref.'.$orguri}; |
if ($refuri) { |
if ($refuri) { |
Line 3642 sub modifyuser {
|
Line 3475 sub modifyuser {
|
if (defined($middle)) { $names{'middlename'} = $middle; } |
if (defined($middle)) { $names{'middlename'} = $middle; } |
if ($last) { $names{'lastname'} = $last; } |
if ($last) { $names{'lastname'} = $last; } |
if (defined($gene)) { $names{'generation'} = $gene; } |
if (defined($gene)) { $names{'generation'} = $gene; } |
if ($email) { $names{'notification'} = $email; |
if ($email) { |
$names{'critnotification'} = $email; } |
$email=~s/[^\w\@\.\-\,]//gs; |
|
if ($email=~/\@/) { $names{'notification'} = $email; |
|
$names{'critnotification'} = $email; |
|
$names{'permanentemail'} = $email; } |
|
} |
my $reply = &put('environment', \%names, $udom,$uname); |
my $reply = &put('environment', \%names, $udom,$uname); |
if ($reply ne 'ok') { return 'error: '.$reply; } |
if ($reply ne 'ok') { return 'error: '.$reply; } |
&logthis('Success modifying user '.$udom.', '.$uname.', '.$uid.', '. |
&logthis('Success modifying user '.$udom.', '.$uname.', '.$uid.', '. |
Line 3879 sub is_locked {
|
Line 3715 sub is_locked {
|
my @check; |
my @check; |
my $is_locked; |
my $is_locked; |
push @check, $file_name; |
push @check, $file_name; |
my %locked = &Apache::lonnet::get('file_permissions',\@check, |
my %locked = &get('file_permissions',\@check, |
$ENV{'user.domain'},$ENV{'user.name'}); |
$ENV{'user.domain'},$ENV{'user.name'}); |
|
# my ($tmp)=keys(%locked); |
|
# if ($tmp=~/^error:/) { undef(%locked); } |
|
|
if (ref($locked{$file_name}) eq 'ARRAY') { |
if (ref($locked{$file_name}) eq 'ARRAY') { |
$is_locked = 'true'; |
$is_locked = 'true'; |
} else { |
} else { |
Line 3892 sub is_locked {
|
Line 3731 sub is_locked {
|
|
|
sub mark_as_readonly { |
sub mark_as_readonly { |
my ($domain,$user,$files,$what) = @_; |
my ($domain,$user,$files,$what) = @_; |
my %current_permissions = &Apache::lonnet::dump('file_permissions',$domain,$user); |
my %current_permissions = &dump('file_permissions',$domain,$user); |
|
# my ($tmp)=keys(%current_permissions); |
|
# if ($tmp=~/^error:/) { undef(%current_permissions); } |
|
|
foreach my $file (@{$files}) { |
foreach my $file (@{$files}) { |
push(@{$current_permissions{$file}},$what); |
push(@{$current_permissions{$file}},$what); |
} |
} |
&Apache::lonnet::put('file_permissions',\%current_permissions,$domain,$user); |
&put('file_permissions',\%current_permissions,$domain,$user); |
return; |
return; |
} |
} |
|
|
Line 3973 sub files_not_in_path {
|
Line 3815 sub files_not_in_path {
|
|
|
sub get_marked_as_readonly { |
sub get_marked_as_readonly { |
my ($domain,$user,$what) = @_; |
my ($domain,$user,$what) = @_; |
my %current_permissions = &Apache::lonnet::dump('file_permissions',$domain,$user); |
my %current_permissions = &dump('file_permissions',$domain,$user); |
|
# my ($tmp)=keys(%current_permissions); |
|
# if ($tmp=~/^error:/) { undef(%current_permissions); } |
|
|
my @readonly_files; |
my @readonly_files; |
while (my ($file_name,$value) = each(%current_permissions)) { |
while (my ($file_name,$value) = each(%current_permissions)) { |
if (ref($value) eq "ARRAY"){ |
if (ref($value) eq "ARRAY"){ |
Line 3992 sub get_marked_as_readonly {
|
Line 3837 sub get_marked_as_readonly {
|
|
|
sub get_marked_as_readonly_hash { |
sub get_marked_as_readonly_hash { |
my ($domain,$user,$what) = @_; |
my ($domain,$user,$what) = @_; |
my %current_permissions = &Apache::lonnet::dump('file_permissions',$domain,$user); |
my %current_permissions = &dump('file_permissions',$domain,$user); |
|
# my ($tmp)=keys(%current_permissions); |
|
# if ($tmp=~/^error:/) { undef(%current_permissions); } |
|
|
my %readonly_files; |
my %readonly_files; |
while (my ($file_name,$value) = each(%current_permissions)) { |
while (my ($file_name,$value) = each(%current_permissions)) { |
if (ref($value) eq "ARRAY"){ |
if (ref($value) eq "ARRAY"){ |
Line 4013 sub unmark_as_readonly {
|
Line 3861 sub unmark_as_readonly {
|
# unmarks all files locked by $what |
# unmarks all files locked by $what |
# for portfolio submissions, $what contains $crsid and $symb |
# for portfolio submissions, $what contains $crsid and $symb |
my ($domain,$user,$what) = @_; |
my ($domain,$user,$what) = @_; |
my %current_permissions = &Apache::lonnet::dump('file_permissions',$domain,$user); |
my %current_permissions = &dump('file_permissions',$domain,$user); |
my @readonly_files = &Apache::lonnet::get_marked_as_readonly($domain,$user,$what); |
# my ($tmp)=keys(%current_permissions); |
|
# if ($tmp=~/^error:/) { undef(%current_permissions); } |
|
|
|
my @readonly_files = &get_marked_as_readonly($domain,$user,$what); |
foreach my $file(@readonly_files){ |
foreach my $file(@readonly_files){ |
my $current_locks = $current_permissions{$file}; |
my $current_locks = $current_permissions{$file}; |
my @new_locks; |
my @new_locks; |
Line 4029 sub unmark_as_readonly {
|
Line 3880 sub unmark_as_readonly {
|
$current_permissions{$file} = \@new_locks; |
$current_permissions{$file} = \@new_locks; |
} else { |
} else { |
push(@del_keys, $file); |
push(@del_keys, $file); |
&Apache::lonnet::del('file_permissions',\@del_keys, $domain, $user); |
&del('file_permissions',\@del_keys, $domain, $user); |
delete $current_permissions{$file}; |
delete $current_permissions{$file}; |
} |
} |
} |
} |
} |
} |
&Apache::lonnet::put('file_permissions',\%current_permissions,$domain,$user); |
&put('file_permissions',\%current_permissions,$domain,$user); |
return; |
return; |
} |
} |
|
|
Line 4062 sub dirlist {
|
Line 3913 sub dirlist {
|
|
|
if($udom) { |
if($udom) { |
if($uname) { |
if($uname) { |
my $listing=reply('ls:'.$dirRoot.'/'.$uri, |
my $listing=reply('ls2:'.$dirRoot.'/'.$uri, |
homeserver($uname,$udom)); |
homeserver($uname,$udom)); |
return split(/:/,$listing); |
my @listing_results; |
|
if ($listing eq 'unknown_cmd') { |
|
$listing=reply('ls:'.$dirRoot.'/'.$uri, |
|
homeserver($uname,$udom)); |
|
@listing_results = split(/:/,$listing); |
|
} else { |
|
@listing_results = map { &unescape($_); } split(/:/,$listing); |
|
} |
|
return @listing_results; |
} elsif(!defined($alternateDirectoryRoot)) { |
} elsif(!defined($alternateDirectoryRoot)) { |
my $tryserver; |
my $tryserver; |
my %allusers=(); |
my %allusers=(); |
foreach $tryserver (keys %libserv) { |
foreach $tryserver (keys %libserv) { |
if($hostdom{$tryserver} eq $udom) { |
if($hostdom{$tryserver} eq $udom) { |
my $listing=reply('ls:'.$perlvar{'lonDocRoot'}.'/res/'. |
my $listing=reply('ls2:'.$perlvar{'lonDocRoot'}.'/res/'. |
$udom, $tryserver); |
$udom, $tryserver); |
if (($listing ne 'no_such_dir') && ($listing ne 'empty') |
my @listing_results; |
&& ($listing ne 'con_lost')) { |
if ($listing eq 'unknown_cmd') { |
foreach (split(/:/,$listing)) { |
$listing=reply('ls:'.$perlvar{'lonDocRoot'}.'/res/'. |
|
$udom, $tryserver); |
|
@listing_results = split(/:/,$listing); |
|
} else { |
|
@listing_results = |
|
map { &unescape($_); } split(/:/,$listing); |
|
} |
|
if ($listing_results[0] ne 'no_such_dir' && |
|
$listing_results[0] ne 'empty' && |
|
$listing_results[0] ne 'con_lost') { |
|
foreach (@listing_results) { |
my ($entry,@stat)=split(/&/,$_); |
my ($entry,@stat)=split(/&/,$_); |
$allusers{$entry}=1; |
$allusers{$entry}=1; |
} |
} |
Line 4376 sub EXT {
|
Line 4245 sub EXT {
|
if (defined($courseid) && $courseid eq $ENV{'request.course.id'}) { |
if (defined($courseid) && $courseid eq $ENV{'request.course.id'}) { |
if (!$symbparm) { $symbparm=&symbread(); } |
if (!$symbparm) { $symbparm=&symbread(); } |
} |
} |
|
my ($courselevelm,$courselevel); |
if ($symbparm && defined($courseid) && |
if ($symbparm && defined($courseid) && |
$courseid eq $ENV{'request.course.id'}) { |
$courseid eq $ENV{'request.course.id'}) { |
|
|
Line 4403 sub EXT {
|
Line 4273 sub EXT {
|
my $seclevelr=$courseid.'.['.$section.'].'.$symbparm; |
my $seclevelr=$courseid.'.['.$section.'].'.$symbparm; |
my $seclevelm=$courseid.'.['.$section.'].'.$mapparm; |
my $seclevelm=$courseid.'.['.$section.'].'.$mapparm; |
|
|
my $courselevel=$courseid.'.'.$spacequalifierrest; |
$courselevel=$courseid.'.'.$spacequalifierrest; |
my $courselevelr=$courseid.'.'.$symbparm; |
my $courselevelr=$courseid.'.'.$symbparm; |
my $courselevelm=$courseid.'.'.$mapparm; |
$courselevelm=$courseid.'.'.$mapparm; |
|
|
# ----------------------------------------------------------- first, check user |
# ----------------------------------------------------------- first, check user |
#most student don\'t have any data set, check if there is some data |
#most student don\'t have any data set, check if there is some data |
Line 4440 sub EXT {
|
Line 4310 sub EXT {
|
} |
} |
} |
} |
|
|
# -------------------------------------------------------- second, check course |
# ------------------------------------------------ second, check some of course |
|
|
my $coursereply=&courseresdata($ENV{'course.'.$courseid.'.num'}, |
my $coursereply=&courseresdata($ENV{'course.'.$courseid.'.num'}, |
$ENV{'course.'.$courseid.'.domain'}, |
$ENV{'course.'.$courseid.'.domain'}, |
($seclevelr,$seclevelm,$seclevel, |
($seclevelr,$seclevelm,$seclevel, |
$courselevelr,$courselevelm, |
$courselevelr)); |
$courselevel)); |
|
if (defined($coursereply)) { return $coursereply; } |
if (defined($coursereply)) { return $coursereply; } |
|
|
# ------------------------------------------------------ third, check map parms |
# ------------------------------------------------------ third, check map parms |
Line 4460 sub EXT {
|
Line 4329 sub EXT {
|
} |
} |
if ($thisparm) { return $thisparm; } |
if ($thisparm) { return $thisparm; } |
} |
} |
# --------------------------------------------- last, look in resource metadata |
# ------------------------------------------ fourth, look in resource metadata |
|
|
$spacequalifierrest=~s/\./\_/; |
$spacequalifierrest=~s/\./\_/; |
my $filename; |
my $filename; |
Line 4475 sub EXT {
|
Line 4344 sub EXT {
|
$metadata=&metadata($filename,'parameter_'.$spacequalifierrest); |
$metadata=&metadata($filename,'parameter_'.$spacequalifierrest); |
if (defined($metadata)) { return $metadata; } |
if (defined($metadata)) { return $metadata; } |
|
|
|
# ---------------------------------------------- fourth, look in rest pf course |
|
if ($symbparm && defined($courseid) && |
|
$courseid eq $ENV{'request.course.id'}) { |
|
my $coursereply=&courseresdata($ENV{'course.'.$courseid.'.num'}, |
|
$ENV{'course.'.$courseid.'.domain'}, |
|
($courselevelm,$courselevel)); |
|
if (defined($coursereply)) { return $coursereply; } |
|
} |
# ------------------------------------------------------------------ Cascade up |
# ------------------------------------------------------------------ Cascade up |
unless ($space eq '0') { |
unless ($space eq '0') { |
my @parts=split(/_/,$space); |
my @parts=split(/_/,$space); |
Line 4583 sub metadata {
|
Line 4460 sub metadata {
|
my %metathesekeys=(); |
my %metathesekeys=(); |
unless ($filename=~/\.meta$/) { $filename.='.meta'; } |
unless ($filename=~/\.meta$/) { $filename.='.meta'; } |
my $metastring; |
my $metastring; |
if ($uri !~ m|^uploaded/|) { |
if ($uri !~ m -^(uploaded|editupload)/-) { |
my $file=&filelocation('',&clutter($filename)); |
my $file=&filelocation('',&clutter($filename)); |
#push(@{$metaentry{$uri.'.file'}},$file); |
#push(@{$metaentry{$uri.'.file'}},$file); |
$metastring=&getfile($file); |
$metastring=&getfile($file); |
Line 4607 sub metadata {
|
Line 4484 sub metadata {
|
} else { |
} else { |
$metaentry{':packages'}=$package.$keyroot; |
$metaentry{':packages'}=$package.$keyroot; |
} |
} |
foreach (keys %packagetab) { |
foreach (sort keys %packagetab) { |
my $part=$keyroot; |
my $part=$keyroot; |
$part=~s/^\_//; |
$part=~s/^\_//; |
if ($_=~/^\Q$package\E\&/ || |
if ($_=~/^\Q$package\E\&/ || |
Line 4824 sub gettitle {
|
Line 4701 sub gettitle {
|
if (!$title) { $title=(split('/',$urlsymb))[-1]; } |
if (!$title) { $title=(split('/',$urlsymb))[-1]; } |
return $title; |
return $title; |
} |
} |
|
|
|
sub get_slot { |
|
my ($which,$cnum,$cdom)=@_; |
|
if (!$cnum || !$cdom) { |
|
(undef,my $courseid)=&Apache::lonxml::whichuser(); |
|
$cdom=$ENV{'course.'.$courseid.'.domain'}; |
|
$cnum=$ENV{'course.'.$courseid.'.num'}; |
|
} |
|
my %slotinfo=&get('slots',[$which],$cdom,$cnum); |
|
&Apache::lonhomework::showhash(%slotinfo); |
|
my ($tmp)=keys(%slotinfo); |
|
if ($tmp=~/^error:/) { return (); } |
|
return %{$slotinfo{$which}}; |
|
} |
# ------------------------------------------------- Update symbolic store links |
# ------------------------------------------------- Update symbolic store links |
|
|
sub symblist { |
sub symblist { |
Line 4835 sub symblist {
|
Line 4725 sub symblist {
|
if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db', |
if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db', |
&GDBM_WRCREAT(),0640)) { |
&GDBM_WRCREAT(),0640)) { |
foreach (keys %newhash) { |
foreach (keys %newhash) { |
$hash{declutter($_)}=$mapname.'___'.&deversion($newhash{$_}); |
$hash{declutter($_)}=&encode_symb($mapname,$newhash{$_}->[1], |
|
$newhash{$_}->[0]); |
} |
} |
if (untie(%hash)) { |
if (untie(%hash)) { |
return 'ok'; |
return 'ok'; |
Line 4925 sub decode_symb {
|
Line 4816 sub decode_symb {
|
|
|
sub fixversion { |
sub fixversion { |
my $fn=shift; |
my $fn=shift; |
if ($fn=~/^(adm|uploaded|public)/) { return $fn; } |
if ($fn=~/^(adm|uploaded|editupload|public)/) { return $fn; } |
my %bighash; |
my %bighash; |
my $uri=&clutter($fn); |
my $uri=&clutter($fn); |
my $key=$ENV{'request.course.id'}.'_'.$uri; |
my $key=$ENV{'request.course.id'}.'_'.$uri; |
Line 4979 sub symbread {
|
Line 4870 sub symbread {
|
my $syval=''; |
my $syval=''; |
if (($ENV{'request.course.fn'}) && ($thisfn)) { |
if (($ENV{'request.course.fn'}) && ($thisfn)) { |
my $targetfn = $thisfn; |
my $targetfn = $thisfn; |
if ( ($thisfn =~ m/^uploaded\//) && ($thisfn !~ m/\.(page|sequence)$/) ) { |
if ( ($thisfn =~ m/^(uploaded|editupload)\//) && ($thisfn !~ m/\.(page|sequence)$/) ) { |
$targetfn = 'adm/wrapper/'.$thisfn; |
$targetfn = 'adm/wrapper/'.$thisfn; |
} |
} |
if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db', |
if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db', |
Line 4989 sub symbread {
|
Line 4880 sub symbread {
|
} |
} |
# ---------------------------------------------------------- There was an entry |
# ---------------------------------------------------------- There was an entry |
if ($syval) { |
if ($syval) { |
unless ($syval=~/\_\d+$/) { |
#unless ($syval=~/\_\d+$/) { |
unless ($ENV{'form.request.prefix'}=~/\.(\d+)\_$/) { |
#unless ($ENV{'form.request.prefix'}=~/\.(\d+)\_$/) { |
&appenv('request.ambiguous' => $thisfn); |
#&appenv('request.ambiguous' => $thisfn); |
return $ENV{$cache_str}=''; |
#return $ENV{$cache_str}=''; |
} |
#} |
$syval.=$1; |
#$syval.=$1; |
} |
#} |
} else { |
} else { |
# ------------------------------------------------------- Was not in symb table |
# ------------------------------------------------------- Was not in symb table |
if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db', |
if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db', |
Line 5039 sub symbread {
|
Line 4930 sub symbread {
|
} |
} |
} |
} |
if ($syval) { |
if ($syval) { |
return $ENV{$cache_str}=&symbclean($syval.'___'.$thisfn); |
return $ENV{$cache_str}=$syval; |
|
#return $ENV{$cache_str}=&symbclean($syval.'___'.$thisfn); |
} |
} |
} |
} |
&appenv('request.ambiguous' => $thisfn); |
&appenv('request.ambiguous' => $thisfn); |
Line 5386 sub receipt {
|
Line 5278 sub receipt {
|
|
|
sub getfile { |
sub getfile { |
my ($file) = @_; |
my ($file) = @_; |
|
if ($file =~ m -^/*(uploaded|editupload)/-) { $file=&filelocation("",$file); } |
if ($file =~ m|^/*uploaded/|) { $file=&filelocation("",$file); } |
|
&repcopy($file); |
&repcopy($file); |
return &readfile($file); |
return &readfile($file); |
} |
} |
|
|
sub repcopy_userfile { |
sub repcopy_userfile { |
my ($file)=@_; |
my ($file)=@_; |
|
if ($file =~ m -^/*(uploaded|editupload)/-) { $file=&filelocation("",$file); } |
if ($file =~ m|^/*uploaded/|) { $file=&filelocation("",$file); } |
if ($file =~ m|^/home/httpd/html/lonUsers/|) { return 'ok'; } |
if ($file =~ m|^/home/httpd/html/lonUsers/|) { return OK; } |
|
|
|
my ($cdom,$cnum,$filename) = |
my ($cdom,$cnum,$filename) = |
($file=~m|^\Q$perlvar{'lonDocRoot'}\E/+userfiles/+([^/]+)/+([^/]+)/+(.*)|); |
($file=~m|^\Q$perlvar{'lonDocRoot'}\E/+userfiles/+([^/]+)/+([^/]+)/+(.*)|); |
my ($info,$rtncode); |
my ($info,$rtncode); |
Line 5420 sub repcopy_userfile {
|
Line 5309 sub repcopy_userfile {
|
return -1; |
return -1; |
} |
} |
if ($info < $fileinfo[9]) { |
if ($info < $fileinfo[9]) { |
return OK; |
return 'ok'; |
} |
} |
$info = ''; |
$info = ''; |
$lwpresp = &getuploaded('GET',$uri,$cdom,$cnum,\$info,\$rtncode); |
$lwpresp = &getuploaded('GET',$uri,$cdom,$cnum,\$info,\$rtncode); |
Line 5454 sub repcopy_userfile {
|
Line 5343 sub repcopy_userfile {
|
open(FILE,">$file"); |
open(FILE,">$file"); |
print FILE $info; |
print FILE $info; |
close(FILE); |
close(FILE); |
return OK; |
return 'ok'; |
} |
} |
|
|
sub tokenwrapper { |
sub tokenwrapper { |
Line 5505 sub readfile {
|
Line 5394 sub readfile {
|
} |
} |
|
|
sub filelocation { |
sub filelocation { |
my ($dir,$file) = @_; |
my ($dir,$file) = @_; |
my $location; |
my $location; |
$file=~ s/^\s*(\S+)\s*$/$1/; ## strip off leading and trailing spaces |
$file=~ s/^\s*(\S+)\s*$/$1/; ## strip off leading and trailing spaces |
if ($file=~m:^/~:) { # is a contruction space reference |
if ($file=~m:^/~:) { # is a contruction space reference |
$location = $file; |
$location = $file; |
$location =~ s:/~(.*?)/(.*):/home/$1/public_html/$2:; |
$location =~ s:/~(.*?)/(.*):/home/$1/public_html/$2:; |
} elsif ($file=~/^\/*uploaded/) { # is an uploaded file |
} elsif ($file=~/^\/*(uploaded|editupload)/) { # is an uploaded file |
my ($udom,$uname,$filename)= |
my ($udom,$uname,$filename)= |
($file=~m|^/+uploaded/+([^/]+)/+([^/]+)/+(.*)$|); |
($file=~m -^/+(?:uploaded|editupload)/+([^/]+)/+([^/]+)/+(.*)$-); |
my $home=&homeserver($uname,$udom); |
my $home=&homeserver($uname,$udom); |
my $is_me=0; |
my $is_me=0; |
my @ids=¤t_machine_ids(); |
my @ids=¤t_machine_ids(); |
foreach my $id (@ids) { if ($id eq $home) { $is_me=1; } } |
foreach my $id (@ids) { if ($id eq $home) { $is_me=1; } } |
if ($is_me) { |
if ($is_me) { |
$location=&Apache::loncommon::propath($udom,$uname). |
$location=&Apache::loncommon::propath($udom,$uname). |
'/userfiles/'.$filename; |
'/userfiles/'.$filename; |
} else { |
} else { |
$location=$Apache::lonnet::perlvar{'lonDocRoot'}.'/userfiles/'. |
$location=$Apache::lonnet::perlvar{'lonDocRoot'}.'/userfiles/'. |
$udom.'/'.$uname.'/'.$filename; |
$udom.'/'.$uname.'/'.$filename; |
} |
} |
} else { |
|
$file=~s/^\Q$perlvar{'lonDocRoot'}\E//; |
|
$file=~s:^/res/:/:; |
|
if ( !( $file =~ m:^/:) ) { |
|
$location = $dir. '/'.$file; |
|
} else { |
} else { |
$location = '/home/httpd/html/res'.$file; |
$file=~s/^\Q$perlvar{'lonDocRoot'}\E//; |
|
$file=~s:^/res/:/:; |
|
if ( !( $file =~ m:^/:) ) { |
|
$location = $dir. '/'.$file; |
|
} else { |
|
$location = '/home/httpd/html/res'.$file; |
|
} |
} |
} |
} |
$location=~s://+:/:g; # remove duplicate / |
$location=~s://+:/:g; # remove duplicate / |
while ($location=~m:/\.\./:) {$location=~ s:/[^/]+/\.\./:/:g;} #remove dir/.. |
while ($location=~m:/\.\./:) {$location=~ s:/[^/]+/\.\./:/:g;} #remove dir/.. |
while ($location=~m:/\./:) {$location=~ s:/\./:/:g;} #remove /./ |
while ($location=~m:/\./:) {$location=~ s:/\./:/:g;} #remove /./ |
return $location; |
return $location; |
|
} |
} |
|
|
sub hreflocation { |
sub hreflocation { |
Line 5595 sub declutter {
|
Line 5484 sub declutter {
|
|
|
sub clutter { |
sub clutter { |
my $thisfn='/'.&declutter(shift); |
my $thisfn='/'.&declutter(shift); |
unless ($thisfn=~/^\/(uploaded|adm|userfiles|ext|raw|priv|public)\//) { |
unless ($thisfn=~/^\/(uploaded|editupload|adm|userfiles|ext|raw|priv|public)\//) { |
$thisfn='/res'.$thisfn; |
$thisfn='/res'.$thisfn; |
} |
} |
return $thisfn; |
return $thisfn; |
Line 5656 sub goodbye {
|
Line 5545 sub goodbye {
|
&logthis(sprintf("%-20s is %s",'%badServerCache',length(&freeze(\%badServerCache)))); |
&logthis(sprintf("%-20s is %s",'%badServerCache',length(&freeze(\%badServerCache)))); |
#converted |
#converted |
# &logthis(sprintf("%-20s is %s",'%metacache',scalar(%metacache))); |
# &logthis(sprintf("%-20s is %s",'%metacache',scalar(%metacache))); |
# &logthis(sprintf("%-20s is %s",'%homecache',length(&freeze(\%homecache)))); |
&logthis(sprintf("%-20s is %s",'%homecache',length(&freeze(\%homecache)))); |
# &logthis(sprintf("%-20s is %s",'%titlecache',length(&freeze(\%titlecache)))); |
# &logthis(sprintf("%-20s is %s",'%titlecache',length(&freeze(\%titlecache)))); |
# &logthis(sprintf("%-20s is %s",'%courseresdatacache',length(&freeze(\%courseresdatacache)))); |
# &logthis(sprintf("%-20s is %s",'%courseresdatacache',length(&freeze(\%courseresdatacache)))); |
#1.1 only |
#1.1 only |
Line 5737 BEGIN {
|
Line 5626 BEGIN {
|
while (my $configline=<$config>) { |
while (my $configline=<$config>) { |
next if ($configline =~ /^(\#|\s*$)/); |
next if ($configline =~ /^(\#|\s*$)/); |
chomp($configline); |
chomp($configline); |
my ($id,$domain,$role,$name,$ip,$domdescr)=split(/:/,$configline); |
my ($id,$domain,$role,$name)=split(/:/,$configline); |
if ($id && $domain && $role && $name && $ip) { |
$name=~s/\s//g; |
|
if ($id && $domain && $role && $name) { |
$hostname{$id}=$name; |
$hostname{$id}=$name; |
$hostdom{$id}=$domain; |
$hostdom{$id}=$domain; |
$hostip{$id}=$ip; |
|
$iphost{$ip}=$id; |
|
if ($role eq 'library') { $libserv{$id}=$name; } |
if ($role eq 'library') { $libserv{$id}=$name; } |
} |
} |
} |
} |
close($config); |
close($config); |
} |
} |
|
|
|
sub get_iphost { |
|
if (%iphost) { return %iphost; } |
|
foreach my $id (keys(%hostname)) { |
|
my $name=$hostname{$id}; |
|
my $ip = gethostbyname($name); |
|
if (!$ip || length($ip) ne 4) { |
|
&logthis("Skipping host $id name $name no IP found\n"); |
|
next; |
|
} |
|
$ip=inet_ntoa($ip); |
|
push(@{$iphost{$ip}},$id); |
|
} |
|
return %iphost; |
|
} |
|
|
# ------------------------------------------------------ Read spare server file |
# ------------------------------------------------------ Read spare server file |
{ |
{ |
open(my $config,"<$perlvar{'lonTabDir'}/spare.tab"); |
open(my $config,"<$perlvar{'lonTabDir'}/spare.tab"); |
Line 6257 subscribe($fname) : subscribe to a resou
|
Line 6160 subscribe($fname) : subscribe to a resou
|
|
|
repcopy($filename) : subscribes to the requested file, and attempts to |
repcopy($filename) : subscribes to the requested file, and attempts to |
replicate from the owning library server, Might return |
replicate from the owning library server, Might return |
HTTP_SERVICE_UNAVAILABLE, HTTP_NOT_FOUND, FORBIDDEN, OK, or |
'unavailable', 'not_found', 'forbidden', 'ok', or |
HTTP_BAD_REQUEST, also attempts to grab the metadata for the |
'bad_request', also attempts to grab the metadata for the |
resource. Expects the local filesystem pathname |
resource. Expects the local filesystem pathname |
(/home/httpd/html/res/....) |
(/home/httpd/html/res/....) |
|
|
Line 6600 declutter() : declutters URLs (remove do
|
Line 6503 declutter() : declutters URLs (remove do
|
|
|
=back |
=back |
|
|
|
=head2 Usererfile file routines (/uploaded*) |
|
|
|
=over 4 |
|
|
|
=item * |
|
|
|
userfileupload(): main rotine for putting a file in a user or course's |
|
filespace, arguments are, |
|
|
|
formname - required - this is the name of the element in $ENV where the |
|
filename, and the contents of the file to create/modifed exist |
|
the filename is in $ENV{'form.'.$formname.'.filename'} and the |
|
contents of the file is located in $ENV{'form.'.$formname} |
|
coursedoc - if true, store the file in the course of the active role |
|
of the current user |
|
subdir - required - subdirectory to put the file in under ../userfiles/ |
|
if undefined, it will be placed in "unknown" |
|
|
|
(This routine calls clean_filename() to remove any dangerous |
|
characters from the filename, and then calls finuserfileupload() to |
|
complete the transaction) |
|
|
|
returns either the url of the uploaded file (/uploaded/....) if successful |
|
and /adm/notfound.html if unsuccessful |
|
|
|
=item * |
|
|
|
clean_filename(): routine for cleaing a filename up for storage in |
|
userfile space, argument is: |
|
|
|
filename - proposed filename |
|
|
|
returns: the new clean filename |
|
|
|
=item * |
|
|
|
finishuserfileupload(): routine that creaes and sends the file to |
|
userspace, probably shouldn't be called directly |
|
|
|
docuname: username or courseid of destination for the file |
|
docudom: domain of user/course of destination for the file |
|
docuhome: loncapa id of the library server that is getting the file |
|
formname: same as for userfileupload() |
|
fname: filename (inculding subdirectories) for the file |
|
|
|
returns either the url of the uploaded file (/uploaded/....) if successful |
|
and /adm/notfound.html if unsuccessful |
|
|
|
=item * |
|
|
|
renameuserfile(): renames an existing userfile to a new name |
|
|
|
Args: |
|
docuname: username or courseid of destination for the file |
|
docudom: domain of user/course of destination for the file |
|
old: current file name (including any subdirs under userfiles) |
|
new: desired file name (including any subdirs under userfiles) |
|
|
|
=item * |
|
|
|
mkdiruserfile(): creates a directory is a userfiles dir |
|
|
|
Args: |
|
docuname: username or courseid of destination for the file |
|
docudom: domain of user/course of destination for the file |
|
dir: dir to create (including any subdirs under userfiles) |
|
|
|
=item * |
|
|
|
removeuserfile(): removes a file that exists in userfiles |
|
|
|
Args: |
|
docuname: username or courseid of destination for the file |
|
docudom: domain of user/course of destination for the file |
|
fname: filname to delete (including any subdirs under userfiles) |
|
|
|
=item * |
|
|
|
removeuploadedurl(): convience function for removeuserfile() |
|
|
|
Args: |
|
url: a full /uploaded/... url to delete |
|
|
|
=back |
|
|
=head2 HTTP Helper Routines |
=head2 HTTP Helper Routines |
|
|
=over 4 |
=over 4 |