version 1.542, 2004/09/17 02:40:35
|
version 1.564, 2004/11/08 19:19:12
|
Line 39 qw(%perlvar %hostname %homecache %badSer
|
Line 39 qw(%perlvar %hostname %homecache %badSer
|
%libserv %pr %prp %metacache %packagetab %titlecache %courseresversioncache %resversioncache |
%libserv %pr %prp %metacache %packagetab %titlecache %courseresversioncache %resversioncache |
%courselogs %accesshash %userrolehash $processmarker $dumpcount |
%courselogs %accesshash %userrolehash $processmarker $dumpcount |
%coursedombuf %coursenumbuf %coursehombuf %coursedescrbuf %courseinstcodebuf %courseresdatacache |
%coursedombuf %coursenumbuf %coursehombuf %coursedescrbuf %courseinstcodebuf %courseresdatacache |
%userresdatacache %usectioncache %domaindescription %domain_auth_def %domain_auth_arg_def |
%userresdatacache %getsectioncache %domaindescription %domain_auth_def %domain_auth_arg_def |
%domain_lang_def %domain_city %domain_longi %domain_lati $tmpdir); |
%domain_lang_def %domain_city %domain_longi %domain_lati $tmpdir $_64bit); |
|
|
use IO::Socket; |
use IO::Socket; |
use GDBM_File; |
use GDBM_File; |
use Apache::Constants qw(:common :http); |
use Apache::Constants qw(:common :http); |
use HTML::LCParser; |
use HTML::LCParser; |
use Fcntl qw(:flock); |
use Fcntl qw(:flock); |
use Apache::loncoursedata; |
|
use Apache::lonlocal; |
use Apache::lonlocal; |
use Storable qw(lock_store lock_nstore lock_retrieve freeze thaw); |
use Storable qw(lock_store lock_nstore lock_retrieve freeze thaw nfreeze); |
use Time::HiRes qw( gettimeofday tv_interval ); |
use Time::HiRes qw( gettimeofday tv_interval ); |
my $readit; |
my $readit; |
|
my $max_connection_retries = 10; # Or some such value. |
|
|
=pod |
=pod |
|
|
Line 116 sub logperm {
|
Line 116 sub logperm {
|
sub subreply { |
sub subreply { |
my ($cmd,$server)=@_; |
my ($cmd,$server)=@_; |
my $peerfile="$perlvar{'lonSockDir'}/$server"; |
my $peerfile="$perlvar{'lonSockDir'}/$server"; |
my $client=IO::Socket::UNIX->new(Peer =>"$peerfile", |
# |
Type => SOCK_STREAM, |
# With loncnew process trimming, there's a timing hole between lonc server |
Timeout => 10) |
# process exit and the master server picking up the listen on the AF_UNIX |
or return "con_lost"; |
# socket. In that time interval, a lock file will exist: |
print $client "$cmd\n"; |
|
my $answer=<$client>; |
my $lockfile=$peerfile.".lock"; |
if (!$answer) { $answer="con_lost"; } |
while (-e $lockfile) { # Need to wait for the lockfile to disappear. |
chomp($answer); |
sleep(1); |
|
} |
|
# At this point, either a loncnew parent is listening or an old lonc |
|
# or loncnew child is listening so we can connect or everything's dead. |
|
# |
|
# We'll give the connection a few tries before abandoning it. If |
|
# connection is not possible, we'll con_lost back to the client. |
|
# |
|
my $client; |
|
for (my $retries = 0; $retries < $max_connection_retries; $retries++) { |
|
$client=IO::Socket::UNIX->new(Peer =>"$peerfile", |
|
Type => SOCK_STREAM, |
|
Timeout => 10); |
|
if($client) { |
|
last; # Connected! |
|
} |
|
sleep(1); # Try again later if failed connection. |
|
} |
|
my $answer; |
|
if ($client) { |
|
print $client "$cmd\n"; |
|
$answer=<$client>; |
|
if (!$answer) { $answer="con_lost"; } |
|
chomp($answer); |
|
} else { |
|
$answer = 'con_lost'; # Failed connection. |
|
} |
return $answer; |
return $answer; |
} |
} |
|
|
Line 434 sub overloaderror {
|
Line 460 sub overloaderror {
|
if ($overload>0) { |
if ($overload>0) { |
$r->err_headers_out->{'Retry-After'}=$overload; |
$r->err_headers_out->{'Retry-After'}=$overload; |
$r->log_error('Overload of '.$overload.' on '.$checkserver); |
$r->log_error('Overload of '.$overload.' on '.$checkserver); |
return 409; |
return 413; |
} |
} |
return ''; |
return ''; |
} |
} |
Line 771 sub getsection {
|
Line 797 sub getsection {
|
my ($udom,$unam,$courseid)=@_; |
my ($udom,$unam,$courseid)=@_; |
$courseid=~s/\_/\//g; |
$courseid=~s/\_/\//g; |
$courseid=~s/^(\w)/\/$1/; |
$courseid=~s/^(\w)/\/$1/; |
|
|
|
my $hashid="$udom:$unam:$courseid"; |
|
my ($result,$cached)=&is_cached(\%getsectioncache,$hashid,'getsection'); |
|
if (defined($cached)) { return $result; } |
|
|
my %Pending; |
my %Pending; |
my %Expired; |
my %Expired; |
# |
# |
Line 795 sub getsection {
|
Line 826 sub getsection {
|
if ($key eq $courseid.'_st') { $section=''; } |
if ($key eq $courseid.'_st') { $section=''; } |
my ($dummy,$end,$start)=split(/\_/,&unescape($value)); |
my ($dummy,$end,$start)=split(/\_/,&unescape($value)); |
my $now=time; |
my $now=time; |
if (defined($end) && ($now > $end)) { |
if (defined($end) && $end && ($now > $end)) { |
$Expired{$end}=$section; |
$Expired{$end}=$section; |
next; |
next; |
} |
} |
if (defined($start) && ($now < $start)) { |
if (defined($start) && $start && ($now < $start)) { |
$Pending{$start}=$section; |
$Pending{$start}=$section; |
next; |
next; |
} |
} |
return $section; |
return &do_cache(\%getsectioncache,$hashid,$section,'getsection'); |
} |
} |
# |
# |
# Presumedly there will be few matching roles from the above |
# Presumedly there will be few matching roles from the above |
# loop and the sorting time will be negligible. |
# loop and the sorting time will be negligible. |
if (scalar(keys(%Pending))) { |
if (scalar(keys(%Pending))) { |
my ($time) = sort {$a <=> $b} keys(%Pending); |
my ($time) = sort {$a <=> $b} keys(%Pending); |
return $Pending{$time}; |
return &do_cache(\%getsectioncache,$hashid,$Pending{$time},'getsection'); |
} |
} |
if (scalar(keys(%Expired))) { |
if (scalar(keys(%Expired))) { |
my @sorted = sort {$a <=> $b} keys(%Expired); |
my @sorted = sort {$a <=> $b} keys(%Expired); |
my $time = pop(@sorted); |
my $time = pop(@sorted); |
return $Expired{$time}; |
return &do_cache(\%getsectioncache,$hashid,$Expired{$time},'getsection'); |
} |
} |
return '-1'; |
return &do_cache(\%getsectioncache,$hashid,'-1','getsection'); |
} |
} |
|
|
|
|
my $disk_caching_disabled=0; |
my $disk_caching_disabled=1; |
|
|
sub devalidate_cache { |
sub devalidate_cache { |
my ($cache,$id,$name) = @_; |
my ($cache,$id,$name) = @_; |
delete $$cache{$id.'.time'}; |
delete $$cache{$id.'.time'}; |
|
delete $$cache{$id.'.file'}; |
delete $$cache{$id}; |
delete $$cache{$id}; |
if (1 || $disk_caching_disabled) { return; } |
if (1 || $disk_caching_disabled) { return; } |
my $filename=$perlvar{'lonDaemons'}.'/tmp/lonnet_internal_cache_'.$name.".db"; |
my $filename=$perlvar{'lonDaemons'}.'/tmp/lonnet_internal_cache_'.$name.".db"; |
Line 864 sub is_cached {
|
Line 896 sub is_cached {
|
return (undef,undef); |
return (undef,undef); |
} else { |
} else { |
if (time-($$cache{$id.'.time'})>$time) { |
if (time-($$cache{$id.'.time'})>$time) { |
# &logthis("Devalidating $id - ".time-($$cache{$id.'.time'})); |
if (exists($$cache{$id.'.file'})) { |
&devalidate_cache($cache,$id,$name); |
foreach my $filename (@{ $$cache{$id.'.file'} }) { |
return (undef,undef); |
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); |
return ($$cache{$id},1); |
Line 910 sub save_cache {
|
Line 958 sub save_cache {
|
eval <<'EVALBLOCK'; |
eval <<'EVALBLOCK'; |
$hash{$id.'.time'}=$$cache{$id.'.time'}; |
$hash{$id.'.time'}=$$cache{$id.'.time'}; |
$hash{$id}=freeze({'item'=>$$cache{$id}}); |
$hash{$id}=freeze({'item'=>$$cache{$id}}); |
|
if (exists($$cache{$id.'.file'})) { |
|
$hash{$id.'.file'}=freeze({'item'=>$$cache{$id.'.file'}}); |
|
} |
EVALBLOCK |
EVALBLOCK |
if ($@) { |
if ($@) { |
&logthis("<font color='red'>save_cache blew up :$@:$name</font>"); |
&logthis("<font color='red'>save_cache blew up :$@:$name</font>"); |
Line 960 sub load_cache_item {
|
Line 1011 sub load_cache_item {
|
} else { |
} else { |
if (($$cache{$id.'.time'}+$time) < time) { |
if (($$cache{$id.'.time'}+$time) < time) { |
$$cache{$id.'.time'}=$hash{$id.'.time'}; |
$$cache{$id.'.time'}=$hash{$id.'.time'}; |
my $hashref=thaw($hash{$id}); |
{ |
$$cache{$id}=$hashref->{'item'}; |
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 |
EVALBLOCK |
Line 982 EVALBLOCK
|
Line 1039 EVALBLOCK
|
# &logthis("load_cache_item $name took ".(&Time::HiRes::time()-$starttime)); |
# &logthis("load_cache_item $name took ".(&Time::HiRes::time()-$starttime)); |
} |
} |
|
|
sub usection { |
|
my ($udom,$unam,$courseid)=@_; |
|
my $hashid="$udom:$unam:$courseid"; |
|
|
|
my ($result,$cached)=&is_cached(\%usectioncache,$hashid,'usection'); |
|
if (defined($cached)) { return $result; } |
|
$courseid=~s/\_/\//g; |
|
$courseid=~s/^(\w)/\/$1/; |
|
foreach (split(/\&/,&reply('dump:'.$udom.':'.$unam.':roles', |
|
&homeserver($unam,$udom)))) { |
|
my ($key,$value)=split(/\=/,$_); |
|
$key=&unescape($key); |
|
if ($key=~/^\Q$courseid\E(?:\/)*(\w+)*\_st$/) { |
|
my $section=$1; |
|
if ($key eq $courseid.'_st') { $section=''; } |
|
my ($dummy,$end,$start)=split(/\_/,&unescape($value)); |
|
my $now=time; |
|
my $notactive=0; |
|
if ($start) { |
|
if ($now<$start) { $notactive=1; } |
|
} |
|
if ($end) { |
|
if ($now>$end) { $notactive=1; } |
|
} |
|
unless ($notactive) { |
|
return &do_cache(\%usectioncache,$hashid,$section,'usection'); |
|
} |
|
} |
|
} |
|
return &do_cache(\%usectioncache,$hashid,'-1','usection'); |
|
} |
|
|
|
# ------------------------------------- Read an entry from a user's environment |
# ------------------------------------- Read an entry from a user's environment |
|
|
sub userenvironment { |
sub userenvironment { |
Line 1847 sub devalidate {
|
Line 1872 sub devalidate {
|
# - the student level sheet of this user in course's homespace |
# - the student level sheet of this user in course's homespace |
# - the assessment level sheet for this resource |
# - the assessment level sheet for this resource |
# for this user in user's homespace |
# for this user in user's homespace |
|
# - current conditional state info |
my $key=$uname.':'.$udom.':'; |
my $key=$uname.':'.$udom.':'; |
my $status= |
my $status= |
&del('nohist_calculatedsheets', |
&del('nohist_calculatedsheets', |
Line 1861 sub devalidate {
|
Line 1887 sub devalidate {
|
$uname.' at '.$udom.' for '. |
$uname.' at '.$udom.' for '. |
$symb.': '.$status); |
$symb.': '.$status); |
} |
} |
|
&delenv('user.state.'.$cid); |
} |
} |
} |
} |
|
|
Line 2442 sub rolesinit {
|
Line 2469 sub rolesinit {
|
my $author=0; |
my $author=0; |
foreach (keys %allroles) { |
foreach (keys %allroles) { |
%thesepriv=(); |
%thesepriv=(); |
if (($_!~/^st/) && ($_!~/^ta/) && ($_!~/^cm/)) { $adv=1; } |
|
if (($_=~/^au/) || ($_=~/^ca/)) { $author=1; } |
if (($_=~/^au/) || ($_=~/^ca/)) { $author=1; } |
foreach (split(/:/,$allroles{$_})) { |
foreach (split(/:/,$allroles{$_})) { |
if ($_ ne '') { |
if ($_ ne '') { |
Line 2454 sub rolesinit {
|
Line 2480 sub rolesinit {
|
$thesepriv{$privilege}.=$restrictions; |
$thesepriv{$privilege}.=$restrictions; |
} |
} |
} |
} |
|
if ($thesepriv{'adv'} eq 'F') { $adv=1; } |
} |
} |
} |
} |
$thesestr=''; |
$thesestr=''; |
Line 2488 sub get {
|
Line 2515 sub get {
|
my %returnhash=(); |
my %returnhash=(); |
my $i=0; |
my $i=0; |
foreach (@$storearr) { |
foreach (@$storearr) { |
$returnhash{$_}=unescape($pairs[$i]); |
$returnhash{$_}=&thaw_unescape($pairs[$i]); |
$i++; |
$i++; |
} |
} |
return %returnhash; |
return %returnhash; |
Line 2527 sub dump {
|
Line 2554 sub dump {
|
my %returnhash=(); |
my %returnhash=(); |
foreach (@pairs) { |
foreach (@pairs) { |
my ($key,$value)=split(/=/,$_); |
my ($key,$value)=split(/=/,$_); |
$returnhash{unescape($key)}=unescape($value); |
$returnhash{unescape($key)}=&thaw_unescape($value); |
} |
} |
return %returnhash; |
return %returnhash; |
} |
} |
Line 2573 sub currentdump {
|
Line 2600 sub currentdump {
|
my ($key,$value)=split(/=/,$_); |
my ($key,$value)=split(/=/,$_); |
my ($symb,$param) = split(/:/,$key); |
my ($symb,$param) = split(/:/,$key); |
$returnhash{&unescape($symb)}->{&unescape($param)} = |
$returnhash{&unescape($symb)}->{&unescape($param)} = |
&unescape($value); |
&thaw_unescape($value); |
} |
} |
} |
} |
return %returnhash; |
return %returnhash; |
Line 2639 sub put {
|
Line 2666 sub put {
|
my $uhome=&homeserver($uname,$udomain); |
my $uhome=&homeserver($uname,$udomain); |
my $items=''; |
my $items=''; |
foreach (keys %$storehash) { |
foreach (keys %$storehash) { |
$items.=&escape($_).'='.&escape($$storehash{$_}).'&'; |
$items.=&escape($_).'='.&freeze_escape($$storehash{$_}).'&'; |
} |
} |
$items=~s/\&$//; |
$items=~s/\&$//; |
return &reply("put:$udomain:$uname:$namespace:$items",$uhome); |
return &reply("put:$udomain:$uname:$namespace:$items",$uhome); |
Line 2678 sub cput {
|
Line 2705 sub cput {
|
my $uhome=&homeserver($uname,$udomain); |
my $uhome=&homeserver($uname,$udomain); |
my $items=''; |
my $items=''; |
foreach (keys %$storehash) { |
foreach (keys %$storehash) { |
$items.=escape($_).'='.escape($$storehash{$_}).'&'; |
$items.=escape($_).'='.&freeze_escape($$storehash{$_}).'&'; |
} |
} |
$items=~s/\&$//; |
$items=~s/\&$//; |
return &critical("put:$udomain:$uname:$namespace:$items",$uhome); |
return &critical("put:$udomain:$uname:$namespace:$items",$uhome); |
Line 2701 sub eget {
|
Line 2728 sub eget {
|
my %returnhash=(); |
my %returnhash=(); |
my $i=0; |
my $i=0; |
foreach (@$storearr) { |
foreach (@$storearr) { |
$returnhash{$_}=unescape($pairs[$i]); |
$returnhash{$_}=&thaw_unescape($pairs[$i]); |
$i++; |
$i++; |
} |
} |
return %returnhash; |
return %returnhash; |
Line 2748 sub allowed {
|
Line 2775 sub allowed {
|
$uri=&deversion($uri); |
$uri=&deversion($uri); |
my $orguri=$uri; |
my $orguri=$uri; |
$uri=&declutter($uri); |
$uri=&declutter($uri); |
|
|
|
|
|
|
if (defined($ENV{'allowed.'.$priv})) { return $ENV{'allowed.'.$priv}; } |
if (defined($ENV{'allowed.'.$priv})) { return $ENV{'allowed.'.$priv}; } |
# Free bre access to adm and meta resources |
# Free bre access to adm and meta resources |
if (((($uri=~/^adm\//) && ($uri !~ m|/bulletinboard$|)) |
if (((($uri=~/^adm\//) && ($uri !~ m|/bulletinboard$|)) |
Line 2756 sub allowed {
|
Line 2785 sub allowed {
|
return 'F'; |
return 'F'; |
} |
} |
|
|
|
# Free bre access to user's own portfolio contents |
|
my ($space,$domain,$name,$dir)=split('/',$uri); |
|
if (('uploaded' eq $space) && ($ENV{'user.name'} eq $name) && |
|
($ENV{'user.domain'} eq $domain) && ('portfolio' eq $dir)) { |
|
return 'F'; |
|
} |
|
|
# Free bre to public access |
# Free bre to public access |
|
|
if ($priv eq 'bre') { |
if ($priv eq 'bre') { |
Line 3157 sub log_query {
|
Line 3193 sub log_query {
|
sub fetch_enrollment_query { |
sub fetch_enrollment_query { |
my ($context,$affiliatesref,$replyref,$dom,$cnum) = @_; |
my ($context,$affiliatesref,$replyref,$dom,$cnum) = @_; |
my $homeserver; |
my $homeserver; |
|
my $maxtries = 1; |
if ($context eq 'automated') { |
if ($context eq 'automated') { |
$homeserver = $perlvar{'lonHostID'}; |
$homeserver = $perlvar{'lonHostID'}; |
|
$maxtries = 10; # will wait for up to 2000s for retrieval of classlist data before timeout |
} else { |
} else { |
$homeserver = &homeserver($cnum,$dom); |
$homeserver = &homeserver($cnum,$dom); |
} |
} |
Line 3176 sub fetch_enrollment_query {
|
Line 3214 sub fetch_enrollment_query {
|
return 'error: '.$queryid; |
return 'error: '.$queryid; |
} |
} |
my $reply = &get_query_reply($queryid); |
my $reply = &get_query_reply($queryid); |
|
my $tries = 1; |
|
while (($reply=~/^timeout/) && ($tries < $maxtries)) { |
|
$reply = &get_query_reply($queryid); |
|
$tries ++; |
|
} |
if ( ($reply =~/^timeout/) || ($reply =~/^error/) ) { |
if ( ($reply =~/^timeout/) || ($reply =~/^error/) ) { |
&logthis('fetch_enrollment_query error: '.$reply.' for '.$dom.' '.$ENV{'user.name'}.' for '.$queryid.' context: '.$context.' '.$cnum); |
&logthis('fetch_enrollment_query error: '.$reply.' for '.$dom.' '.$ENV{'user.name'}.' for '.$queryid.' context: '.$context.' '.$cnum.' maxtries: '.$maxtries.' tries: '.$tries); |
} else { |
} else { |
my @responses = split/:/,$reply; |
my @responses = split/:/,$reply; |
if ($homeserver eq $perlvar{'lonHostID'}) { |
if ($homeserver eq $perlvar{'lonHostID'}) { |
Line 3584 sub modify_student_enrollment {
|
Line 3627 sub modify_student_enrollment {
|
$gene = $tmp{'generation'} if (!defined($gene) || $gene eq ''); |
$gene = $tmp{'generation'} if (!defined($gene) || $gene eq ''); |
$uid = $tmp{'id'} if (!defined($uid) || $uid eq ''); |
$uid = $tmp{'id'} if (!defined($uid) || $uid eq ''); |
} |
} |
my $fullname = &Apache::loncoursedata::ProcessFullName($last,$gene, |
my $fullname = &format_name($first,$middle,$last,$gene,'lastname'); |
$first,$middle); |
|
my $reply=cput('classlist', |
my $reply=cput('classlist', |
{"$uname:$udom" => |
{"$uname:$udom" => |
join(':',$end,$start,$uid,$usec,$fullname,$type,$locktype) }, |
join(':',$end,$start,$uid,$usec,$fullname,$type,$locktype) }, |
Line 3602 sub modify_student_enrollment {
|
Line 3644 sub modify_student_enrollment {
|
return &assignrole($udom,$uname,$uurl,'st',$end,$start); |
return &assignrole($udom,$uname,$uurl,'st',$end,$start); |
} |
} |
|
|
|
sub format_name { |
|
my ($firstname,$middlename,$lastname,$generation,$first)=@_; |
|
my $name; |
|
if ($first ne 'lastname') { |
|
$name=$firstname.' '.$middlename.' '.$lastname.' '.$generation; |
|
} else { |
|
if ($lastname=~/\S/) { |
|
$name.= $lastname.' '.$generation.', '.$firstname.' '.$middlename; |
|
$name=~s/\s+,/,/; |
|
} else { |
|
$name.= $firstname.' '.$middlename.' '.$generation; |
|
} |
|
} |
|
$name=~s/^\s+//; |
|
$name=~s/\s+$//; |
|
$name=~s/\s+/ /g; |
|
return $name; |
|
} |
|
|
# ------------------------------------------------- Write to course preferences |
# ------------------------------------------------- Write to course preferences |
|
|
sub writecoursepref { |
sub writecoursepref { |
Line 3720 sub diskusage {
|
Line 3781 sub diskusage {
|
return $listing; |
return $listing; |
} |
} |
|
|
|
# ------------------------------------------------------------- Mark as Read Only |
|
|
|
sub mark_as_readonly { |
|
my ($domain,$user,$files,$what) = @_; |
|
my %current_permissions = &Apache::lonnet::dump('file_permissions',$domain,$user); |
|
foreach my $file (@{$files}) { |
|
push(@{$current_permissions{$file}},$what); |
|
} |
|
&Apache::lonnet::put('file_permissions',\%current_permissions,$domain,$user); |
|
return; |
|
} |
|
|
|
#--------------------------------------------------------------Get Marked as Read Only |
|
|
|
sub get_marked_as_readonly { |
|
my ($domain,$user,$what) = @_; |
|
my %current_permissions = &Apache::lonnet::dump('file_permissions',$domain,$user); |
|
my @readonly_files; |
|
while (my ($file_name,$value) = each(%current_permissions)) { |
|
&logthis("found $file_name"); |
|
if (ref($value) eq "ARRAY"){ |
|
&logthis("found array"); |
|
foreach my $stored_what (@{$value}) { |
|
if ($stored_what eq $what) { |
|
push(@readonly_files, $file_name); |
|
&logthis("defined pushed $file_name"); |
|
} elsif (!defined($what)) { |
|
push(@readonly_files, $file_name); |
|
&logthis("undef pushed $file_name"); |
|
} |
|
} |
|
} |
|
} |
|
return @readonly_files; |
|
} |
|
|
|
# ------------------------------------------------------------ Unmark as Read Only |
|
|
|
sub unmark_as_readonly { |
|
# unmarks all files locked by $what |
|
# for portfolio submissions, $what contains $crsid and $symb |
|
my ($domain,$user,$what) = @_; |
|
my %current_permissions = &Apache::lonnet::dump('file_permissions',$domain,$user); |
|
my @readonly_files = &Apache::lonnet::get_marked_as_readonly($domain,$user,$what); |
|
foreach my $file(@readonly_files){ |
|
my $current_locks = $current_permissions{$file}; |
|
my @new_locks; |
|
my @del_keys; |
|
if (ref($current_locks) eq "ARRAY"){ |
|
foreach my $locker (@{$current_locks}) { |
|
unless ($locker eq $what) { |
|
push(@new_locks, $what); |
|
} |
|
} |
|
if (@new_locks > 0) { |
|
$current_permissions{$file} = \@new_locks; |
|
} else { |
|
push(@del_keys, $file); |
|
&Apache::lonnet::del('file_permissions',\@del_keys, $domain, $user); |
|
delete $current_permissions{$file}; |
|
} |
|
} |
|
} |
|
&Apache::lonnet::put('file_permissions',\%current_permissions,$domain,$user); |
|
return; |
|
} |
|
|
# ------------------------------------------------------------ Directory lister |
# ------------------------------------------------------------ Directory lister |
|
|
Line 3829 sub GetFileTimestamp {
|
Line 3956 sub GetFileTimestamp {
|
|
|
sub directcondval { |
sub directcondval { |
my $number=shift; |
my $number=shift; |
|
if (!defined($ENV{'user.state.'.$ENV{'request.course.id'}})) { |
|
&Apache::lonuserstate::evalstate(); |
|
} |
if ($ENV{'user.state.'.$ENV{'request.course.id'}}) { |
if ($ENV{'user.state.'.$ENV{'request.course.id'}}) { |
return substr($ENV{'user.state.'.$ENV{'request.course.id'}},$number,1); |
return substr($ENV{'user.state.'.$ENV{'request.course.id'}},$number,1); |
} else { |
} else { |
Line 4073 sub EXT {
|
Line 4203 sub EXT {
|
$section=$ENV{'request.course.sec'}; |
$section=$ENV{'request.course.sec'}; |
} else { |
} else { |
if (! defined($usection)) { |
if (! defined($usection)) { |
$section=&usection($udom,$uname,$courseid); |
$section=&getsection($udom,$uname,$courseid); |
} else { |
} else { |
$section = $usection; |
$section = $usection; |
} |
} |
Line 4262 sub metadata {
|
Line 4392 sub metadata {
|
unless ($filename=~/\.meta$/) { $filename.='.meta'; } |
unless ($filename=~/\.meta$/) { $filename.='.meta'; } |
my $metastring; |
my $metastring; |
if ($uri !~ m|^uploaded/|) { |
if ($uri !~ m|^uploaded/|) { |
$metastring=&getfile(&filelocation('',&clutter($filename))); |
my $file=&filelocation('',&clutter($filename)); |
|
push(@{$metacache{$uri.'.file'}},$file); |
|
$metastring=&getfile($file); |
} |
} |
my $parser=HTML::LCParser->new(\$metastring); |
my $parser=HTML::LCParser->new(\$metastring); |
my $token; |
my $token; |
Line 4726 sub numval {
|
Line 4858 sub numval {
|
$txt=~tr/U-Z/0-5/; |
$txt=~tr/U-Z/0-5/; |
$txt=~tr/u-z/0-5/; |
$txt=~tr/u-z/0-5/; |
$txt=~s/\D//g; |
$txt=~s/\D//g; |
|
if ($_64bit) { if ($txt > 2**32) { return -1; } } |
return int($txt); |
return int($txt); |
} |
} |
|
|
Line 4741 sub numval2 {
|
Line 4874 sub numval2 {
|
my @txts=split(/(\d\d\d\d\d\d\d\d\d)/,$txt); |
my @txts=split(/(\d\d\d\d\d\d\d\d\d)/,$txt); |
my $total; |
my $total; |
foreach my $val (@txts) { $total+=$val; } |
foreach my $val (@txts) { $total+=$val; } |
|
if ($_64bit) { if ($total > 2**32) { return -1; } } |
return int($total); |
return int($total); |
} |
} |
|
|
Line 4757 sub get_rand_alg {
|
Line 4891 sub get_rand_alg {
|
return &latest_rnd_algorithm_id(); |
return &latest_rnd_algorithm_id(); |
} |
} |
|
|
|
sub validCODE { |
|
my ($CODE)=@_; |
|
if (defined($CODE) && $CODE ne '' && $CODE =~ /^\w+$/) { return 1; } |
|
return 0; |
|
} |
|
|
sub getCODE { |
sub getCODE { |
if (defined($ENV{'form.CODE'})) { return $ENV{'form.CODE'}; } |
if (&validCODE($ENV{'form.CODE'})) { return $ENV{'form.CODE'}; } |
if (defined($Apache::lonhomework::parsing_a_problem) && |
if (defined($Apache::lonhomework::parsing_a_problem) && |
defined($Apache::lonhomework::history{'resource.CODE'})) { |
&validCODE($Apache::lonhomework::history{'resource.CODE'})) { |
return $Apache::lonhomework::history{'resource.CODE'}; |
return $Apache::lonhomework::history{'resource.CODE'}; |
} |
} |
return undef; |
return undef; |
Line 4802 sub rndseed_32bit {
|
Line 4942 sub rndseed_32bit {
|
my $num=$symbseed+$nameseed+$domainseed+$courseseed+$namechck+$symbchck; |
my $num=$symbseed+$nameseed+$domainseed+$courseseed+$namechck+$symbchck; |
#&Apache::lonxml::debug("$symbseed:$nameseed;$domainseed|$courseseed;$namechck:$symbchck"); |
#&Apache::lonxml::debug("$symbseed:$nameseed;$domainseed|$courseseed;$namechck:$symbchck"); |
#&Apache::lonxml::debug("rndseed :$num:$symb"); |
#&Apache::lonxml::debug("rndseed :$num:$symb"); |
|
if ($_64bit) { $num=(($num<<32)>>32); } |
return $num; |
return $num; |
} |
} |
} |
} |
Line 4822 sub rndseed_64bit {
|
Line 4963 sub rndseed_64bit {
|
my $num2=$nameseed+$domainseed+$courseseed; |
my $num2=$nameseed+$domainseed+$courseseed; |
#&Apache::lonxml::debug("$symbseed:$nameseed;$domainseed|$courseseed;$namechck:$symbchck"); |
#&Apache::lonxml::debug("$symbseed:$nameseed;$domainseed|$courseseed;$namechck:$symbchck"); |
#&Apache::lonxml::debug("rndseed :$num:$symb"); |
#&Apache::lonxml::debug("rndseed :$num:$symb"); |
|
if ($_64bit) { $num1=(($num1<<32)>>32); $num2=(($num2<<32)>>32); } |
|
if ($_64bit) { $num1=(($num1<<32)>>32); $num2=(($num2<<32)>>32); } |
return "$num1,$num2"; |
return "$num1,$num2"; |
} |
} |
} |
} |
Line 4865 sub rndseed_64bit3 {
|
Line 5008 sub rndseed_64bit3 {
|
my $num1=$symbchck+$symbseed+$namechck; |
my $num1=$symbchck+$symbseed+$namechck; |
my $num2=$nameseed+$domainseed+$courseseed; |
my $num2=$nameseed+$domainseed+$courseseed; |
#&Apache::lonxml::debug("$symbseed:$nameseed;$domainseed|$courseseed;$namechck:$symbchck"); |
#&Apache::lonxml::debug("$symbseed:$nameseed;$domainseed|$courseseed;$namechck:$symbchck"); |
#&Apache::lonxml::debug("rndseed :$num:$symb"); |
#&Apache::lonxml::debug("rndseed :$num1:$num2:$_64bit"); |
|
if ($_64bit) { $num1=(($num1<<32)>>32); $num2=(($num2<<32)>>32); } |
|
|
return "$num1:$num2"; |
return "$num1:$num2"; |
} |
} |
} |
} |
Line 4883 sub rndseed_CODE_64bit {
|
Line 5028 sub rndseed_CODE_64bit {
|
my $num2=$CODEseed+$courseseed+$symbchck; |
my $num2=$CODEseed+$courseseed+$symbchck; |
#&Apache::lonxml::debug("$symbseed:$CODEchck|$CODEseed:$courseseed:$symbchck"); |
#&Apache::lonxml::debug("$symbseed:$CODEchck|$CODEseed:$courseseed:$symbchck"); |
#&Apache::lonxml::debug("rndseed :$num1:$num2:$symb"); |
#&Apache::lonxml::debug("rndseed :$num1:$num2:$symb"); |
|
if ($_64bit) { $num1=(($num1<<32)>>32); } |
|
if ($_64bit) { $num2=(($num2<<32)>>32); } |
return "$num1:$num2"; |
return "$num1:$num2"; |
} |
} |
} |
} |
Line 5047 sub repcopy_userfile {
|
Line 5194 sub repcopy_userfile {
|
|
|
sub tokenwrapper { |
sub tokenwrapper { |
my $uri=shift; |
my $uri=shift; |
$uri=~s/^http\:\/\/([^\/]+)//; |
$uri=~s|^http\://([^/]+)||; |
$uri=~s/^\///; |
$uri=~s|^/||; |
$ENV{'user.environment'}=~/\/([^\/]+)\.id/; |
$ENV{'user.environment'}=~/\/([^\/]+)\.id/; |
my $token=$1; |
my $token=$1; |
if ($uri=~/^uploaded\/([^\/]+)\/([^\/]+)\/([^\/]+)(\?\.*)*$/) { |
my (undef,$udom,$uname,$file)=split('/',$uri,4); |
&appenv('userfile.'.$1.'/'.$2.'/'.$3 => $ENV{'request.course.id'}); |
if ($udom && $uname && $file) { |
return 'http://'.$hostname{ &homeserver($2,$1)}.'/'.$uri. |
$file=~s|(\?\.*)*$||; |
|
&appenv("userfile.$udom/$uname/$file" => $ENV{'request.course.id'}); |
|
return 'http://'.$hostname{ &homeserver($uname,$udom)}.'/'.$uri. |
(($uri=~/\?/)?'&':'?').'token='.$token. |
(($uri=~/\?/)?'&':'?').'token='.$token. |
'&tokenissued='.$perlvar{'lonHostID'}; |
'&tokenissued='.$perlvar{'lonHostID'}; |
} else { |
} else { |
Line 5186 sub clutter {
|
Line 5335 sub clutter {
|
return $thisfn; |
return $thisfn; |
} |
} |
|
|
|
sub freeze_escape { |
|
my ($value)=@_; |
|
if (ref($value)) { |
|
$value=&nfreeze($value); |
|
return '__FROZEN__'.&escape($value); |
|
} |
|
return &escape($value); |
|
} |
|
|
# -------------------------------------------------------- Escape Special Chars |
# -------------------------------------------------------- Escape Special Chars |
|
|
sub escape { |
sub escape { |
Line 5202 sub unescape {
|
Line 5360 sub unescape {
|
return $str; |
return $str; |
} |
} |
|
|
|
sub thaw_unescape { |
|
my ($value)=@_; |
|
if ($value =~ /^__FROZEN__/) { |
|
substr($value,0,10,undef); |
|
$value=&unescape($value); |
|
return &thaw($value); |
|
} |
|
return &unescape($value); |
|
} |
|
|
sub mod_perl_version { |
sub mod_perl_version { |
if (defined($perlvar{'MODPERL2'})) { |
if (defined($perlvar{'MODPERL2'})) { |
return 2; |
return 2; |
Line 5227 sub goodbye {
|
Line 5395 sub goodbye {
|
&logthis(sprintf("%-20s is %s",'%courseresdatacache',scalar(%courseresdatacache))); |
&logthis(sprintf("%-20s is %s",'%courseresdatacache',scalar(%courseresdatacache))); |
#1.1 only |
#1.1 only |
&logthis(sprintf("%-20s is %s",'%userresdatacache',scalar(%userresdatacache))); |
&logthis(sprintf("%-20s is %s",'%userresdatacache',scalar(%userresdatacache))); |
&logthis(sprintf("%-20s is %s",'%usectioncache',scalar(%usectioncache))); |
&logthis(sprintf("%-20s is %s",'%getsectioncache',scalar(%getsectioncache))); |
&logthis(sprintf("%-20s is %s",'%courseresversioncache',scalar(%courseresversioncache))); |
&logthis(sprintf("%-20s is %s",'%courseresversioncache',scalar(%courseresversioncache))); |
&logthis(sprintf("%-20s is %s",'%resversioncache',scalar(%resversioncache))); |
&logthis(sprintf("%-20s is %s",'%resversioncache',scalar(%resversioncache))); |
&flushcourselogs(); |
&flushcourselogs(); |
Line 5382 $dumpcount=0;
|
Line 5550 $dumpcount=0;
|
&logtouch(); |
&logtouch(); |
&logthis('<font color=yellow>INFO: Read configuration</font>'); |
&logthis('<font color=yellow>INFO: Read configuration</font>'); |
$readit=1; |
$readit=1; |
|
{ |
|
use integer; |
|
my $test=(2**32)+1; |
|
if ($test != 0) { $_64bit=1; } |
|
&logthis(" Detected 64bit platform ($_64bit)"); |
|
} |
} |
} |
} |
} |
|
|
Line 5609 X<rolesinit()>
|
Line 5783 X<rolesinit()>
|
B<rolesinit($udom,$username,$authhost)>: get user privileges |
B<rolesinit($udom,$username,$authhost)>: get user privileges |
|
|
=item * |
=item * |
X<usection()> |
X<getsection()> |
B<usection($udom,$uname,$cname)>: finds the section of student in the |
B<getsection($udom,$uname,$cname)>: finds the section of student in the |
course $cname, return section name/number or '' for "not in course" |
course $cname, return section name/number or '' for "not in course" |
and '-1' for "no section" |
and '-1' for "no section" |
|
|