version 1.1172.2.83, 2016/09/27 18:09:06
|
version 1.1260, 2014/05/10 14:00:04
|
Line 75 use LWP::UserAgent();
|
Line 75 use LWP::UserAgent();
|
use HTTP::Date; |
use HTTP::Date; |
use Image::Magick; |
use Image::Magick; |
|
|
|
|
|
use Encode; |
|
|
use vars qw(%perlvar %spareid %pr %prp $memcache %packagetab $tmpdir |
use vars qw(%perlvar %spareid %pr %prp $memcache %packagetab $tmpdir |
$_64bit %env %protocol %loncaparevs %serverhomeIDs %needsrelease |
$_64bit %env %protocol %loncaparevs %serverhomeIDs %needsrelease |
%managerstab); |
%managerstab); |
Line 89 use GDBM_File;
|
Line 92 use GDBM_File;
|
use HTML::LCParser; |
use HTML::LCParser; |
use Fcntl qw(:flock); |
use Fcntl qw(:flock); |
use Storable qw(thaw nfreeze); |
use Storable qw(thaw nfreeze); |
use Time::HiRes qw( sleep gettimeofday tv_interval ); |
use Time::HiRes qw( gettimeofday tv_interval ); |
use Cache::Memcached; |
use Cache::Memcached; |
use Digest::MD5; |
use Digest::MD5; |
use Math::Random; |
use Math::Random; |
Line 102 use LONCAPA::Lond;
|
Line 105 use LONCAPA::Lond;
|
use File::Copy; |
use File::Copy; |
|
|
my $readit; |
my $readit; |
my $max_connection_retries = 20; # Or some such value. |
my $max_connection_retries = 10; # Or some such value. |
|
|
require Exporter; |
require Exporter; |
|
|
our @ISA = qw (Exporter); |
our @ISA = qw (Exporter); |
our @EXPORT = qw(%env); |
our @EXPORT = qw(%env); |
|
|
|
|
# ------------------------------------ Logging (parameters, docs, slots, roles) |
# ------------------------------------ Logging (parameters, docs, slots, roles) |
{ |
{ |
my $logid; |
my $logid; |
Line 123 our @EXPORT = qw(%env);
|
Line 127 our @EXPORT = qw(%env);
|
$logid ++; |
$logid ++; |
my $now = time(); |
my $now = time(); |
my $id=$now.'00000'.$$.'00000'.$logid; |
my $id=$now.'00000'.$$.'00000'.$logid; |
my $logentry = { |
my $logentry = { |
$id => { |
$id => { |
'exe_uname' => $env{'user.name'}, |
'exe_uname' => $env{'user.name'}, |
'exe_udom' => $env{'user.domain'}, |
'exe_udom' => $env{'user.domain'}, |
'exe_time' => $now, |
'exe_time' => $now, |
'exe_ip' => $ENV{'REMOTE_ADDR'}, |
'exe_ip' => $ENV{'REMOTE_ADDR'}, |
'delflag' => $delflag, |
'delflag' => $delflag, |
'logentry' => $storehash, |
'logentry' => $storehash, |
'uname' => $uname, |
'uname' => $uname, |
'udom' => $udom, |
'udom' => $udom, |
} |
} |
}; |
}; |
return &put('nohist_'.$hash_name,$logentry,$cdom,$cnum); |
return &put('nohist_'.$hash_name,$logentry,$cdom,$cnum); |
} |
} |
} |
} |
|
|
Line 356 sub remote_devalidate_cache {
|
Line 360 sub remote_devalidate_cache {
|
my $items; |
my $items; |
return unless (ref($cachekeys) eq 'ARRAY'); |
return unless (ref($cachekeys) eq 'ARRAY'); |
my $cachestr = join('&',@{$cachekeys}); |
my $cachestr = join('&',@{$cachekeys}); |
return &reply('devalidatecache:'.&escape($cachestr),$lonhost); |
my $response = &reply('devalidatecache:'.&escape($cachestr),$lonhost); |
|
return $response; |
} |
} |
|
|
# -------------------------------------------------- Non-critical communication |
# -------------------------------------------------- Non-critical communication |
Line 370 sub subreply {
|
Line 375 sub subreply {
|
|
|
my $lockfile=$peerfile.".lock"; |
my $lockfile=$peerfile.".lock"; |
while (-e $lockfile) { # Need to wait for the lockfile to disappear. |
while (-e $lockfile) { # Need to wait for the lockfile to disappear. |
sleep(0.1); |
sleep(1); |
} |
} |
# At this point, either a loncnew parent is listening or an old lonc |
# 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. |
# or loncnew child is listening so we can connect or everything's dead. |
Line 388 sub subreply {
|
Line 393 sub subreply {
|
} else { |
} else { |
&create_connection(&hostname($server),$server); |
&create_connection(&hostname($server),$server); |
} |
} |
sleep(0.1); # Try again later if failed connection. |
sleep(1); # Try again later if failed connection. |
} |
} |
my $answer; |
my $answer; |
if ($client) { |
if ($client) { |
Line 417 sub reply {
|
Line 422 sub reply {
|
|
|
sub reconlonc { |
sub reconlonc { |
my ($lonid) = @_; |
my ($lonid) = @_; |
|
my $hostname = &hostname($lonid); |
if ($lonid) { |
if ($lonid) { |
my $hostname = &hostname($lonid); |
|
my $peerfile="$perlvar{'lonSockDir'}/$hostname"; |
my $peerfile="$perlvar{'lonSockDir'}/$hostname"; |
if ($hostname && -e $peerfile) { |
if ($hostname && -e $peerfile) { |
&logthis("Trying to reconnect lonc for $lonid ($hostname)"); |
&logthis("Trying to reconnect lonc for $lonid ($hostname)"); |
Line 464 sub critical {
|
Line 469 sub critical {
|
} |
} |
my $answer=reply($cmd,$server); |
my $answer=reply($cmd,$server); |
if ($answer eq 'con_lost') { |
if ($answer eq 'con_lost') { |
&reconlonc($server); |
&reconlonc("$perlvar{'lonSockDir'}/$server"); |
my $answer=reply($cmd,$server); |
my $answer=reply($cmd,$server); |
if ($answer eq 'con_lost') { |
if ($answer eq 'con_lost') { |
my $now=time; |
my $now=time; |
Line 481 sub critical {
|
Line 486 sub critical {
|
close($dfh); |
close($dfh); |
} |
} |
} |
} |
sleep 1; |
sleep 2; |
my $wcmd=''; |
my $wcmd=''; |
{ |
{ |
my $dfh; |
my $dfh; |
Line 844 sub spareserver {
|
Line 849 sub spareserver {
|
if (ref($spareshash) eq 'HASH') { |
if (ref($spareshash) eq 'HASH') { |
if (ref($spareshash->{'primary'}) eq 'ARRAY') { |
if (ref($spareshash->{'primary'}) eq 'ARRAY') { |
foreach my $try_server (@{ $spareshash->{'primary'} }) { |
foreach my $try_server (@{ $spareshash->{'primary'} }) { |
next unless (&spare_can_host($udom,$uint_dom,$remotesessions, |
if ($uint_dom) { |
$try_server)); |
next unless (&spare_can_host($udom,$uint_dom,$remotesessions, |
|
$try_server)); |
|
} |
($spare_server, $lowest_load) = |
($spare_server, $lowest_load) = |
&compare_server_load($try_server, $spare_server, $lowest_load); |
&compare_server_load($try_server, $spare_server, $lowest_load); |
} |
} |
Line 856 sub spareserver {
|
Line 863 sub spareserver {
|
if (!$found_server) { |
if (!$found_server) { |
if (ref($spareshash->{'default'}) eq 'ARRAY') { |
if (ref($spareshash->{'default'}) eq 'ARRAY') { |
foreach my $try_server (@{ $spareshash->{'default'} }) { |
foreach my $try_server (@{ $spareshash->{'default'} }) { |
next unless (&spare_can_host($udom,$uint_dom, |
if ($uint_dom) { |
$remotesessions,$try_server)); |
next unless (&spare_can_host($udom,$uint_dom, |
|
$remotesessions,$try_server)); |
|
} |
($spare_server, $lowest_load) = |
($spare_server, $lowest_load) = |
&compare_server_load($try_server, $spare_server, $lowest_load); |
&compare_server_load($try_server, $spare_server, $lowest_load); |
} |
} |
Line 970 sub choose_server {
|
Line 979 sub choose_server {
|
} |
} |
} |
} |
foreach my $lonhost (keys(%servers)) { |
foreach my $lonhost (keys(%servers)) { |
my $loginvia; |
|
if ($skiploadbal) { |
if ($skiploadbal) { |
if (ref($balancers) eq 'HASH') { |
if (ref($balancers) eq 'HASH') { |
next if (exists($balancers->{$lonhost})); |
next if (exists($balancers->{$lonhost})); |
} |
} |
} |
} |
|
my $loginvia; |
if ($checkloginvia) { |
if ($checkloginvia) { |
$loginvia = $domconfhash{$udom.'.login.loginvia_'.$lonhost}; |
$loginvia = $domconfhash{$udom.'.login.loginvia_'.$lonhost}; |
if ($loginvia) { |
if ($loginvia) { |
Line 1169 sub can_host_session {
|
Line 1178 sub can_host_session {
|
sub spare_can_host { |
sub spare_can_host { |
my ($udom,$uint_dom,$remotesessions,$try_server)=@_; |
my ($udom,$uint_dom,$remotesessions,$try_server)=@_; |
my $canhost=1; |
my $canhost=1; |
my $try_server_hostname = &hostname($try_server); |
my @intdoms; |
my $serverhomeID = &get_server_homeID($try_server_hostname); |
my $internet_names = &Apache::lonnet::get_internet_names($try_server); |
my $serverhomedom = &host_domain($serverhomeID); |
if (ref($internet_names) eq 'ARRAY') { |
my %defdomdefaults = &get_domain_defaults($serverhomedom); |
@intdoms = @{$internet_names}; |
if (ref($defdomdefaults{'offloadnow'}) eq 'HASH') { |
} |
if ($defdomdefaults{'offloadnow'}{$try_server}) { |
unless (grep(/^\Q$uint_dom\E$/,@intdoms)) { |
$canhost = 0; |
my $serverhomeID = &Apache::lonnet::get_server_homeID($try_server); |
} |
my $serverhomedom = &Apache::lonnet::host_domain($serverhomeID); |
} |
my %defdomdefaults = &Apache::lonnet::get_domain_defaults($serverhomedom); |
if (($canhost) && ($uint_dom)) { |
my $remoterev = &Apache::lonnet::get_server_loncaparev(undef,$try_server); |
my @intdoms; |
$canhost = &can_host_session($udom,$try_server,$remoterev, |
my $internet_names = &get_internet_names($try_server); |
$remotesessions, |
if (ref($internet_names) eq 'ARRAY') { |
$defdomdefaults{'hostedsessions'}); |
@intdoms = @{$internet_names}; |
|
} |
|
unless (grep(/^\Q$uint_dom\E$/,@intdoms)) { |
|
my $remoterev = &get_server_loncaparev(undef,$try_server); |
|
$canhost = &can_host_session($udom,$try_server,$remoterev, |
|
$remotesessions, |
|
$defdomdefaults{'hostedsessions'}); |
|
} |
|
} |
} |
return $canhost; |
return $canhost; |
} |
} |
Line 1283 sub check_loadbalancing {
|
Line 1284 sub check_loadbalancing {
|
my $uintdom = &Apache::lonnet::internet_dom($uprimary_id); |
my $uintdom = &Apache::lonnet::internet_dom($uprimary_id); |
my $intdom = &Apache::lonnet::internet_dom($lonhost); |
my $intdom = &Apache::lonnet::internet_dom($lonhost); |
my $serverhomedom = &host_domain($lonhost); |
my $serverhomedom = &host_domain($lonhost); |
my $domneedscache; |
|
my $cachetime = 60*60*24; |
my $cachetime = 60*60*24; |
|
|
if (($uintdom ne '') && ($uintdom eq $intdom)) { |
if (($uintdom ne '') && ($uintdom eq $intdom)) { |
Line 1298 sub check_loadbalancing {
|
Line 1299 sub check_loadbalancing {
|
&Apache::lonnet::get_dom('configuration',['loadbalancing'],$dom_in_use); |
&Apache::lonnet::get_dom('configuration',['loadbalancing'],$dom_in_use); |
if (ref($domconfig{'loadbalancing'}) eq 'HASH') { |
if (ref($domconfig{'loadbalancing'}) eq 'HASH') { |
$result = &do_cache_new('loadbalancing',$dom_in_use,$domconfig{'loadbalancing'},$cachetime); |
$result = &do_cache_new('loadbalancing',$dom_in_use,$domconfig{'loadbalancing'},$cachetime); |
} else { |
|
$domneedscache = $dom_in_use; |
|
} |
} |
} |
} |
if (ref($result) eq 'HASH') { |
if (ref($result) eq 'HASH') { |
($is_balancer,$currtargets,$currrules) = |
($is_balancer,$currtargets,$currrules) = |
&check_balancer_result($result,@hosts); |
&check_balancer_result($result,@hosts); |
if ($is_balancer) { |
if ($is_balancer) { |
if (ref($currrules) eq 'HASH') { |
if (ref($currrules) eq 'HASH') { |
Line 1358 sub check_loadbalancing {
|
Line 1357 sub check_loadbalancing {
|
my %domconfig = |
my %domconfig = |
&Apache::lonnet::get_dom('configuration',['loadbalancing'],$serverhomedom); |
&Apache::lonnet::get_dom('configuration',['loadbalancing'],$serverhomedom); |
if (ref($domconfig{'loadbalancing'}) eq 'HASH') { |
if (ref($domconfig{'loadbalancing'}) eq 'HASH') { |
$result = &do_cache_new('loadbalancing',$serverhomedom,$domconfig{'loadbalancing'},$cachetime); |
$result = &do_cache_new('loadbalancing',$dom_in_use,$domconfig{'loadbalancing'},$cachetime); |
} else { |
|
$domneedscache = $serverhomedom; |
|
} |
} |
} |
} |
if (ref($result) eq 'HASH') { |
if (ref($result) eq 'HASH') { |
($is_balancer,$currtargets,$currrules) = |
($is_balancer,$currtargets,$currrules) = |
&check_balancer_result($result,@hosts); |
&check_balancer_result($result,@hosts); |
if ($is_balancer) { |
if ($is_balancer) { |
if (ref($currrules) eq 'HASH') { |
if (ref($currrules) eq 'HASH') { |
Line 1380 sub check_loadbalancing {
|
Line 1377 sub check_loadbalancing {
|
$is_balancer = 1; |
$is_balancer = 1; |
$offloadto = &this_host_spares($dom_in_use); |
$offloadto = &this_host_spares($dom_in_use); |
} |
} |
unless (defined($cached)) { |
|
$domneedscache = $serverhomedom; |
|
} |
|
} |
} |
} else { |
} else { |
if ($perlvar{'lonBalancer'} eq 'yes') { |
if ($perlvar{'lonBalancer'} eq 'yes') { |
$is_balancer = 1; |
$is_balancer = 1; |
$offloadto = &this_host_spares($dom_in_use); |
$offloadto = &this_host_spares($dom_in_use); |
} |
} |
unless (defined($cached)) { |
|
$domneedscache = $serverhomedom; |
|
} |
|
} |
|
if ($domneedscache) { |
|
&do_cache_new('loadbalancing',$domneedscache,$is_balancer,$cachetime); |
|
} |
} |
if ($is_balancer) { |
if ($is_balancer) { |
my $lowest_load = 30000; |
my $lowest_load = 30000; |
Line 1429 sub check_loadbalancing {
|
Line 1417 sub check_loadbalancing {
|
$is_balancer = 0; |
$is_balancer = 0; |
if ($uname ne '' && $udom ne '') { |
if ($uname ne '' && $udom ne '') { |
if (($env{'user.name'} eq $uname) && ($env{'user.domain'} eq $udom)) { |
if (($env{'user.name'} eq $uname) && ($env{'user.domain'} eq $udom)) { |
|
|
&appenv({'user.loadbalexempt' => $lonhost, |
&appenv({'user.loadbalexempt' => $lonhost, |
'user.loadbalcheck.time' => time}); |
'user.loadbalcheck.time' => time}); |
} |
} |
} |
} |
Line 1567 sub idget {
|
Line 1555 sub idget {
|
|
|
my %servers = &get_servers($udom,'library'); |
my %servers = &get_servers($udom,'library'); |
foreach my $tryserver (keys(%servers)) { |
foreach my $tryserver (keys(%servers)) { |
my $idlist=join('&', map { &escape($_); } @ids); |
my $idlist=join('&',@ids); |
$idlist=~tr/A-Z/a-z/; |
$idlist=~tr/A-Z/a-z/; |
my $reply=&reply("idget:$udom:".$idlist,$tryserver); |
my $reply=&reply("idget:$udom:".$idlist,$tryserver); |
my @answer=(); |
my @answer=(); |
Line 1577 sub idget {
|
Line 1565 sub idget {
|
my $i; |
my $i; |
for ($i=0;$i<=$#ids;$i++) { |
for ($i=0;$i<=$#ids;$i++) { |
if ($answer[$i]) { |
if ($answer[$i]) { |
$returnhash{$ids[$i]}=&unescape($answer[$i]); |
$returnhash{$ids[$i]}=$answer[$i]; |
} |
} |
} |
} |
} |
} |
Line 1619 sub idput {
|
Line 1607 sub idput {
|
} |
} |
} |
} |
|
|
# ---------------------------------------- Delete unwanted IDs from ids.db file |
# ---------------------------------------- Delete unwanted IDs from ids.db file |
|
|
sub iddel { |
sub iddel { |
my ($udom,$idshashref,$uhome)=@_; |
my ($udom,$idshashref,$uhome)=@_; |
Line 1664 sub dump_dom {
|
Line 1652 sub dump_dom {
|
|
|
sub get_dom { |
sub get_dom { |
my ($namespace,$storearr,$udom,$uhome)=@_; |
my ($namespace,$storearr,$udom,$uhome)=@_; |
return if ($udom eq 'public'); |
|
my $items=''; |
my $items=''; |
foreach my $item (@$storearr) { |
foreach my $item (@$storearr) { |
$items.=&escape($item).'&'; |
$items.=&escape($item).'&'; |
Line 1672 sub get_dom {
|
Line 1659 sub get_dom {
|
$items=~s/\&$//; |
$items=~s/\&$//; |
if (!$udom) { |
if (!$udom) { |
$udom=$env{'user.domain'}; |
$udom=$env{'user.domain'}; |
return if ($udom eq 'public'); |
|
if (defined(&domain($udom,'primary'))) { |
if (defined(&domain($udom,'primary'))) { |
$uhome=&domain($udom,'primary'); |
$uhome=&domain($udom,'primary'); |
} else { |
} else { |
Line 1806 sub retrieve_inst_usertypes {
|
Line 1792 sub retrieve_inst_usertypes {
|
|
|
sub is_domainimage { |
sub is_domainimage { |
my ($url) = @_; |
my ($url) = @_; |
if ($url=~m-^/+res/+($match_domain)/+\1\-domainconfig/+(img|logo|domlogo)/+[^/]-) { |
if ($url=~m-^/+res/+($match_domain)/+\1\-domainconfig/+(img|logo|domlogo)/+-) { |
if (&domain($1) ne '') { |
if (&domain($1) ne '') { |
return '1'; |
return '1'; |
} |
} |
Line 1947 sub get_instuser {
|
Line 1933 sub get_instuser {
|
return ($outcome,%userinfo); |
return ($outcome,%userinfo); |
} |
} |
|
|
sub get_multiple_instusers { |
|
my ($udom,$users,$caller) = @_; |
|
my ($outcome,$results); |
|
if (ref($users) eq 'HASH') { |
|
my $count = keys(%{$users}); |
|
my $requested = &freeze_escape($users); |
|
my $homeserver = &domain($udom,'primary'); |
|
if ($homeserver ne '') { |
|
my $queryid=&reply('querysend:getmultinstusers:::'.$caller.'='.$requested,$homeserver); |
|
my $host=&hostname($homeserver); |
|
if ($queryid !~/^\Q$host\E\_/) { |
|
&logthis('get_multiple_instusers invalid queryid: '.$queryid. |
|
' for host: '.$homeserver.'in domain '.$udom); |
|
return ($outcome,$results); |
|
} |
|
my $response = &get_query_reply($queryid); |
|
my $maxtries = 5; |
|
if ($count > 100) { |
|
$maxtries = 1+int($count/20); |
|
} |
|
my $tries = 1; |
|
while (($response=~/^timeout/) && ($tries <= $maxtries)) { |
|
$response = &get_query_reply($queryid); |
|
$tries ++; |
|
} |
|
if ($response eq '') { |
|
$results = {}; |
|
foreach my $key (keys(%{$users})) { |
|
my ($uname,$id); |
|
if ($caller eq 'id') { |
|
$id = $key; |
|
} else { |
|
$uname = $key; |
|
} |
|
my ($resp,%info) = &get_instuser($udom,$uname,$id); |
|
$outcome = $resp; |
|
if ($resp eq 'ok') { |
|
%{$results} = (%{$results}, %info); |
|
} else { |
|
last; |
|
} |
|
} |
|
} elsif(!&error($response) && ($response ne 'refused')) { |
|
if (($response eq 'unavailable') || ($response eq 'invalid') || ($response eq 'timeout')) { |
|
$outcome = $response; |
|
} else { |
|
($outcome,my $userdata) = split(/=/,$response,2); |
|
if ($outcome eq 'ok') { |
|
$results = &thaw_unescape($userdata); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return ($outcome,$results); |
|
} |
|
|
|
sub inst_rulecheck { |
sub inst_rulecheck { |
my ($udom,$uname,$id,$item,$rules) = @_; |
my ($udom,$uname,$id,$item,$rules) = @_; |
my %returnhash; |
my %returnhash; |
Line 2100 sub get_domain_defaults {
|
Line 2029 sub get_domain_defaults {
|
'requestcourses','inststatus', |
'requestcourses','inststatus', |
'coursedefaults','usersessions', |
'coursedefaults','usersessions', |
'requestauthor','selfenrollment', |
'requestauthor','selfenrollment', |
'coursecategories','autoenroll'],$domain); |
'coursecategories'],$domain); |
my @coursetypes = ('official','unofficial','community','textbook'); |
my @coursetypes = ('official','unofficial','community','textbook'); |
if (ref($domconfig{'defaults'}) eq 'HASH') { |
if (ref($domconfig{'defaults'}) eq 'HASH') { |
$domdefaults{'lang_def'} = $domconfig{'defaults'}{'lang_def'}; |
$domdefaults{'lang_def'} = $domconfig{'defaults'}{'lang_def'}; |
Line 2144 sub get_domain_defaults {
|
Line 2073 sub get_domain_defaults {
|
} |
} |
} |
} |
if (ref($domconfig{'coursedefaults'}) eq 'HASH') { |
if (ref($domconfig{'coursedefaults'}) eq 'HASH') { |
$domdefaults{'usejsme'} = $domconfig{'coursedefaults'}{'usejsme'}; |
$domdefaults{'canuse_pdfforms'} = $domconfig{'coursedefaults'}{'canuse_pdfforms'}; |
$domdefaults{'uselcmath'} = $domconfig{'coursedefaults'}{'uselcmath'}; |
|
if (ref($domconfig{'coursedefaults'}{'postsubmit'}) eq 'HASH') { |
|
$domdefaults{'postsubmit'} = $domconfig{'coursedefaults'}{'postsubmit'}{'client'}; |
|
} |
|
foreach my $type (@coursetypes) { |
foreach my $type (@coursetypes) { |
if (ref($domconfig{'coursedefaults'}{'coursecredits'}) eq 'HASH') { |
if (ref($domconfig{'coursedefaults'}{'coursecredits'}) eq 'HASH') { |
unless ($type eq 'community') { |
unless ($type eq 'community') { |
Line 2158 sub get_domain_defaults {
|
Line 2083 sub get_domain_defaults {
|
if (ref($domconfig{'coursedefaults'}{'uploadquota'}) eq 'HASH') { |
if (ref($domconfig{'coursedefaults'}{'uploadquota'}) eq 'HASH') { |
$domdefaults{$type.'quota'} = $domconfig{'coursedefaults'}{'uploadquota'}{$type}; |
$domdefaults{$type.'quota'} = $domconfig{'coursedefaults'}{'uploadquota'}{$type}; |
} |
} |
if ($domdefaults{'postsubmit'} eq 'on') { |
|
if (ref($domconfig{'coursedefaults'}{'postsubmit'}{'timeout'}) eq 'HASH') { |
|
$domdefaults{$type.'postsubtimeout'} = |
|
$domconfig{'coursedefaults'}{'postsubmit'}{'timeout'}{$type}; |
|
} |
|
} |
|
} |
|
if (ref($domconfig{'coursedefaults'}{'canclone'}) eq 'HASH') { |
|
if (ref($domconfig{'coursedefaults'}{'canclone'}{'instcode'}) eq 'ARRAY') { |
|
my @clonecodes = @{$domconfig{'coursedefaults'}{'canclone'}{'instcode'}}; |
|
if (@clonecodes) { |
|
$domdefaults{'canclone'} = join('+',@clonecodes); |
|
} |
|
} |
|
} elsif ($domconfig{'coursedefaults'}{'canclone'}) { |
|
$domdefaults{'canclone'}=$domconfig{'coursedefaults'}{'canclone'}; |
|
} |
} |
} |
} |
if (ref($domconfig{'usersessions'}) eq 'HASH') { |
if (ref($domconfig{'usersessions'}) eq 'HASH') { |
Line 2183 sub get_domain_defaults {
|
Line 2092 sub get_domain_defaults {
|
if (ref($domconfig{'usersessions'}{'hosted'}) eq 'HASH') { |
if (ref($domconfig{'usersessions'}{'hosted'}) eq 'HASH') { |
$domdefaults{'hostedsessions'} = $domconfig{'usersessions'}{'hosted'}; |
$domdefaults{'hostedsessions'} = $domconfig{'usersessions'}{'hosted'}; |
} |
} |
if (ref($domconfig{'usersessions'}{'offloadnow'}) eq 'HASH') { |
|
$domdefaults{'offloadnow'} = $domconfig{'usersessions'}{'offloadnow'}; |
|
} |
|
} |
} |
if (ref($domconfig{'selfenrollment'}) eq 'HASH') { |
if (ref($domconfig{'selfenrollment'}) eq 'HASH') { |
if (ref($domconfig{'selfenrollment'}{'admin'}) eq 'HASH') { |
if (ref($domconfig{'selfenrollment'}{'admin'}) eq 'HASH') { |
Line 2218 sub get_domain_defaults {
|
Line 2124 sub get_domain_defaults {
|
if (ref($domconfig{'coursecategories'}) eq 'HASH') { |
if (ref($domconfig{'coursecategories'}) eq 'HASH') { |
$domdefaults{'catauth'} = 'std'; |
$domdefaults{'catauth'} = 'std'; |
$domdefaults{'catunauth'} = 'std'; |
$domdefaults{'catunauth'} = 'std'; |
if ($domconfig{'coursecategories'}{'auth'}) { |
if ($domconfig{'coursecategories'}{'auth'}) { |
$domdefaults{'catauth'} = $domconfig{'coursecategories'}{'auth'}; |
$domdefaults{'catauth'} = $domconfig{'coursecategories'}{'auth'}; |
} |
} |
if ($domconfig{'coursecategories'}{'unauth'}) { |
if ($domconfig{'coursecategories'}{'unauth'}) { |
$domdefaults{'catunauth'} = $domconfig{'coursecategories'}{'unauth'}; |
$domdefaults{'catunauth'} = $domconfig{'coursecategories'}{'unauth'}; |
} |
} |
} |
} |
if (ref($domconfig{'autoenroll'}) eq 'HASH') { |
|
$domdefaults{'autofailsafe'} = $domconfig{'autoenroll'}{'autofailsafe'}; |
|
} |
|
&do_cache_new('domdefaults',$domain,\%domdefaults,$cachetime); |
&do_cache_new('domdefaults',$domain,\%domdefaults,$cachetime); |
return %domdefaults; |
return %domdefaults; |
} |
} |
Line 2468 sub make_key {
|
Line 2371 sub make_key {
|
sub devalidate_cache_new { |
sub devalidate_cache_new { |
my ($name,$id,$debug) = @_; |
my ($name,$id,$debug) = @_; |
if ($debug) { &Apache::lonnet::logthis("deleting $name:$id"); } |
if ($debug) { &Apache::lonnet::logthis("deleting $name:$id"); } |
my $remembered_id=$name.':'.$id; |
|
$id=&make_key($name,$id); |
$id=&make_key($name,$id); |
$memcache->delete($id); |
$memcache->delete($id); |
delete($remembered{$remembered_id}); |
delete($remembered{$id}); |
delete($accessed{$remembered_id}); |
delete($accessed{$id}); |
} |
} |
|
|
sub is_cached_new { |
sub is_cached_new { |
my ($name,$id,$debug) = @_; |
my ($name,$id,$debug) = @_; |
my $remembered_id=$name.':'.$id; # this is to avoid make_key (which is slow) for |
$id=&make_key($name,$id); |
# keys in %remembered hash, which persists for |
if (exists($remembered{$id})) { |
# duration of request (no restriction on key length). |
if ($debug) { &Apache::lonnet::logthis("Early return $id of $remembered{$id} "); } |
if (exists($remembered{$remembered_id})) { |
$accessed{$id}=[&gettimeofday()]; |
if ($debug) { &Apache::lonnet::logthis("Early return $remembered_id of $remembered{$remembered_id} "); } |
|
$accessed{$remembered_id}=[&gettimeofday()]; |
|
$hits++; |
$hits++; |
return ($remembered{$remembered_id},1); |
return ($remembered{$id},1); |
} |
} |
$id=&make_key($name,$id); |
|
my $value = $memcache->get($id); |
my $value = $memcache->get($id); |
if (!(defined($value))) { |
if (!(defined($value))) { |
if ($debug) { &Apache::lonnet::logthis("getting $id is not defined"); } |
if ($debug) { &Apache::lonnet::logthis("getting $id is not defined"); } |
Line 2496 sub is_cached_new {
|
Line 2395 sub is_cached_new {
|
if ($debug) { &Apache::lonnet::logthis("getting $id is __undef__"); } |
if ($debug) { &Apache::lonnet::logthis("getting $id is __undef__"); } |
$value=undef; |
$value=undef; |
} |
} |
&make_room($remembered_id,$value,$debug); |
&make_room($id,$value,$debug); |
if ($debug) { &Apache::lonnet::logthis("getting $id is $value"); } |
if ($debug) { &Apache::lonnet::logthis("getting $id is $value"); } |
return ($value,1); |
return ($value,1); |
} |
} |
|
|
sub do_cache_new { |
sub do_cache_new { |
my ($name,$id,$value,$time,$debug) = @_; |
my ($name,$id,$value,$time,$debug) = @_; |
my $remembered_id=$name.':'.$id; |
|
$id=&make_key($name,$id); |
$id=&make_key($name,$id); |
my $setvalue=$value; |
my $setvalue=$value; |
if (!defined($setvalue)) { |
if (!defined($setvalue)) { |
Line 2519 sub do_cache_new {
|
Line 2417 sub do_cache_new {
|
$memcache->disconnect_all(); |
$memcache->disconnect_all(); |
} |
} |
# need to make a copy of $value |
# need to make a copy of $value |
&make_room($remembered_id,$value,$debug); |
&make_room($id,$value,$debug); |
return $value; |
return $value; |
} |
} |
|
|
sub make_room { |
sub make_room { |
my ($remembered_id,$value,$debug)=@_; |
my ($id,$value,$debug)=@_; |
|
|
$remembered{$remembered_id}= (ref($value)) ? &Storable::dclone($value) |
$remembered{$id}= (ref($value)) ? &Storable::dclone($value) |
: $value; |
: $value; |
if ($to_remember<0) { return; } |
if ($to_remember<0) { return; } |
$accessed{$remembered_id}=[&gettimeofday()]; |
$accessed{$id}=[&gettimeofday()]; |
if (scalar(keys(%remembered)) <= $to_remember) { return; } |
if (scalar(keys(%remembered)) <= $to_remember) { return; } |
my $to_kick; |
my $to_kick; |
my $max_time=0; |
my $max_time=0; |
Line 2823 sub ssi {
|
Line 2721 sub ssi {
|
&Apache::lonenc::check_encrypt(\$fn); |
&Apache::lonenc::check_encrypt(\$fn); |
if (%form) { |
if (%form) { |
$request=new HTTP::Request('POST',&absolute_url().$fn); |
$request=new HTTP::Request('POST',&absolute_url().$fn); |
$request->content(join('&',map { |
$request->content(join('&',map { &escape($_).'='.&escape($form{$_}) } keys(%form))); |
my $name = escape($_); |
|
"$name=" . ( ref($form{$_}) eq 'ARRAY' |
|
? join("&$name=", map {escape($_) } @{$form{$_}}) |
|
: &escape($form{$_}) ); |
|
} keys(%form))); |
|
} else { |
} else { |
$request=new HTTP::Request('GET',&absolute_url().$fn); |
$request=new HTTP::Request('GET',&absolute_url().$fn); |
} |
} |
|
|
$request->header(Cookie => $ENV{'HTTP_COOKIE'}); |
$request->header(Cookie => $ENV{'HTTP_COOKIE'}); |
my $response= $ua->request($request); |
my $response= $ua->request($request); |
|
my $content = $response->content; |
|
|
|
|
if (wantarray) { |
if (wantarray) { |
return ($response->content, $response); |
return ($content, $response); |
} else { |
} else { |
return $response->content; |
return $content; |
} |
} |
} |
} |
|
|
Line 2870 sub allowuploaded {
|
Line 2766 sub allowuploaded {
|
# |
# |
# Determine if the current user should be able to edit a particular resource, |
# Determine if the current user should be able to edit a particular resource, |
# when viewing in course context. |
# when viewing in course context. |
# (a) When viewing resource used to determine if "Edit" item is included in |
# (a) When viewing resource used to determine if "Edit" item is included in |
# Functions. |
# Functions. |
# (b) When displaying folder contents in course editor, used to determine if |
# (b) When displaying folder contents in course editor, used to determine if |
# "Edit" link will be displayed alongside resource. |
# "Edit" link will be displayed alongside resource. |
Line 2878 sub allowuploaded {
|
Line 2774 sub allowuploaded {
|
# input: six args -- filename (decluttered), course number, course domain, |
# input: six args -- filename (decluttered), course number, course domain, |
# url, symb (if registered) and group (if this is a group |
# url, symb (if registered) and group (if this is a group |
# item -- e.g., bulletin board, group page etc.). |
# item -- e.g., bulletin board, group page etc.). |
# output: array of five scalars -- |
# output: array of five scalars -- |
# $cfile -- url for file editing if editable on current server |
# $cfile -- url for file editing if editable on current server |
# $home -- homeserver of resource (i.e., for author if published, |
# $home -- homeserver of resource (i.e., for author if published, |
# or course if uploaded.). |
# or course if uploaded.). |
# $switchserver -- 1 if server switch will be needed. |
# $switchserver -- 1 if server switch will be needed. |
# $forceedit -- 1 if icon/link should be to go to edit mode |
# $forceedit -- 1 if icon/link should be to go to edit mode |
# $forceview -- 1 if icon/link should be to go to view mode |
# $forceview -- 1 if icon/link should be to go to view mode |
# |
# |
|
|
Line 2972 sub can_edit_resource {
|
Line 2868 sub can_edit_resource {
|
$forceedit = 1; |
$forceedit = 1; |
} |
} |
$cfile = $resurl; |
$cfile = $resurl; |
} elsif (($resurl ne '') && (&is_on_map($resurl))) { |
} elsif (($resurl ne '') && (&is_on_map($resurl))) { |
if ($resurl =~ m{^/adm/$match_domain/$match_username/\d+/smppg|bulletinboard$}) { |
if ($resurl =~ m{^/adm/$match_domain/$match_username/\d+/smppg|bulletinboard$}) { |
$incourse = 1; |
$incourse = 1; |
if ($env{'form.forceedit'}) { |
if ($env{'form.forceedit'}) { |
Line 3003 sub can_edit_resource {
|
Line 2899 sub can_edit_resource {
|
} |
} |
} elsif ($resurl eq '/res/lib/templates/simpleproblem.problem/smpedit') { |
} elsif ($resurl eq '/res/lib/templates/simpleproblem.problem/smpedit') { |
my $template = '/res/lib/templates/simpleproblem.problem'; |
my $template = '/res/lib/templates/simpleproblem.problem'; |
if (&is_on_map($template)) { |
if (&is_on_map($template)) { |
$incourse = 1; |
$incourse = 1; |
$forceview = 1; |
$forceview = 1; |
$cfile = $template; |
$cfile = $template; |
Line 3050 sub can_edit_resource {
|
Line 2946 sub can_edit_resource {
|
$cfile=$file; |
$cfile=$file; |
} |
} |
} |
} |
if (($cfile ne '') && (!$incourse || $uploaded) && |
if (($cfile ne '') && (!$incourse || $uploaded) && |
(($home ne '') && ($home ne 'no_host'))) { |
(($home ne '') && ($home ne 'no_host'))) { |
my @ids=¤t_machine_ids(); |
my @ids=¤t_machine_ids(); |
unless (grep(/^\Q$home\E$/,@ids)) { |
unless (grep(/^\Q$home\E$/,@ids)) { |
Line 3077 sub in_course {
|
Line 2973 sub in_course {
|
if ($hideprivileged) { |
if ($hideprivileged) { |
my $skipuser; |
my $skipuser; |
my %coursehash = &coursedescription($cdom.'_'.$cnum); |
my %coursehash = &coursedescription($cdom.'_'.$cnum); |
my @possdoms = ($cdom); |
my @possdoms = ($cdom); |
if ($coursehash{'checkforpriv'}) { |
if ($coursehash{'checkforpriv'}) { |
push(@possdoms,split(/,/,$coursehash{'checkforpriv'})); |
push(@possdoms,split(/,/,$coursehash{'checkforpriv'})); |
} |
} |
if (&privileged($uname,$udom,\@possdoms)) { |
if (&privileged($uname,$udom,\@possdoms)) { |
$skipuser = 1; |
$skipuser = 1; |
Line 3583 sub extract_embedded_items {
|
Line 3479 sub extract_embedded_items {
|
} |
} |
if (lc($tagname) eq 'a') { |
if (lc($tagname) eq 'a') { |
unless (($attr->{'href'} =~ /^#/) || ($attr->{'href'} eq '')) { |
unless (($attr->{'href'} =~ /^#/) || ($attr->{'href'} eq '')) { |
&add_filetype($allfiles,$attr->{'href'},'href'); |
&add_filetype($allfiles,$attr->{'href'},'href'); |
} |
} |
} |
} |
if (lc($tagname) eq 'script') { |
if (lc($tagname) eq 'script') { |
Line 3923 sub flushcourselogs {
|
Line 3819 sub flushcourselogs {
|
delete $domainrolehash{$entry}; |
delete $domainrolehash{$entry}; |
} |
} |
foreach my $dom (keys(%domrolebuffer)) { |
foreach my $dom (keys(%domrolebuffer)) { |
my %servers; |
my %servers = &get_servers($dom,'library'); |
if (defined(&domain($dom,'primary'))) { |
|
my $primary=&domain($dom,'primary'); |
|
my $hostname=&hostname($primary); |
|
$servers{$primary} = $hostname; |
|
} else { |
|
%servers = &get_servers($dom,'library'); |
|
} |
|
foreach my $tryserver (keys(%servers)) { |
foreach my $tryserver (keys(%servers)) { |
if (&reply('domroleput:'.$dom.':'. |
unless (&reply('domroleput:'.$dom.':'. |
$domrolebuffer{$dom},$tryserver) eq 'ok') { |
$domrolebuffer{$dom},$tryserver) eq 'ok') { |
last; |
|
} else { |
|
&logthis('Put of domain roles failed for '.$dom.' and '.$tryserver); |
&logthis('Put of domain roles failed for '.$dom.' and '.$tryserver); |
} |
} |
} |
} |
Line 4263 sub get_my_roles {
|
Line 4150 sub get_my_roles {
|
} else { |
} else { |
my $possdoms = [$domain]; |
my $possdoms = [$domain]; |
if (ref($roledoms) eq 'ARRAY') { |
if (ref($roledoms) eq 'ARRAY') { |
push(@{$possdoms},@{$roledoms}); |
push(@{$possdoms},@{$roledoms}); |
} |
} |
if (&privileged($username,$domain,$possdoms,\@privroles)) { |
if (&privileged($username,$domain,$possdoms,\@privroles)) { |
if (!$nothide{$username.':'.$domain}) { |
if (!$nothide{$username.':'.$domain}) { |
Line 4358 sub courseiddump {
|
Line 4245 sub courseiddump {
|
$coursefilter,$hostidflag,$hostidref,$typefilter,$regexp_ok, |
$coursefilter,$hostidflag,$hostidref,$typefilter,$regexp_ok, |
$selfenrollonly,$catfilter,$showhidden,$caller,$cloner,$cc_clone, |
$selfenrollonly,$catfilter,$showhidden,$caller,$cloner,$cc_clone, |
$cloneonly,$createdbefore,$createdafter,$creationcontext,$domcloner, |
$cloneonly,$createdbefore,$createdafter,$creationcontext,$domcloner, |
$hasuniquecode,$reqcrsdom,$reqinstcode)=@_; |
$hasuniquecode)=@_; |
my $as_hash = 1; |
my $as_hash = 1; |
my %returnhash; |
my %returnhash; |
if (!$domfilter) { $domfilter=''; } |
if (!$domfilter) { $domfilter=''; } |
Line 4371 sub courseiddump {
|
Line 4258 sub courseiddump {
|
if (($domfilter eq '') || |
if (($domfilter eq '') || |
(&host_domain($tryserver) eq $domfilter)) { |
(&host_domain($tryserver) eq $domfilter)) { |
my $rep; |
my $rep; |
if (grep { $_ eq $tryserver } ¤t_machine_ids()) { |
if (grep { $_ eq $tryserver } current_machine_ids()) { |
$rep = &LONCAPA::Lond::dump_course_id_handler( |
$rep = LONCAPA::Lond::dump_course_id_handler( |
join(":", (&host_domain($tryserver), $sincefilter, |
join(":", (&host_domain($tryserver), $sincefilter, |
&escape($descfilter), &escape($instcodefilter), |
&escape($descfilter), &escape($instcodefilter), |
&escape($ownerfilter), &escape($coursefilter), |
&escape($ownerfilter), &escape($coursefilter), |
&escape($typefilter), &escape($regexp_ok), |
&escape($typefilter), &escape($regexp_ok), |
$as_hash, &escape($selfenrollonly), |
$as_hash, &escape($selfenrollonly), |
&escape($catfilter), $showhidden, $caller, |
&escape($catfilter), $showhidden, $caller, |
&escape($cloner), &escape($cc_clone), $cloneonly, |
&escape($cloner), &escape($cc_clone), $cloneonly, |
&escape($createdbefore), &escape($createdafter), |
&escape($createdbefore), &escape($createdafter), |
&escape($creationcontext),$domcloner,$hasuniquecode, |
&escape($creationcontext), $domcloner, $hasuniquecode))); |
$reqcrsdom,&escape($reqinstcode)))); |
|
} else { |
} else { |
$rep = &reply('courseiddump:'.&host_domain($tryserver).':'. |
$rep = &reply('courseiddump:'.&host_domain($tryserver).':'. |
$sincefilter.':'.&escape($descfilter).':'. |
$sincefilter.':'.&escape($descfilter).':'. |
Line 4393 sub courseiddump {
|
Line 4279 sub courseiddump {
|
$showhidden.':'.$caller.':'.&escape($cloner).':'. |
$showhidden.':'.$caller.':'.&escape($cloner).':'. |
&escape($cc_clone).':'.$cloneonly.':'. |
&escape($cc_clone).':'.$cloneonly.':'. |
&escape($createdbefore).':'.&escape($createdafter).':'. |
&escape($createdbefore).':'.&escape($createdafter).':'. |
&escape($creationcontext).':'.$domcloner.':'.$hasuniquecode. |
&escape($creationcontext).':'.$domcloner.':'.$hasuniquecode, |
':'.$reqcrsdom.':'.&escape($reqinstcode),$tryserver); |
$tryserver); |
} |
} |
|
|
my @pairs=split(/\&/,$rep); |
my @pairs=split(/\&/,$rep); |
foreach my $item (@pairs) { |
foreach my $item (@pairs) { |
my ($key,$value)=split(/\=/,$item,2); |
my ($key,$value)=split(/\=/,$item,2); |
Line 4533 my $cachedkey='';
|
Line 4419 my $cachedkey='';
|
# The cached times for this user |
# The cached times for this user |
my %cachedtimes=(); |
my %cachedtimes=(); |
# When this was last done |
# When this was last done |
my $cachedtime=''; |
my $cachedtime=(); |
|
|
sub load_all_first_access { |
sub load_all_first_access { |
my ($uname,$udom)=@_; |
my ($uname,$udom)=@_; |
Line 4595 sub set_first_access {
|
Line 4481 sub set_first_access {
|
return 'already_set'; |
return 'already_set'; |
} |
} |
} |
} |
|
|
sub checkout { |
|
my ($symb,$tuname,$tudom,$tcrsid)=@_; |
|
my $now=time; |
|
my $lonhost=$perlvar{'lonHostID'}; |
|
my $infostr=&escape( |
|
'CHECKOUTTOKEN&'. |
|
$tuname.'&'. |
|
$tudom.'&'. |
|
$tcrsid.'&'. |
|
$symb.'&'. |
|
$now.'&'.$ENV{'REMOTE_ADDR'}); |
|
my $token=&reply('tmpput:'.$infostr,$lonhost); |
|
if ($token=~/^error\:/) { |
|
&logthis("<font color=\"blue\">WARNING: ". |
|
"Checkout tmpput failed ".$tudom.' - '.$tuname.' - '.$symb. |
|
"</font>"); |
|
return ''; |
|
} |
|
|
|
$token=~s/^(\d+)\_.*\_(\d+)$/$1\*$2\*$lonhost/; |
|
$token=~tr/a-z/A-Z/; |
|
|
|
my %infohash=('resource.0.outtoken' => $token, |
|
'resource.0.checkouttime' => $now, |
|
'resource.0.outremote' => $ENV{'REMOTE_ADDR'}); |
|
|
|
unless (&cstore(\%infohash,$symb,$tcrsid,$tudom,$tuname) eq 'ok') { |
|
return ''; |
|
} else { |
|
&logthis("<font color=\"blue\">WARNING: ". |
|
"Checkout cstore failed ".$tudom.' - '.$tuname.' - '.$symb. |
|
"</font>"); |
|
} |
|
|
|
if (&log($tudom,$tuname,&homeserver($tuname,$tudom), |
|
&escape('Checkout '.$infostr.' - '. |
|
$token)) ne 'ok') { |
|
return ''; |
|
} else { |
|
&logthis("<font color=\"blue\">WARNING: ". |
|
"Checkout log failed ".$tudom.' - '.$tuname.' - '.$symb. |
|
"</font>"); |
|
} |
|
return $token; |
|
} |
|
|
|
# ------------------------------------------------------------ Check in an item |
|
|
|
sub checkin { |
|
my $token=shift; |
|
my $now=time; |
|
my ($ta,$tb,$lonhost)=split(/\*/,$token); |
|
$lonhost=~tr/A-Z/a-z/; |
|
my $dtoken=$ta.'_'.&hostname($lonhost).'_'.$tb; |
|
$dtoken=~s/\W/\_/g; |
|
my ($dummy,$tuname,$tudom,$tcrsid,$symb,$chtim,$rmaddr)= |
|
split(/\&/,&unescape(&reply('tmpget:'.$dtoken,$lonhost))); |
|
|
|
unless (($tuname) && ($tudom)) { |
|
&logthis('Check in '.$token.' ('.$dtoken.') failed'); |
|
return ''; |
|
} |
|
|
|
unless (&allowed('mgr',$tcrsid)) { |
|
&logthis('Check in '.$token.' ('.$dtoken.') unauthorized: '. |
|
$env{'user.name'}.' - '.$env{'user.domain'}); |
|
return ''; |
|
} |
|
|
|
my %infohash=('resource.0.intoken' => $token, |
|
'resource.0.checkintime' => $now, |
|
'resource.0.inremote' => $ENV{'REMOTE_ADDR'}); |
|
|
|
unless (&cstore(\%infohash,$symb,$tcrsid,$tudom,$tuname) eq 'ok') { |
|
return ''; |
|
} |
|
|
|
if (&log($tudom,$tuname,&homeserver($tuname,$tudom), |
|
&escape('Checkin - '.$token)) ne 'ok') { |
|
return ''; |
|
} |
|
|
|
return ($symb,$tuname,$tudom,$tcrsid); |
|
} |
|
|
|
# --------------------------------------------- Set Expire Date for Spreadsheet |
# --------------------------------------------- Set Expire Date for Spreadsheet |
|
|
sub expirespread { |
sub expirespread { |
Line 5051 sub tmprestore {
|
Line 4851 sub tmprestore {
|
# ----------------------------------------------------------------------- Store |
# ----------------------------------------------------------------------- Store |
|
|
sub store { |
sub store { |
my ($storehash,$symb,$namespace,$domain,$stuname,$laststore) = @_; |
my ($storehash,$symb,$namespace,$domain,$stuname) = @_; |
my $home=''; |
my $home=''; |
|
|
if ($stuname) { $home=&homeserver($stuname,$domain); } |
if ($stuname) { $home=&homeserver($stuname,$domain); } |
Line 5081 sub store {
|
Line 4881 sub store {
|
} |
} |
$namevalue=~s/\&$//; |
$namevalue=~s/\&$//; |
&courselog($symb.':'.$stuname.':'.$domain.':STORE:'.$namevalue); |
&courselog($symb.':'.$stuname.':'.$domain.':STORE:'.$namevalue); |
return reply("store:$domain:$stuname:$namespace:$symb:$namevalue:$laststore","$home"); |
return reply("store:$domain:$stuname:$namespace:$symb:$namevalue","$home"); |
} |
} |
|
|
# -------------------------------------------------------------- Critical Store |
# -------------------------------------------------------------- Critical Store |
|
|
sub cstore { |
sub cstore { |
my ($storehash,$symb,$namespace,$domain,$stuname,$laststore) = @_; |
my ($storehash,$symb,$namespace,$domain,$stuname) = @_; |
my $home=''; |
my $home=''; |
|
|
if ($stuname) { $home=&homeserver($stuname,$domain); } |
if ($stuname) { $home=&homeserver($stuname,$domain); } |
Line 5118 sub cstore {
|
Line 4918 sub cstore {
|
$namevalue=~s/\&$//; |
$namevalue=~s/\&$//; |
&courselog($symb.':'.$stuname.':'.$domain.':CSTORE:'.$namevalue); |
&courselog($symb.':'.$stuname.':'.$domain.':CSTORE:'.$namevalue); |
return critical |
return critical |
("store:$domain:$stuname:$namespace:$symb:$namevalue:$laststore","$home"); |
("store:$domain:$stuname:$namespace:$symb:$namevalue","$home"); |
} |
} |
|
|
# --------------------------------------------------------------------- Restore |
# --------------------------------------------------------------------- Restore |
Line 5274 sub privileged {
|
Line 5074 sub privileged {
|
my $now = time; |
my $now = time; |
my $roles; |
my $roles; |
if (ref($possroles) eq 'ARRAY') { |
if (ref($possroles) eq 'ARRAY') { |
$roles = $possroles; |
$roles = $possroles; |
} else { |
} else { |
$roles = ['dc','su']; |
$roles = ['dc','su']; |
} |
} |
Line 5298 sub privileged {
|
Line 5098 sub privileged {
|
my %rolesdump = &dump("roles", $domain, $username) or return 0; |
my %rolesdump = &dump("roles", $domain, $username) or return 0; |
my $now = time; |
my $now = time; |
|
|
for my $role (@rolesdump{grep { ! /^rolesdef_/ } keys(%rolesdump)}) { |
for my $role (@rolesdump{grep { ! /^rolesdef_/ } keys %rolesdump}) { |
my ($trole, $tend, $tstart) = split(/_/, $role); |
my ($trole, $tend, $tstart) = split(/_/, $role); |
if (grep(/^\Q$trole\E$/,@{$roles})) { |
if (grep(/^\Q$trole\E$/,@{$roles})) { |
return 1 unless ($tend && $tend < $now) |
return 1 unless ($tend && $tend < $now) |
or ($tstart && $tstart > $now); |
or ($tstart && $tstart > $now); |
} |
} |
} |
} |
Line 5339 sub privileged_by_domain {
|
Line 5139 sub privileged_by_domain {
|
my ($trole,$uname,$udom,$rest) = split(/:/,$item,4); |
my ($trole,$uname,$udom,$rest) = split(/:/,$item,4); |
my ($end,$start) = split(/:/,$dompersonnel{$server}{$item}); |
my ($end,$start) = split(/:/,$dompersonnel{$server}{$item}); |
next if ($end && $end < $now); |
next if ($end && $end < $now); |
$privileged{$dom}{$trole}{$uname.':'.$udom} = |
$privileged{$dom}{$trole}{$uname.':'.$udom} = |
$dompersonnel{$server}{$item}; |
$dompersonnel{$server}{$item}; |
} |
} |
} |
} |
Line 5387 sub rolesinit {
|
Line 5187 sub rolesinit {
|
my %allroles=(); |
my %allroles=(); |
my %allgroups=(); |
my %allgroups=(); |
|
|
for my $area (grep { ! /^rolesdef_/ } keys(%rolesdump)) { |
for my $area (grep { ! /^rolesdef_/ } keys %rolesdump) { |
my $role = $rolesdump{$area}; |
my $role = $rolesdump{$area}; |
$area =~ s/\_\w\w$//; |
$area =~ s/\_\w\w$//; |
|
|
Line 5810 sub unserialize {
|
Line 5610 sub unserialize {
|
return {} if $rep =~ /^error/; |
return {} if $rep =~ /^error/; |
|
|
my %returnhash=(); |
my %returnhash=(); |
foreach my $item (split(/\&/,$rep)) { |
foreach my $item (split(/\&/,$rep)) { |
my ($key, $value) = split(/=/, $item, 2); |
my ($key, $value) = split(/=/, $item, 2); |
$key = unescape($key) unless $escapedkeys; |
$key = unescape($key) unless $escapedkeys; |
next if $key =~ /^error: 2 /; |
next if $key =~ /^error: 2 /; |
$returnhash{$key} = &thaw_unescape($value); |
$returnhash{$key} = &thaw_unescape($value); |
} |
} |
|
#return %returnhash; |
return \%returnhash; |
return \%returnhash; |
} |
} |
|
|
# see Lond::dump_with_regexp |
# see Lond::dump_with_regexp |
# if $escapedkeys hash keys won't get unescaped. |
# if $escapedkeys hash keys won't get unescaped. |
Line 5827 sub dump {
|
Line 5628 sub dump {
|
if (!$uname) { $uname=$env{'user.name'}; } |
if (!$uname) { $uname=$env{'user.name'}; } |
my $uhome=&homeserver($uname,$udomain); |
my $uhome=&homeserver($uname,$udomain); |
|
|
if ($regexp) { |
my $reply; |
$regexp=&escape($regexp); |
if (grep { $_ eq $uhome } current_machine_ids()) { |
} else { |
|
$regexp='.'; |
|
} |
|
if (grep { $_ eq $uhome } ¤t_machine_ids()) { |
|
# user is hosted on this machine |
# user is hosted on this machine |
my $reply = LONCAPA::Lond::dump_with_regexp(join(':', ($udomain, |
$reply = LONCAPA::Lond::dump_with_regexp(join(":", ($udomain, |
$uname, $namespace, $regexp, $range)), $perlvar{'lonVersion'}); |
$uname, $namespace, $regexp, $range)), $perlvar{'lonVersion'}); |
return %{&unserialize($reply, $escapedkeys)}; |
return %{unserialize($reply, $escapedkeys)}; |
|
} |
|
if ($regexp) { |
|
$regexp=&escape($regexp); |
|
} else { |
|
$regexp='.'; |
} |
} |
my $rep=&reply("dump:$udomain:$uname:$namespace:$regexp:$range",$uhome); |
my $rep=&reply("dump:$udomain:$uname:$namespace:$regexp:$range",$uhome); |
my @pairs=split(/\&/,$rep); |
my @pairs=split(/\&/,$rep); |
Line 5844 sub dump {
|
Line 5646 sub dump {
|
if (!($rep =~ /^error/ )) { |
if (!($rep =~ /^error/ )) { |
foreach my $item (@pairs) { |
foreach my $item (@pairs) { |
my ($key,$value)=split(/=/,$item,2); |
my ($key,$value)=split(/=/,$item,2); |
$key = &unescape($key) unless ($escapedkeys); |
$key = unescape($key) unless $escapedkeys; |
|
#$key = &unescape($key); |
next if ($key =~ /^error: 2 /); |
next if ($key =~ /^error: 2 /); |
$returnhash{$key}=&thaw_unescape($value); |
$returnhash{$key}=&thaw_unescape($value); |
} |
} |
Line 5888 sub currentdump {
|
Line 5691 sub currentdump {
|
my $rep; |
my $rep; |
|
|
if (grep { $_ eq $uhome } current_machine_ids()) { |
if (grep { $_ eq $uhome } current_machine_ids()) { |
$rep = LONCAPA::Lond::dump_profile_database(join(":", ($sdom, $sname, |
$rep = LONCAPA::Lond::dump_profile_database(join(":", ($sdom, $sname, |
$courseid))); |
$courseid))); |
} else { |
} else { |
$rep = reply('currentdump:'.$sdom.':'.$sname.':'.$courseid,$uhome); |
$rep = reply('currentdump:'.$sdom.':'.$sname.':'.$courseid,$uhome); |
Line 6014 sub newput {
|
Line 5817 sub newput {
|
# --------------------------------------------------------- putstore interface |
# --------------------------------------------------------- putstore interface |
|
|
sub putstore { |
sub putstore { |
my ($namespace,$symb,$version,$storehash,$udomain,$uname,$tolog)=@_; |
my ($namespace,$symb,$version,$storehash,$udomain,$uname)=@_; |
if (!$udomain) { $udomain=$env{'user.domain'}; } |
if (!$udomain) { $udomain=$env{'user.domain'}; } |
if (!$uname) { $uname=$env{'user.name'}; } |
if (!$uname) { $uname=$env{'user.name'}; } |
my $uhome=&homeserver($uname,$udomain); |
my $uhome=&homeserver($uname,$udomain); |
Line 6028 sub putstore {
|
Line 5831 sub putstore {
|
my $reply = |
my $reply = |
&reply("putstore:$udomain:$uname:$namespace:$esc_symb:$esc_v:$items", |
&reply("putstore:$udomain:$uname:$namespace:$esc_symb:$esc_v:$items", |
$uhome); |
$uhome); |
if (($tolog) && ($reply eq 'ok')) { |
|
my $namevalue=''; |
|
foreach my $key (keys(%{$storehash})) { |
|
$namevalue.=&escape($key).'='.&freeze_escape($storehash->{$key}).'&'; |
|
} |
|
$namevalue .= 'ip='.&escape($ENV{'REMOTE_ADDR'}). |
|
'&host='.&escape($perlvar{'lonHostID'}). |
|
'&version='.$esc_v. |
|
'&by='.&escape($env{'user.name'}.':'.$env{'user.domain'}); |
|
&Apache::lonnet::courselog($symb.':'.$uname.':'.$udomain.':PUTSTORE:'.$namevalue); |
|
} |
|
if ($reply eq 'unknown_cmd') { |
if ($reply eq 'unknown_cmd') { |
# gfall back to way things use to be done |
# gfall back to way things use to be done |
return &old_putstore($namespace,$symb,$version,$storehash,$udomain, |
return &old_putstore($namespace,$symb,$version,$storehash,$udomain, |
Line 6147 sub tmpdel {
|
Line 5939 sub tmpdel {
|
return &reply("tmpdel:$token",$server); |
return &reply("tmpdel:$token",$server); |
} |
} |
|
|
# ------------------------------------------------------------ get_timebased_id |
# ------------------------------------------------------------ get_timebased_id |
|
|
sub get_timebased_id { |
sub get_timebased_id { |
my ($prefix,$keyid,$namespace,$cdom,$cnum,$idtype,$who,$locktries, |
my ($prefix,$keyid,$namespace,$cdom,$cnum,$idtype,$who,$locktries, |
$maxtries) = @_; |
$maxtries) = @_; |
my ($newid,$error,$dellock); |
my ($newid,$error,$dellock); |
unless (($prefix =~ /^\w+$/) && ($keyid =~ /^\w+$/) && ($namespace ne '')) { |
unless (($prefix =~ /^\w+$/) && ($keyid =~ /^\w+$/) && ($namespace ne '')) { |
return ('','ok','invalid call to get suffix'); |
return ('','ok','invalid call to get suffix'); |
} |
} |
|
|
Line 6167 sub get_timebased_id {
|
Line 5959 sub get_timebased_id {
|
if (!$maxtries) { |
if (!$maxtries) { |
$maxtries = 10; |
$maxtries = 10; |
} |
} |
|
|
if (($cdom eq '') || ($cnum eq '')) { |
if (($cdom eq '') || ($cnum eq '')) { |
if ($env{'request.course.id'}) { |
if ($env{'request.course.id'}) { |
$cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
$cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
Line 6197 sub get_timebased_id {
|
Line 5989 sub get_timebased_id {
|
my %inuse = &Apache::lonnet::dump('nohist_'.$namespace,$cdom,$cnum,$prefix); |
my %inuse = &Apache::lonnet::dump('nohist_'.$namespace,$cdom,$cnum,$prefix); |
my $id = time; |
my $id = time; |
$newid = $id; |
$newid = $id; |
if ($idtype eq 'addcode') { |
|
$newid .= &sixnum_code(); |
|
} |
|
my $idtries = 0; |
my $idtries = 0; |
while (exists($inuse{$prefix."\0".$newid}) && $idtries < $maxtries) { |
while (exists($inuse{$prefix."\0".$newid}) && $idtries < $maxtries) { |
if ($idtype eq 'concat') { |
if ($idtype eq 'concat') { |
$newid = $id.$idtries; |
$newid = $id.$idtries; |
} elsif ($idtype eq 'addcode') { |
|
$newid = $newid.&sixnum_code(); |
|
} else { |
} else { |
$newid ++; |
$newid ++; |
} |
} |
Line 6222 sub get_timebased_id {
|
Line 6009 sub get_timebased_id {
|
$error = 'error saving new item: '.$putresult; |
$error = 'error saving new item: '.$putresult; |
} |
} |
} else { |
} else { |
undef($newid); |
|
$error = ('error: no unique suffix available for the new item '); |
$error = ('error: no unique suffix available for the new item '); |
} |
} |
# remove lock |
# remove lock |
Line 6231 sub get_timebased_id {
|
Line 6017 sub get_timebased_id {
|
} else { |
} else { |
$error = "error: could not obtain lockfile\n"; |
$error = "error: could not obtain lockfile\n"; |
$dellock = 'ok'; |
$dellock = 'ok'; |
if (($prefix eq 'paste') && ($namespace eq 'courseeditor') && ($keyid eq 'num')) { |
|
$dellock = 'nolock'; |
|
} |
|
} |
} |
return ($newid,$dellock,$error); |
return ($newid,$dellock,$error); |
} |
} |
|
|
sub sixnum_code { |
|
my $code; |
|
for (0..6) { |
|
$code .= int( rand(9) ); |
|
} |
|
return $code; |
|
} |
|
|
|
# -------------------------------------------------- portfolio access checking |
# -------------------------------------------------- portfolio access checking |
|
|
sub portfolio_access { |
sub portfolio_access { |
my ($requrl,$clientip) = @_; |
my ($requrl) = @_; |
my (undef,$udom,$unum,$file_name,$group) = &parse_portfolio_url($requrl); |
my (undef,$udom,$unum,$file_name,$group) = &parse_portfolio_url($requrl); |
my $result = &get_portfolio_access($udom,$unum,$file_name,$group,$clientip); |
my $result = &get_portfolio_access($udom,$unum,$file_name,$group); |
if ($result) { |
if ($result) { |
my %setters; |
my %setters; |
if ($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public') { |
if ($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public') { |
Line 6277 sub portfolio_access {
|
Line 6052 sub portfolio_access {
|
} |
} |
|
|
sub get_portfolio_access { |
sub get_portfolio_access { |
my ($udom,$unum,$file_name,$group,$clientip,$access_hash) = @_; |
my ($udom,$unum,$file_name,$group,$access_hash) = @_; |
|
|
if (!ref($access_hash)) { |
if (!ref($access_hash)) { |
my $current_perms = &get_portfile_permissions($udom,$unum); |
my $current_perms = &get_portfile_permissions($udom,$unum); |
Line 6286 sub get_portfolio_access {
|
Line 6061 sub get_portfolio_access {
|
$access_hash = $access_controls{$file_name}; |
$access_hash = $access_controls{$file_name}; |
} |
} |
|
|
my ($public,$guest,@domains,@users,@courses,@groups,@ips); |
my ($public,$guest,@domains,@users,@courses,@groups); |
my $now = time; |
my $now = time; |
if (ref($access_hash) eq 'HASH') { |
if (ref($access_hash) eq 'HASH') { |
foreach my $key (keys(%{$access_hash})) { |
foreach my $key (keys(%{$access_hash})) { |
Line 6310 sub get_portfolio_access {
|
Line 6085 sub get_portfolio_access {
|
push(@courses,$key); |
push(@courses,$key); |
} elsif ($scope eq 'group') { |
} elsif ($scope eq 'group') { |
push(@groups,$key); |
push(@groups,$key); |
} elsif ($scope eq 'ip') { |
|
push(@ips,$key); |
|
} |
} |
} |
} |
if ($public) { |
if ($public) { |
return 'ok'; |
return 'ok'; |
} elsif (@ips > 0) { |
|
my $allowed; |
|
foreach my $ipkey (@ips) { |
|
if (ref($access_hash->{$ipkey}{'ip'}) eq 'ARRAY') { |
|
if (&Apache::loncommon::check_ip_acc(join(',',@{$access_hash->{$ipkey}{'ip'}}),$clientip)) { |
|
$allowed = 1; |
|
last; |
|
} |
|
} |
|
} |
|
if ($allowed) { |
|
return 'ok'; |
|
} |
|
} |
} |
if ($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public') { |
if ($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public') { |
if ($guest) { |
if ($guest) { |
Line 6550 sub usertools_access {
|
Line 6310 sub usertools_access {
|
|
|
my ($toolstatus,$inststatus,$envkey); |
my ($toolstatus,$inststatus,$envkey); |
if ($context eq 'requestauthor') { |
if ($context eq 'requestauthor') { |
$envkey = $context; |
$envkey = $context; |
} else { |
} else { |
$envkey = $context.'.'.$tool; |
$envkey = $context.'.'.$tool; |
} |
} |
Line 6812 sub customaccess {
|
Line 6572 sub customaccess {
|
# ------------------------------------------------- Check for a user privilege |
# ------------------------------------------------- Check for a user privilege |
|
|
sub allowed { |
sub allowed { |
my ($priv,$uri,$symb,$role,$clientip,$noblockcheck)=@_; |
my ($priv,$uri,$symb,$role)=@_; |
my $ver_orguri=$uri; |
my $ver_orguri=$uri; |
$uri=&deversion($uri); |
$uri=&deversion($uri); |
my $orguri=$uri; |
my $orguri=$uri; |
Line 7007 sub allowed {
|
Line 6767 sub allowed {
|
if ($match) { |
if ($match) { |
if ($env{'user.priv.'.$env{'request.role'}.'./'} |
if ($env{'user.priv.'.$env{'request.role'}.'./'} |
=~/\Q$priv\E\&([^\:]*)/) { |
=~/\Q$priv\E\&([^\:]*)/) { |
my $value = $1; |
my @blockers = &has_comm_blocking($priv,$symb,$uri); |
if ($noblockcheck) { |
if (@blockers > 0) { |
$thisallowed.=$value; |
$thisallowed = 'B'; |
} else { |
} else { |
my @blockers = &has_comm_blocking($priv,$symb,$uri); |
$thisallowed.=$1; |
if (@blockers > 0) { |
|
$thisallowed = 'B'; |
|
} else { |
|
$thisallowed.=$value; |
|
} |
|
} |
} |
} |
} |
} else { |
} else { |
Line 7028 sub allowed {
|
Line 6783 sub allowed {
|
$refuri=&declutter($refuri); |
$refuri=&declutter($refuri); |
my ($match) = &is_on_map($refuri); |
my ($match) = &is_on_map($refuri); |
if ($match) { |
if ($match) { |
if ($noblockcheck) { |
my @blockers = &has_comm_blocking($priv,$symb,$refuri); |
$thisallowed='F'; |
if (@blockers > 0) { |
|
$thisallowed = 'B'; |
} else { |
} else { |
my @blockers = &has_comm_blocking($priv,$symb,$refuri); |
$thisallowed='F'; |
if (@blockers > 0) { |
|
$thisallowed = 'B'; |
|
} else { |
|
$thisallowed='F'; |
|
} |
|
} |
} |
} |
} |
} |
} |
Line 7048 sub allowed {
|
Line 6799 sub allowed {
|
&& $thisallowed ne 'F' |
&& $thisallowed ne 'F' |
&& $thisallowed ne '2' |
&& $thisallowed ne '2' |
&& &is_portfolio_url($uri)) { |
&& &is_portfolio_url($uri)) { |
$thisallowed = &portfolio_access($uri,$clientip); |
$thisallowed = &portfolio_access($uri); |
} |
} |
|
|
# Full access at system, domain or course-wide level? Exit. |
# Full access at system, domain or course-wide level? Exit. |
if ($thisallowed=~/F/) { |
if ($thisallowed=~/F/) { |
return 'F'; |
return 'F'; |
Line 7091 sub allowed {
|
Line 6842 sub allowed {
|
=~/\Q$priv\E\&([^\:]*)/) { |
=~/\Q$priv\E\&([^\:]*)/) { |
my $value = $1; |
my $value = $1; |
if ($priv eq 'bre') { |
if ($priv eq 'bre') { |
if ($noblockcheck) { |
my @blockers = &has_comm_blocking($priv,$symb,$uri); |
$thisallowed.=$value; |
if (@blockers > 0) { |
|
$thisallowed = 'B'; |
} else { |
} else { |
my @blockers = &has_comm_blocking($priv,$symb,$uri); |
$thisallowed.=$value; |
if (@blockers > 0) { |
|
$thisallowed = 'B'; |
|
} else { |
|
$thisallowed.=$value; |
|
} |
|
} |
} |
} else { |
} else { |
$thisallowed.=$value; |
$thisallowed.=$value; |
Line 7133 sub allowed {
|
Line 6880 sub allowed {
|
=~/\Q$priv\E\&([^\:]*)/) { |
=~/\Q$priv\E\&([^\:]*)/) { |
my $value = $1; |
my $value = $1; |
if ($priv eq 'bre') { |
if ($priv eq 'bre') { |
if ($noblockcheck) { |
my @blockers = &has_comm_blocking($priv,$symb,$refuri); |
$thisallowed.=$value; |
if (@blockers > 0) { |
|
$thisallowed = 'B'; |
} else { |
} else { |
my @blockers = &has_comm_blocking($priv,$symb,$refuri); |
$thisallowed.=$value; |
if (@blockers > 0) { |
|
$thisallowed = 'B'; |
|
} else { |
|
$thisallowed.=$value; |
|
} |
|
} |
} |
} else { |
} else { |
$thisallowed.=$value; |
$thisallowed.=$value; |
Line 7317 sub constructaccess {
|
Line 7060 sub constructaccess {
|
my ($ownername,$ownerdomain,$ownerhome); |
my ($ownername,$ownerdomain,$ownerhome); |
|
|
($ownerdomain,$ownername) = |
($ownerdomain,$ownername) = |
($url=~ m{^(?:\Q$perlvar{'lonDocRoot'}\E|)/priv/($match_domain)/($match_username)(?:/|$)}); |
($url=~ m{^(?:\Q$perlvar{'lonDocRoot'}\E|)/priv/($match_domain)/($match_username)/}); |
|
|
# The URL does not really point to any authorspace, forget it |
# The URL does not really point to any authorspace, forget it |
unless (($ownername) && ($ownerdomain)) { return ''; } |
unless (($ownername) && ($ownerdomain)) { return ''; } |
Line 7372 sub constructaccess {
|
Line 7115 sub constructaccess {
|
return ''; |
return ''; |
} |
} |
|
|
# ----------------------------------------------------------- Content Blocking |
|
|
|
{ |
|
# Caches for faster Course Contents display where content blocking |
|
# is in operation (i.e., interval param set) for timed quiz. |
|
# |
|
# User for whom data are being temporarily cached. |
|
my $cacheduser=''; |
|
# Cached blockers for this user (a hash of blocking items). |
|
my %cachedblockers=(); |
|
# When the data were last cached. |
|
my $cachedlast=''; |
|
|
|
sub load_all_blockers { |
|
my ($uname,$udom,$blocks)=@_; |
|
if (($uname ne '') && ($udom ne '')) { |
|
if (($cacheduser eq $uname.':'.$udom) && |
|
(abs($cachedlast-time)<5)) { |
|
return; |
|
} |
|
} |
|
$cachedlast=time; |
|
$cacheduser=$uname.':'.$udom; |
|
%cachedblockers = &get_commblock_resources($blocks); |
|
} |
|
|
|
sub get_comm_blocks { |
sub get_comm_blocks { |
my ($cdom,$cnum) = @_; |
my ($cdom,$cnum) = @_; |
if ($cdom eq '' || $cnum eq '') { |
if ($cdom eq '' || $cnum eq '') { |
Line 7418 sub get_comm_blocks {
|
Line 7135 sub get_comm_blocks {
|
return %commblocks; |
return %commblocks; |
} |
} |
|
|
sub get_commblock_resources { |
sub has_comm_blocking { |
my ($blocks) = @_; |
my ($priv,$symb,$uri,$blocks) = @_; |
my %blockers = (); |
return unless ($env{'request.course.id'}); |
return %blockers unless ($env{'request.course.id'}); |
return unless ($priv eq 'bre'); |
return %blockers if ($env{'user.priv.'.$env{'request.role'}} =~/evb\&([^\:]*)/); |
return if ($env{'user.priv.'.$env{'request.role'}} =~/evb\&([^\:]*)/); |
my %commblocks; |
my %commblocks; |
if (ref($blocks) eq 'HASH') { |
if (ref($blocks) eq 'HASH') { |
%commblocks = %{$blocks}; |
%commblocks = %{$blocks}; |
} else { |
} else { |
%commblocks = &get_comm_blocks(); |
%commblocks = &get_comm_blocks(); |
} |
} |
return %blockers unless (keys(%commblocks) > 0); |
return unless (keys(%commblocks) > 0); |
my $navmap = Apache::lonnavmaps::navmap->new(); |
if (!$symb) { $symb=&symbread($uri,1); } |
return %blockers unless (ref($navmap)); |
my ($map,$resid,undef)=&decode_symb($symb); |
|
my %tocheck = ( |
|
maps => $map, |
|
resources => $symb, |
|
); |
|
my @blockers; |
my $now = time; |
my $now = time; |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
foreach my $block (keys(%commblocks)) { |
foreach my $block (keys(%commblocks)) { |
if ($block =~ /^(\d+)____(\d+)$/) { |
if ($block =~ /^(\d+)____(\d+)$/) { |
my ($start,$end) = ($1,$2); |
my ($start,$end) = ($1,$2); |
Line 7440 sub get_commblock_resources {
|
Line 7163 sub get_commblock_resources {
|
if (ref($commblocks{$block}{'blocks'}) eq 'HASH') { |
if (ref($commblocks{$block}{'blocks'}) eq 'HASH') { |
if (ref($commblocks{$block}{'blocks'}{'docs'}) eq 'HASH') { |
if (ref($commblocks{$block}{'blocks'}{'docs'}) eq 'HASH') { |
if (ref($commblocks{$block}{'blocks'}{'docs'}{'maps'}) eq 'HASH') { |
if (ref($commblocks{$block}{'blocks'}{'docs'}{'maps'}) eq 'HASH') { |
if (keys(%{$commblocks{$block}{'blocks'}{'docs'}{'maps'}})) { |
if ($commblocks{$block}{'blocks'}{'docs'}{'maps'}{$map}) { |
$blockers{$block}{maps} = $commblocks{$block}{'blocks'}{'docs'}{'maps'}; |
unless (grep(/^\Q$block\E$/,@blockers)) { |
|
push(@blockers,$block); |
|
} |
} |
} |
} |
} |
if (ref($commblocks{$block}{'blocks'}{'docs'}{'resources'}) eq 'HASH') { |
if (ref($commblocks{$block}{'blocks'}{'docs'}{'resources'}) eq 'HASH') { |
if (keys(%{$commblocks{$block}{'blocks'}{'docs'}{'resources'}})) { |
if ($commblocks{$block}{'blocks'}{'docs'}{'resources'}{$symb}) { |
$blockers{$block}{'resources'} = $commblocks{$block}{'blocks'}{'docs'}{'resources'}; |
unless (grep(/^\Q$block\E$/,@blockers)) { |
|
push(@blockers,$block); |
|
} |
} |
} |
} |
} |
} |
} |
Line 7457 sub get_commblock_resources {
|
Line 7184 sub get_commblock_resources {
|
my @to_test; |
my @to_test; |
if (ref($commblocks{$block}{'blocks'}) eq 'HASH') { |
if (ref($commblocks{$block}{'blocks'}) eq 'HASH') { |
if (ref($commblocks{$block}{'blocks'}{'docs'}) eq 'HASH') { |
if (ref($commblocks{$block}{'blocks'}{'docs'}) eq 'HASH') { |
my @interval; |
my $check_interval; |
my $type = 'map'; |
if (&check_docs_block($commblocks{$block}{'blocks'}{'docs'},\%tocheck)) { |
if ($item eq 'course') { |
my @interval; |
$type = 'course'; |
my $type = 'map'; |
@interval=&EXT("resource.0.interval"); |
if ($item eq 'course') { |
} else { |
$type = 'course'; |
if ($item =~ /___\d+___/) { |
@interval=&EXT("resource.0.interval"); |
$type = 'resource'; |
|
@interval=&EXT("resource.0.interval",$item); |
|
if (ref($navmap)) { |
|
my $res = $navmap->getBySymb($item); |
|
push(@to_test,$res); |
|
} |
|
} else { |
} else { |
my $mapsymb = &symbread($item,1); |
if ($item =~ /___\d+___/) { |
if ($mapsymb) { |
$type = 'resource'; |
if (ref($navmap)) { |
@interval=&EXT("resource.0.interval",$item); |
my $mapres = $navmap->getBySymb($mapsymb); |
if (ref($navmap)) { |
@to_test = $mapres->retrieveResources($mapres,undef,0,0,0,1); |
my $res = $navmap->getBySymb($item); |
foreach my $res (@to_test) { |
push(@to_test,$res); |
my $symb = $res->symb(); |
} |
next if ($symb eq $mapsymb); |
} else { |
if ($symb ne '') { |
my $mapsymb = &symbread($item,1); |
@interval=&EXT("resource.0.interval",$symb); |
if ($mapsymb) { |
if ($interval[1] eq 'map') { |
if (ref($navmap)) { |
|
my $mapres = $navmap->getBySymb($mapsymb); |
|
@to_test = $mapres->retrieveResources($mapres,undef,0,1); |
|
foreach my $res (@to_test) { |
|
my $symb = $res->symb(); |
|
next if ($symb eq $mapsymb); |
|
if ($symb ne '') { |
|
@interval=&EXT("resource.0.interval",$symb); |
last; |
last; |
} |
} |
} |
} |
Line 7489 sub get_commblock_resources {
|
Line 7217 sub get_commblock_resources {
|
} |
} |
} |
} |
} |
} |
} |
if ($interval[0] =~ /\d+/) { |
if ($interval[0] =~ /^\d+$/) { |
my $first_access; |
my $first_access; |
if ($type eq 'resource') { |
if ($type eq 'resource') { |
$first_access=&get_first_access($interval[1],$item); |
$first_access=&get_first_access($interval[1],$item); |
} elsif ($type eq 'map') { |
} elsif ($type eq 'map') { |
$first_access=&get_first_access($interval[1],undef,$item); |
$first_access=&get_first_access($interval[1],undef,$item); |
} else { |
} else { |
$first_access=&get_first_access($interval[1]); |
$first_access=&get_first_access($interval[1]); |
} |
} |
if ($first_access) { |
if ($first_access) { |
my $timesup = $first_access+$interval[0]; |
my $timesup = $first_access+$interval[0]; |
if ($timesup > $now) { |
if ($timesup > $now) { |
foreach my $res (@to_test) { |
my $activeblock; |
if ($res->is_problem()) { |
foreach my $res (@to_test) { |
if ($res->completable()) { |
if ($res->answerable()) { |
unless (grep(/^\Q$block\E$/,@blockers)) { |
$activeblock = 1; |
push(@blockers,$block); |
last; |
} |
} |
last; |
} |
} |
if ($activeblock) { |
|
if (ref($commblocks{$block}{'blocks'}{'docs'}{'maps'}) eq 'HASH') { |
|
if (keys(%{$commblocks{$block}{'blocks'}{'docs'}{'maps'}})) { |
|
$blockers{$block}{'maps'} = $commblocks{$block}{'blocks'}{'docs'}{'maps'}; |
|
} |
|
} |
|
if (ref($commblocks{$block}{'blocks'}{'docs'}{'resources'}) eq 'HASH') { |
|
if (keys(%{$commblocks{$block}{'blocks'}{'docs'}{'resources'}})) { |
|
$blockers{$block}{'resources'} = $commblocks{$block}{'blocks'}{'docs'}{'resources'}; |
|
} |
} |
} |
} |
} |
} |
Line 7528 sub get_commblock_resources {
|
Line 7247 sub get_commblock_resources {
|
} |
} |
} |
} |
} |
} |
return %blockers; |
return @blockers; |
} |
} |
|
|
sub has_comm_blocking { |
sub check_docs_block { |
my ($priv,$symb,$uri,$blocks) = @_; |
my ($docsblock,$tocheck) =@_; |
my @blockers; |
if ((ref($docsblock) ne 'HASH') || (ref($tocheck) ne 'HASH')) { |
return unless ($env{'request.course.id'}); |
return; |
return unless ($priv eq 'bre'); |
|
return if ($env{'user.priv.'.$env{'request.role'}} =~/evb\&([^\:]*)/); |
|
return if ($env{'request.state'} eq 'construct'); |
|
&load_all_blockers($env{'user.name'},$env{'user.domain'},$blocks); |
|
return unless (keys(%cachedblockers) > 0); |
|
my (%possibles,@symbs); |
|
if (!$symb) { |
|
$symb = &symbread($uri,1,1,1,\%possibles); |
|
} |
} |
if ($symb) { |
if (ref($docsblock->{'maps'}) eq 'HASH') { |
@symbs = ($symb); |
if ($tocheck->{'maps'}) { |
} elsif (keys(%possibles)) { |
if ($docsblock->{'maps'}{$tocheck->{'maps'}}) { |
@symbs = keys(%possibles); |
return 1; |
} |
|
my $noblock; |
|
foreach my $symb (@symbs) { |
|
last if ($noblock); |
|
my ($map,$resid,$resurl)=&decode_symb($symb); |
|
foreach my $block (keys(%cachedblockers)) { |
|
if ($block =~ /^firstaccess____(.+)$/) { |
|
my $item = $1; |
|
if (($item eq $map) || ($item eq $symb)) { |
|
$noblock = 1; |
|
last; |
|
} |
|
} |
|
if (ref($cachedblockers{$block}) eq 'HASH') { |
|
if (ref($cachedblockers{$block}{'resources'}) eq 'HASH') { |
|
if ($cachedblockers{$block}{'resources'}{$symb}) { |
|
unless (grep(/^\Q$block\E$/,@blockers)) { |
|
push(@blockers,$block); |
|
} |
|
} |
|
} |
|
} |
} |
if (ref($cachedblockers{$block}{'maps'}) eq 'HASH') { |
} |
if ($cachedblockers{$block}{'maps'}{$map}) { |
} |
unless (grep(/^\Q$block\E$/,@blockers)) { |
if (ref($docsblock->{'resources'}) eq 'HASH') { |
push(@blockers,$block); |
if ($tocheck->{'resources'}) { |
} |
if ($docsblock->{'resources'}{$tocheck->{'resources'}}) { |
} |
return 1; |
} |
} |
} |
} |
} |
} |
return if ($noblock); |
return; |
return @blockers; |
|
} |
|
} |
} |
|
|
# -------------------------------- Deversion and split uri into path an filename |
|
|
|
# |
# |
# Removes the version from a URI and |
# Removes the versino from a URI and |
# splits it in to its filename and path to the filename. |
# splits it in to its filename and path to the filename. |
# Seems like File::Basename could have done this more clearly. |
# Seems like File::Basename could have done this more clearly. |
# Parameters: |
# Parameters: |
Line 7702 sub metadata_query {
|
Line 7388 sub metadata_query {
|
my @server_list = (defined($server_array) ? @$server_array |
my @server_list = (defined($server_array) ? @$server_array |
: keys(%libserv) ); |
: keys(%libserv) ); |
for my $server (@server_list) { |
for my $server (@server_list) { |
my $domains = ''; |
my $domains = ''; |
if (ref($domains_hash) eq 'HASH') { |
if (ref($domains_hash) eq 'HASH') { |
$domains = $domains_hash->{$server}; |
$domains = $domains_hash->{$server}; |
} |
} |
unless ($custom or $customshow) { |
unless ($custom or $customshow) { |
my $reply=&reply("querysend:".&escape($query).':::'.&escape($domains),$server); |
my $reply=&reply("querysend:".&escape($query).':::'.&escape($domains),$server); |
Line 7769 sub update_allusers_table {
|
Line 7455 sub update_allusers_table {
|
|
|
sub fetch_enrollment_query { |
sub fetch_enrollment_query { |
my ($context,$affiliatesref,$replyref,$dom,$cnum) = @_; |
my ($context,$affiliatesref,$replyref,$dom,$cnum) = @_; |
my ($homeserver,$sleep,$loopmax); |
my $homeserver; |
my $maxtries = 1; |
my $maxtries = 1; |
if ($context eq 'automated') { |
if ($context eq 'automated') { |
$homeserver = $perlvar{'lonHostID'}; |
$homeserver = $perlvar{'lonHostID'}; |
$sleep = 2; |
|
$loopmax = 100; |
|
$maxtries = 10; # will wait for up to 2000s for retrieval of classlist data before timeout |
$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 7792 sub fetch_enrollment_query {
|
Line 7476 sub fetch_enrollment_query {
|
&logthis('fetch_enrollment_query: invalid queryid: '.$queryid.' for host: '.$host.' and homeserver: '.$homeserver.' context: '.$context.' '.$cnum); |
&logthis('fetch_enrollment_query: invalid queryid: '.$queryid.' for host: '.$host.' and homeserver: '.$homeserver.' context: '.$context.' '.$cnum); |
return 'error: '.$queryid; |
return 'error: '.$queryid; |
} |
} |
my $reply = &get_query_reply($queryid,$sleep.$loopmax); |
my $reply = &get_query_reply($queryid); |
my $tries = 1; |
my $tries = 1; |
while (($reply=~/^timeout/) && ($tries < $maxtries)) { |
while (($reply=~/^timeout/) && ($tries < $maxtries)) { |
$reply = &get_query_reply($queryid,$sleep,$loopmax); |
$reply = &get_query_reply($queryid); |
$tries ++; |
$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.' maxtries: '.$maxtries.' tries: '.$tries); |
&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 (grep { $_ eq $homeserver } ¤t_machine_ids()) { |
if ($homeserver eq $perlvar{'lonHostID'}) { |
foreach my $line (@responses) { |
foreach my $line (@responses) { |
my ($key,$value) = split(/=/,$line,2); |
my ($key,$value) = split(/=/,$line,2); |
$$replyref{$key} = $value; |
$$replyref{$key} = $value; |
Line 7837 sub fetch_enrollment_query {
|
Line 7521 sub fetch_enrollment_query {
|
} |
} |
|
|
sub get_query_reply { |
sub get_query_reply { |
my ($queryid,$sleep,$loopmax) = @_; |
my $queryid=shift; |
if (($sleep eq '') || ($sleep !~ /^\d+\.?\d*$/)) { |
|
$sleep = 0.2; |
|
} |
|
if (($loopmax eq '') || ($loopmax =~ /\D/)) { |
|
$loopmax = 100; |
|
} |
|
my $replyfile=LONCAPA::tempdir().$queryid; |
my $replyfile=LONCAPA::tempdir().$queryid; |
my $reply=''; |
my $reply=''; |
for (1..$loopmax) { |
for (1..100) { |
sleep($sleep); |
sleep 2; |
if (-e $replyfile.'.end') { |
if (-e $replyfile.'.end') { |
if (open(my $fh,$replyfile)) { |
if (open(my $fh,$replyfile)) { |
$reply = join('',<$fh>); |
$reply = join('',<$fh>); |
Line 8257 sub auto_crsreq_update {
|
Line 7935 sub auto_crsreq_update {
|
':'.&escape($action).':'.&escape($ownername).':'. |
':'.&escape($action).':'.&escape($ownername).':'. |
&escape($ownerdomain).':'.&escape($fullname).':'. |
&escape($ownerdomain).':'.&escape($fullname).':'. |
&escape($title).':'.&escape($code).':'. |
&escape($title).':'.&escape($code).':'. |
&escape($accessstart).':'.&escape($accessend).':'.$info,$homeserver); |
&escape($accessstart).':'.&escape($accessend).':'.$info, |
|
$homeserver); |
unless ($response =~ /(con_lost|error|no_such_host|refused)/) { |
unless ($response =~ /(con_lost|error|no_such_host|refused)/) { |
my @items = split(/&/,$response); |
my @items = split(/&/,$response); |
foreach my $item (@items) { |
foreach my $item (@items) { |
Line 8269 sub auto_crsreq_update {
|
Line 7948 sub auto_crsreq_update {
|
return \%crsreqresponse; |
return \%crsreqresponse; |
} |
} |
|
|
sub auto_export_grades { |
|
my ($cdom,$cnum,$inforef,$gradesref) = @_; |
|
my ($homeserver,%exportresponse); |
|
if ($cdom =~ /^$match_domain$/) { |
|
$homeserver = &domain($cdom,'primary'); |
|
} |
|
unless (($homeserver eq 'no_host') || ($homeserver eq '')) { |
|
my $info; |
|
if (ref($inforef) eq 'HASH') { |
|
$info = &freeze_escape($inforef); |
|
} |
|
if (ref($gradesref) eq 'HASH') { |
|
my $grades = &freeze_escape($gradesref); |
|
my $response=&reply('encrypt:autoexportgrades:'.$cdom.':'.$cnum.':'. |
|
$info.':'.$grades,$homeserver); |
|
unless ($response =~ /(con_lost|error|no_such_host|refused|unknown_command)/) { |
|
my @items = split(/&/,$response); |
|
foreach my $item (@items) { |
|
my ($key,$value) = split('=',$item); |
|
$exportresponse{&unescape($key)} = &thaw_unescape($value); |
|
} |
|
} |
|
} |
|
} |
|
return \%exportresponse; |
|
} |
|
|
|
sub check_instcode_cloning { |
|
my ($codedefaults,$code_order,$cloner,$clonefromcode,$clonetocode) = @_; |
|
unless ((ref($codedefaults) eq 'HASH') && (ref($code_order) eq 'ARRAY')) { |
|
return; |
|
} |
|
my $canclone; |
|
if (@{$code_order} > 0) { |
|
my $instcoderegexp ='^'; |
|
my @clonecodes = split(/\&/,$cloner); |
|
foreach my $item (@{$code_order}) { |
|
if (grep(/^\Q$item\E=/,@clonecodes)) { |
|
foreach my $pair (@clonecodes) { |
|
my ($key,$val) = split(/\=/,$pair,2); |
|
$val = &unescape($val); |
|
if ($key eq $item) { |
|
$instcoderegexp .= '('.$val.')'; |
|
last; |
|
} |
|
} |
|
} else { |
|
$instcoderegexp .= $codedefaults->{$item}; |
|
} |
|
} |
|
$instcoderegexp .= '$'; |
|
my (@from,@to); |
|
eval { |
|
(@from) = ($clonefromcode =~ /$instcoderegexp/); |
|
(@to) = ($clonetocode =~ /$instcoderegexp/); |
|
}; |
|
if ((@from > 0) && (@to > 0)) { |
|
my @diffs = &Apache::loncommon::compare_arrays(\@from,\@to); |
|
if (!@diffs) { |
|
$canclone = 1; |
|
} |
|
} |
|
} |
|
return $canclone; |
|
} |
|
|
|
sub default_instcode_cloning { |
|
my ($clonedom,$domdefclone,$clonefromcode,$clonetocode,$codedefaultsref,$codeorderref) = @_; |
|
my (%codedefaults,@code_order,$canclone); |
|
if ((ref($codedefaultsref) eq 'HASH') && (ref($codeorderref) eq 'ARRAY')) { |
|
%codedefaults = %{$codedefaultsref}; |
|
@code_order = @{$codeorderref}; |
|
} elsif ($clonedom) { |
|
&auto_instcode_defaults($clonedom,\%codedefaults,\@code_order); |
|
} |
|
if (($domdefclone) && (@code_order)) { |
|
my @clonecodes = split(/\+/,$domdefclone); |
|
my $instcoderegexp ='^'; |
|
foreach my $item (@code_order) { |
|
if (grep(/^\Q$item\E$/,@clonecodes)) { |
|
$instcoderegexp .= '('.$codedefaults{$item}.')'; |
|
} else { |
|
$instcoderegexp .= $codedefaults{$item}; |
|
} |
|
} |
|
$instcoderegexp .= '$'; |
|
my (@from,@to); |
|
eval { |
|
(@from) = ($clonefromcode =~ /$instcoderegexp/); |
|
(@to) = ($clonetocode =~ /$instcoderegexp/); |
|
}; |
|
if ((@from > 0) && (@to > 0)) { |
|
my @diffs = &Apache::loncommon::compare_arrays(\@from,\@to); |
|
if (!@diffs) { |
|
$canclone = 1; |
|
} |
|
} |
|
} |
|
return $canclone; |
|
} |
|
|
|
# ------------------------------------------------------- Course Group routines |
# ------------------------------------------------------- Course Group routines |
|
|
sub get_coursegroups { |
sub get_coursegroups { |
Line 8638 sub assignrole {
|
Line 8216 sub assignrole {
|
} |
} |
} |
} |
} elsif ($context eq 'requestauthor') { |
} elsif ($context eq 'requestauthor') { |
if (($udom eq $env{'user.domain'}) && ($uname eq $env{'user.name'}) && |
if (($udom eq $env{'user.domain'}) && ($uname eq $env{'user.name'}) && |
($url eq '/'.$udom.'/') && ($role eq 'au')) { |
($url eq '/'.$udom.'/') && ($role eq 'au')) { |
if ($env{'environment.requestauthor'} eq 'automatic') { |
if ($env{'environment.requestauthor'} eq 'automatic') { |
$refused = ''; |
$refused = ''; |
Line 8646 sub assignrole {
|
Line 8224 sub assignrole {
|
my %domdefaults = &get_domain_defaults($udom); |
my %domdefaults = &get_domain_defaults($udom); |
if (ref($domdefaults{'requestauthor'}) eq 'HASH') { |
if (ref($domdefaults{'requestauthor'}) eq 'HASH') { |
my $checkbystatus; |
my $checkbystatus; |
if ($env{'user.adv'}) { |
if ($env{'user.adv'}) { |
my $disposition = $domdefaults{'requestauthor'}{'_LC_adv'}; |
my $disposition = $domdefaults{'requestauthor'}{'_LC_adv'}; |
if ($disposition eq 'automatic') { |
if ($disposition eq 'automatic') { |
$refused = ''; |
$refused = ''; |
} elsif ($disposition eq '') { |
} elsif ($disposition eq '') { |
$checkbystatus = 1; |
$checkbystatus = 1; |
} |
} |
} else { |
} else { |
$checkbystatus = 1; |
$checkbystatus = 1; |
} |
} |
Line 8739 sub assignrole {
|
Line 8317 sub assignrole {
|
$context); |
$context); |
} elsif (($role eq 'ca') || ($role eq 'aa')) { |
} elsif (($role eq 'ca') || ($role eq 'aa')) { |
&coauthorrolelog($role,$uname,$udom,$url,$origstart,$origend,$delflag, |
&coauthorrolelog($role,$uname,$udom,$url,$origstart,$origend,$delflag, |
$context); |
$context); |
} |
} |
if ($role eq 'cc') { |
if ($role eq 'cc') { |
&autoupdate_coowners($url,$end,$start,$uname,$udom); |
&autoupdate_coowners($url,$end,$start,$uname,$udom); |
Line 9039 sub modifyuser {
|
Line 8617 sub modifyuser {
|
sub modifystudent { |
sub modifystudent { |
my ($udom,$uname,$uid,$umode,$upass,$first,$middle,$last,$gene,$usec, |
my ($udom,$uname,$uid,$umode,$upass,$first,$middle,$last,$gene,$usec, |
$end,$start,$forceid,$desiredhome,$email,$type,$locktype,$cid, |
$end,$start,$forceid,$desiredhome,$email,$type,$locktype,$cid, |
$selfenroll,$context,$inststatus,$credits,$instsec)=@_; |
$selfenroll,$context,$inststatus,$credits)=@_; |
if (!$cid) { |
if (!$cid) { |
unless ($cid=$env{'request.course.id'}) { |
unless ($cid=$env{'request.course.id'}) { |
return 'not_in_class'; |
return 'not_in_class'; |
Line 9054 sub modifystudent {
|
Line 8632 sub modifystudent {
|
# student's environment |
# student's environment |
$uid = undef if (!$forceid); |
$uid = undef if (!$forceid); |
$reply = &modify_student_enrollment($udom,$uname,$uid,$first,$middle,$last, |
$reply = &modify_student_enrollment($udom,$uname,$uid,$first,$middle,$last, |
$gene,$usec,$end,$start,$type,$locktype, |
$gene,$usec,$end,$start,$type,$locktype, |
$cid,$selfenroll,$context,$credits,$instsec); |
$cid,$selfenroll,$context,$credits); |
return $reply; |
return $reply; |
} |
} |
|
|
sub modify_student_enrollment { |
sub modify_student_enrollment { |
my ($udom,$uname,$uid,$first,$middle,$last,$gene,$usec,$end,$start,$type, |
my ($udom,$uname,$uid,$first,$middle,$last,$gene,$usec,$end,$start,$type, |
$locktype,$cid,$selfenroll,$context,$credits,$instsec) = @_; |
$locktype,$cid,$selfenroll,$context,$credits) = @_; |
my ($cdom,$cnum,$chome); |
my ($cdom,$cnum,$chome); |
if (!$cid) { |
if (!$cid) { |
unless ($cid=$env{'request.course.id'}) { |
unless ($cid=$env{'request.course.id'}) { |
Line 9108 sub modify_student_enrollment {
|
Line 8686 sub modify_student_enrollment {
|
my %old_entry = &Apache::lonnet::get('classlist',[$user],$cdom,$cnum); |
my %old_entry = &Apache::lonnet::get('classlist',[$user],$cdom,$cnum); |
my $reply=cput('classlist', |
my $reply=cput('classlist', |
{$user => |
{$user => |
join(':',$end,$start,$uid,$usec,$fullname,$type,$locktype,$credits,$instsec) }, |
join(':',$end,$start,$uid,$usec,$fullname,$type,$locktype,$credits) }, |
$cdom,$cnum); |
$cdom,$cnum); |
if (($reply eq 'ok') || ($reply eq 'delayed')) { |
if (($reply eq 'ok') || ($reply eq 'delayed')) { |
&devalidate_getsection_cache($udom,$uname,$cid); |
&devalidate_getsection_cache($udom,$uname,$cid); |
Line 9632 sub modify_access_controls {
|
Line 9210 sub modify_access_controls {
|
my $tries = 0; |
my $tries = 0; |
my $gotlock = &newput('file_permissions',$lockhash,$domain,$user); |
my $gotlock = &newput('file_permissions',$lockhash,$domain,$user); |
|
|
while (($gotlock ne 'ok') && $tries < 10) { |
while (($gotlock ne 'ok') && $tries <3) { |
$tries ++; |
$tries ++; |
sleep(0.1); |
sleep 1; |
$gotlock = &newput('file_permissions',$lockhash,$domain,$user); |
$gotlock = &newput('file_permissions',$lockhash,$domain,$user); |
} |
} |
if ($gotlock eq 'ok') { |
if ($gotlock eq 'ok') { |
Line 9927 sub dirlist {
|
Line 9505 sub dirlist {
|
foreach my $user (sort(keys(%allusers))) { |
foreach my $user (sort(keys(%allusers))) { |
push(@alluserslist,$user.'&user'); |
push(@alluserslist,$user.'&user'); |
} |
} |
if (!%listerror) { |
return (\@alluserslist); |
# no errors |
|
return (\@alluserslist); |
|
} elsif (scalar(keys(%servers)) == 1) { |
|
# one library server, one error |
|
my ($key) = keys(%listerror); |
|
return (\@alluserslist, $listerror{$key}); |
|
} elsif ( grep { $_ eq 'con_lost' } values(%listerror) ) { |
|
# con_lost indicates that we might miss data from at least one |
|
# library server |
|
return (\@alluserslist, 'con_lost'); |
|
} else { |
|
# multiple library servers and no con_lost -> data should be |
|
# complete. |
|
return (\@alluserslist); |
|
} |
|
|
|
} else { |
} else { |
return ([],'missing username'); |
return ([],'missing username'); |
} |
} |
Line 10160 sub get_userresdata {
|
Line 9722 sub get_userresdata {
|
} |
} |
#error 2 occurs when the .db doesn't exist |
#error 2 occurs when the .db doesn't exist |
if ($tmp!~/error: 2 /) { |
if ($tmp!~/error: 2 /) { |
if ((!defined($cached)) || ($tmp ne 'con_lost')) { |
&logthis("<font color=\"blue\">WARNING:". |
&logthis("<font color=\"blue\">WARNING:". |
" Trying to get resource data for ". |
" Trying to get resource data for ". |
$uname." at ".$udom.": ". |
$uname." at ".$udom.": ". |
$tmp."</font>"); |
$tmp."</font>"); |
|
} |
|
} elsif ($tmp=~/error: 2 /) { |
} elsif ($tmp=~/error: 2 /) { |
#&EXT_cache_set($udom,$uname); |
#&EXT_cache_set($udom,$uname); |
&do_cache_new('userres',$hashid,undef,600); |
&do_cache_new('userres',$hashid,undef,600); |
Line 10217 sub get_numsuppfiles {
|
Line 9777 sub get_numsuppfiles {
|
unless ($chome eq 'no_host') { |
unless ($chome eq 'no_host') { |
($suppcount,my $errors) = (0,0); |
($suppcount,my $errors) = (0,0); |
my $suppmap = 'supplemental.sequence'; |
my $suppmap = 'supplemental.sequence'; |
($suppcount,$errors) = |
($suppcount,$errors) = |
&Apache::loncommon::recurse_supplemental($cnum,$cdom,$suppmap,$suppcount,$errors); |
&Apache::loncommon::recurse_supplemental($cnum,$cdom,$suppmap,$suppcount,$errors); |
} |
} |
&do_cache_new('suppcount',$hashid,$suppcount,600); |
&do_cache_new('suppcount',$hashid,$suppcount,600); |
Line 10412 sub EXT {
|
Line 9972 sub EXT {
|
$courseid = $cid; |
$courseid = $cid; |
} |
} |
if (($symbparm && $courseid) && |
if (($symbparm && $courseid) && |
(($courseid eq $env{'request.course.id'}) || ($courseid eq $cid))) { |
(($courseid eq $env{'request.course.id'}) || ($courseid eq $cid))) { |
|
|
#print '<br>'.$space.' - '.$qualifier.' - '.$spacequalifierrest; |
#print '<br>'.$space.' - '.$qualifier.' - '.$spacequalifierrest; |
|
|
Line 10663 sub metadata {
|
Line 10223 sub metadata {
|
($uri =~ m|/$|) || ($uri =~ m|/.meta$|) || ($uri =~ m{^/*uploaded/.+\.sequence$})) { |
($uri =~ m|/$|) || ($uri =~ m|/.meta$|) || ($uri =~ m{^/*uploaded/.+\.sequence$})) { |
return undef; |
return undef; |
} |
} |
if (($uri =~ /^priv/ || $uri=~m{^home/httpd/html/priv}) |
if (($uri =~ /^priv/ || $uri=~/home\/httpd\/html\/priv/) |
&& &Apache::lonxml::get_state('target') =~ /^(|meta)$/) { |
&& &Apache::lonxml::get_state('target') =~ /^(|meta)$/) { |
return undef; |
return undef; |
} |
} |
Line 10924 sub metadata {
|
Line 10484 sub metadata {
|
|
|
$metaentry{':keys'} = join(',',keys(%metathesekeys)); |
$metaentry{':keys'} = join(',',keys(%metathesekeys)); |
&metadata_generate_part0(\%metathesekeys,\%metaentry,$uri); |
&metadata_generate_part0(\%metathesekeys,\%metaentry,$uri); |
$metaentry{':allpossiblekeys'}=join(',',keys(%metathesekeys)); |
$metaentry{':allpossiblekeys'}=join(',',keys %metathesekeys); |
&do_cache_new('meta',$uri,\%metaentry,$cachetime); |
&do_cache_new('meta',$uri,\%metaentry,$cachetime); |
# this is the end of "was not already recently cached |
# this is the end of "was not already recently cached |
} |
} |
Line 11200 sub symbverify {
|
Line 10760 sub symbverify {
|
$ids=$bighash{'ids_'.&clutter($thisurl)}; |
$ids=$bighash{'ids_'.&clutter($thisurl)}; |
} |
} |
unless ($ids) { |
unless ($ids) { |
my $idkey = 'ids_'.($thisurl =~ m{^/}? '' : '/').$thisurl; |
my $idkey = 'ids_'.($thisurl =~ m{^/}? '' : '/').$thisurl; |
$ids=$bighash{$idkey}; |
$ids=$bighash{$idkey}; |
} |
} |
if ($ids) { |
if ($ids) { |
Line 11216 sub symbverify {
|
Line 10776 sub symbverify {
|
if (ref($encstate)) { |
if (ref($encstate)) { |
$$encstate = $bighash{'encrypted_'.$id}; |
$$encstate = $bighash{'encrypted_'.$id}; |
} |
} |
if (($env{'request.role.adv'}) || |
if (($env{'request.role.adv'}) || |
($bighash{'encrypted_'.$id} eq $env{'request.enc'}) || |
($bighash{'encrypted_'.$id} eq $env{'request.enc'}) || |
($thisurl eq '/adm/navmaps')) { |
($thisurl eq '/adm/navmaps')) { |
$okay=1; |
$okay=1; |
last; |
last; |
} |
} |
} |
} |
} |
} |
} |
} |
untie(%bighash); |
untie(%bighash); |
} |
} |
Line 11295 sub deversion {
|
Line 10855 sub deversion {
|
# ------------------------------------------------------ Return symb list entry |
# ------------------------------------------------------ Return symb list entry |
|
|
sub symbread { |
sub symbread { |
my ($thisfn,$donotrecurse,$ignorecachednull,$checkforblock,$possibles)=@_; |
my ($thisfn,$donotrecurse)=@_; |
my $cache_str='request.symbread.cached.'.$thisfn; |
my $cache_str; |
if (defined($env{$cache_str})) { |
if ($thisfn ne '') { |
if ($ignorecachednull) { |
$cache_str='request.symbread.cached.'.$thisfn; |
return $env{$cache_str} unless ($env{$cache_str} eq ''); |
if ($env{$cache_str} ne '') { |
} else { |
|
return $env{$cache_str}; |
return $env{$cache_str}; |
} |
} |
} |
} else { |
# no filename provided? try from environment |
# no filename provided? try from environment |
unless ($thisfn) { |
|
if ($env{'request.symb'}) { |
if ($env{'request.symb'}) { |
return $env{$cache_str}=&symbclean($env{'request.symb'}); |
return $env{$cache_str}=&symbclean($env{'request.symb'}); |
} |
} |
$thisfn=$env{'request.filename'}; |
$thisfn=$env{'request.filename'}; |
} |
} |
if ($thisfn=~m|^/enc/|) { $thisfn=&Apache::lonenc::unencrypted($thisfn); } |
if ($thisfn=~m|^/enc/|) { $thisfn=&Apache::lonenc::unencrypted($thisfn); } |
# is that filename actually a symb? Verify, clean, and return |
# is that filename actually a symb? Verify, clean, and return |
Line 11365 sub symbread {
|
Line 10923 sub symbread {
|
my ($mapid,$resid)=split(/\./,$ids); |
my ($mapid,$resid)=split(/\./,$ids); |
$syval=&encode_symb($bighash{'map_id_'.$mapid}, |
$syval=&encode_symb($bighash{'map_id_'.$mapid}, |
$resid,$thisfn); |
$resid,$thisfn); |
if (ref($possibles) eq 'HASH') { |
} elsif (!$donotrecurse) { |
$possibles->{$syval} = 1; |
|
} |
|
if ($checkforblock) { |
|
my @blockers = &has_comm_blocking('bre',$syval,$bighash{'src_'.$ids}); |
|
if (@blockers) { |
|
$syval = ''; |
|
return; |
|
} |
|
} |
|
} elsif ((!$donotrecurse) || ($checkforblock) || (ref($possibles) eq 'HASH')) { |
|
# ------------------------------------------ There is more than one possibility |
# ------------------------------------------ There is more than one possibility |
my $realpossible=0; |
my $realpossible=0; |
foreach my $id (@possibilities) { |
foreach my $id (@possibilities) { |
my $file=$bighash{'src_'.$id}; |
my $file=$bighash{'src_'.$id}; |
my $canaccess; |
if (&allowed('bre',$file)) { |
if (($donotrecurse) || ($checkforblock) || (ref($possibles) eq 'HASH')) { |
my ($mapid,$resid)=split(/\./,$id); |
$canaccess = 1; |
if ($bighash{'map_type_'.$mapid} ne 'page') { |
} else { |
$realpossible++; |
$canaccess = &allowed('bre',$file); |
$syval=&encode_symb($bighash{'map_id_'.$mapid}, |
} |
$resid,$thisfn); |
if ($canaccess) { |
} |
my ($mapid,$resid)=split(/\./,$id); |
|
if ($bighash{'map_type_'.$mapid} ne 'page') { |
|
my $poss_syval=&encode_symb($bighash{'map_id_'.$mapid}, |
|
$resid,$thisfn); |
|
if (ref($possibles) eq 'HASH') { |
|
$possibles->{$syval} = 1; |
|
} |
|
if ($checkforblock) { |
|
my @blockers = &has_comm_blocking('bre',$poss_syval,$file); |
|
unless (@blockers > 0) { |
|
$syval = $poss_syval; |
|
$realpossible++; |
|
} |
|
} else { |
|
$syval = $poss_syval; |
|
$realpossible++; |
|
} |
|
} |
|
} |
} |
} |
} |
if ($realpossible!=1) { $syval=''; } |
if ($realpossible!=1) { $syval=''; } |
Line 11412 sub symbread {
|
Line 10942 sub symbread {
|
$syval=''; |
$syval=''; |
} |
} |
} |
} |
untie(%bighash); |
untie(%bighash) |
} |
} |
} |
} |
if ($syval) { |
if ($syval) { |
Line 11565 sub rndseed {
|
Line 11095 sub rndseed {
|
$which =&get_rand_alg($courseid); |
$which =&get_rand_alg($courseid); |
} |
} |
if (defined(&getCODE())) { |
if (defined(&getCODE())) { |
|
|
if ($which eq '64bit5') { |
if ($which eq '64bit5') { |
return &rndseed_CODE_64bit5($symb,$courseid,$domain,$username); |
return &rndseed_CODE_64bit5($symb,$courseid,$domain,$username); |
} elsif ($which eq '64bit4') { |
} elsif ($which eq '64bit4') { |
Line 11750 sub rndseed_CODE_64bit5 {
|
Line 11281 sub rndseed_CODE_64bit5 {
|
sub setup_random_from_rndseed { |
sub setup_random_from_rndseed { |
my ($rndseed)=@_; |
my ($rndseed)=@_; |
if ($rndseed =~/([,:])/) { |
if ($rndseed =~/([,:])/) { |
my ($num1,$num2) = map { abs($_); } (split(/[,:]/,$rndseed)); |
my ($num1,$num2)=split(/[,:]/,$rndseed); |
if ((!$num1) || (!$num2) || ($num1 > 2147483562) || ($num2 > 2147483398)) { |
&Math::Random::random_set_seed(abs($num1),abs($num2)); |
&Math::Random::random_set_seed_from_phrase($rndseed); |
|
} else { |
|
&Math::Random::random_set_seed($num1,$num2); |
|
} |
|
} else { |
} else { |
&Math::Random::random_set_seed_from_phrase($rndseed); |
&Math::Random::random_set_seed_from_phrase($rndseed); |
} |
} |
Line 12146 sub default_login_domain {
|
Line 11673 sub default_login_domain {
|
sub declutter { |
sub declutter { |
my $thisfn=shift; |
my $thisfn=shift; |
if ($thisfn=~m|^/enc/|) { $thisfn=&Apache::lonenc::unencrypted($thisfn); } |
if ($thisfn=~m|^/enc/|) { $thisfn=&Apache::lonenc::unencrypted($thisfn); } |
unless ($thisfn=~m{^/home/httpd/html/priv/}) { |
$thisfn=~s/^\Q$perlvar{'lonDocRoot'}\E//; |
$thisfn=~s{^/home/httpd/html}{}; |
|
} |
|
$thisfn=~s/^\///; |
$thisfn=~s/^\///; |
$thisfn=~s|^adm/wrapper/||; |
$thisfn=~s|^adm/wrapper/||; |
$thisfn=~s|^adm/coursedocs/showdoc/||; |
$thisfn=~s|^adm/coursedocs/showdoc/||; |
Line 12275 sub get_dns {
|
Line 11800 sub get_dns {
|
$alldns{$host} = $protocol; |
$alldns{$host} = $protocol; |
} |
} |
while (%alldns) { |
while (%alldns) { |
my ($dns) = sort { $b cmp $a } keys(%alldns); |
my ($dns) = keys(%alldns); |
my $ua=new LWP::UserAgent; |
my $ua=new LWP::UserAgent; |
$ua->timeout(30); |
$ua->timeout(30); |
my $request=new HTTP::Request('GET',"$alldns{$dns}://$dns$url"); |
my $request=new HTTP::Request('GET',"$alldns{$dns}://$dns$url"); |
Line 12283 sub get_dns {
|
Line 11808 sub get_dns {
|
delete($alldns{$dns}); |
delete($alldns{$dns}); |
next if ($response->is_error()); |
next if ($response->is_error()); |
my @content = split("\n",$response->content); |
my @content = split("\n",$response->content); |
unless ($nocache) { |
unless ($nocache) { |
&do_cache_new('dns',$url,\@content,30*24*60*60); |
&do_cache_new('dns',$url,\@content,30*24*60*60); |
} |
} |
&$func(\@content,$hashref); |
&$func(\@content,$hashref); |
return; |
return; |
} |
} |
Line 12301 sub get_dns {
|
Line 11826 sub get_dns {
|
# ------------------------------------------------------Get DNS checksums file |
# ------------------------------------------------------Get DNS checksums file |
sub parse_dns_checksums_tab { |
sub parse_dns_checksums_tab { |
my ($lines,$hashref) = @_; |
my ($lines,$hashref) = @_; |
my $lonhost = $perlvar{'lonHostID'}; |
my $machine_dom = &Apache::lonnet::host_domain($perlvar{'lonHostID'}); |
my $machine_dom = &Apache::lonnet::host_domain($lonhost); |
|
my $loncaparev = &get_server_loncaparev($machine_dom); |
my $loncaparev = &get_server_loncaparev($machine_dom); |
my $distro = (split(/\:/,&get_server_distarch($lonhost)))[0]; |
|
my $webconfdir = '/etc/httpd/conf'; |
|
if ($distro =~ /^(ubuntu|debian)(\d+)$/) { |
|
$webconfdir = '/etc/apache2'; |
|
} elsif ($distro =~ /^sles(\d+)$/) { |
|
if ($1 >= 10) { |
|
$webconfdir = '/etc/apache2'; |
|
} |
|
} elsif ($distro =~ /^suse(\d+\.\d+)$/) { |
|
if ($1 >= 10.0) { |
|
$webconfdir = '/etc/apache2'; |
|
} |
|
} |
|
my ($release,$timestamp) = split(/\-/,$loncaparev); |
my ($release,$timestamp) = split(/\-/,$loncaparev); |
my (%chksum,%revnum); |
my (%chksum,%revnum); |
if (ref($lines) eq 'ARRAY') { |
if (ref($lines) eq 'ARRAY') { |
chomp(@{$lines}); |
chomp(@{$lines}); |
my $version = shift(@{$lines}); |
my $version = shift(@{$lines}); |
if ($version eq $release) { |
if ($version eq $release) { |
foreach my $line (@{$lines}) { |
foreach my $line (@{$lines}) { |
my ($file,$version,$shasum) = split(/,/,$line); |
my ($file,$version,$shasum) = split(/,/,$line); |
if ($file =~ m{^/etc/httpd/conf}) { |
|
if ($webconfdir eq '/etc/apache2') { |
|
$file =~ s{^\Q/etc/httpd/conf/\E}{$webconfdir/}; |
|
} |
|
} |
|
$chksum{$file} = $shasum; |
$chksum{$file} = $shasum; |
$revnum{$file} = $version; |
$revnum{$file} = $version; |
} |
} |
Line 12382 sub fetch_dns_checksums {
|
Line 11888 sub fetch_dns_checksums {
|
} |
} |
|
|
sub load_domain_tab { |
sub load_domain_tab { |
my ($ignore_cache,$nocache) = @_; |
my ($ignore_cache) = @_; |
&get_dns('/adm/dns/domain',\&parse_domain_tab,$ignore_cache,$nocache); |
&get_dns('/adm/dns/domain',\&parse_domain_tab,$ignore_cache); |
my $fh; |
my $fh; |
if (open($fh,"<".$perlvar{'lonTabDir'}.'/domain.tab')) { |
if (open($fh,"<".$perlvar{'lonTabDir'}.'/domain.tab')) { |
my @lines = <$fh>; |
my @lines = <$fh>; |
Line 12469 sub fetch_dns_checksums {
|
Line 11975 sub fetch_dns_checksums {
|
} |
} |
|
|
sub load_hosts_tab { |
sub load_hosts_tab { |
my ($ignore_cache,$nocache) = @_; |
my ($ignore_cache) = @_; |
&get_dns('/adm/dns/hosts',\&parse_hosts_tab,$ignore_cache,$nocache); |
&get_dns('/adm/dns/hosts',\&parse_hosts_tab,$ignore_cache); |
open(my $config,"<$perlvar{'lonTabDir'}/hosts.tab"); |
open(my $config,"<$perlvar{'lonTabDir'}/hosts.tab"); |
my @config = <$config>; |
my @config = <$config>; |
&parse_hosts_tab(\@config); |
&parse_hosts_tab(\@config); |
Line 12492 sub fetch_dns_checksums {
|
Line 11998 sub fetch_dns_checksums {
|
} |
} |
|
|
sub all_names { |
sub all_names { |
my ($ignore_cache,$nocache) = @_; |
&load_hosts_tab() if (!$loaded); |
&load_hosts_tab($ignore_cache,$nocache) if (!$loaded); |
|
|
|
return %name_to_host; |
return %name_to_host; |
} |
} |
Line 12615 sub fetch_dns_checksums {
|
Line 12120 sub fetch_dns_checksums {
|
} |
} |
|
|
sub get_iphost { |
sub get_iphost { |
my ($ignore_cache,$nocache) = @_; |
my ($ignore_cache) = @_; |
|
|
if (!$ignore_cache) { |
if (!$ignore_cache) { |
if (%iphost) { |
if (%iphost) { |
Line 12639 sub fetch_dns_checksums {
|
Line 12144 sub fetch_dns_checksums {
|
%old_name_to_ip = %{$ip_info->[1]}; |
%old_name_to_ip = %{$ip_info->[1]}; |
} |
} |
|
|
my %name_to_host = &all_names($ignore_cache,$nocache); |
my %name_to_host = &all_names(); |
foreach my $name (keys(%name_to_host)) { |
foreach my $name (keys(%name_to_host)) { |
my $ip; |
my $ip; |
if (!exists($name_to_ip{$name})) { |
if (!exists($name_to_ip{$name})) { |
Line 12664 sub fetch_dns_checksums {
|
Line 12169 sub fetch_dns_checksums {
|
} |
} |
push(@{$iphost{$ip}},@{$name_to_host{$name}}); |
push(@{$iphost{$ip}},@{$name_to_host{$name}}); |
} |
} |
unless ($nocache) { |
&do_cache_new('iphost','iphost', |
&do_cache_new('iphost','iphost', |
[\%iphost,\%name_to_ip,\%lonid_to_ip], |
[\%iphost,\%name_to_ip,\%lonid_to_ip], |
48*60*60); |
48*60*60); |
|
} |
|
|
|
return %iphost; |
return %iphost; |
} |
} |
Line 12733 sub all_loncaparevs {
|
Line 12236 sub all_loncaparevs {
|
return qw(1.1 1.2 1.3 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11); |
return qw(1.1 1.2 1.3 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11); |
} |
} |
|
|
# ------------------------------------------------------- Read loncaparev table |
# ---------------------------------------------------------- Read loncaparev table |
{ |
{ |
sub load_loncaparevs { |
sub load_loncaparevs { |
if (-e "$perlvar{'lonTabDir'}/loncaparevs.tab") { |
if (-e "$perlvar{'lonTabDir'}/loncaparevs.tab") { |
if (open(my $config,"<$perlvar{'lonTabDir'}/loncaparevs.tab")) { |
if (open(my $config,"<$perlvar{'lonTabDir'}/loncaparevs.tab")) { |
while (my $configline=<$config>) { |
while (my $configline=<$config>) { |
Line 12749 sub all_loncaparevs {
|
Line 12252 sub all_loncaparevs {
|
} |
} |
} |
} |
|
|
# ----------------------------------------------------- Read serverhostID table |
# ---------------------------------------------------------- Read serverhostID table |
{ |
{ |
sub load_serverhomeIDs { |
sub load_serverhomeIDs { |
if (-e "$perlvar{'lonTabDir'}/serverhomeIDs.tab") { |
if (-e "$perlvar{'lonTabDir'}/serverhomeIDs.tab") { |
Line 12841 BEGIN {
|
Line 12344 BEGIN {
|
close($config); |
close($config); |
} |
} |
|
|
# --------------------------------------------------------- Read loncaparev table |
# ---------------------------------------------------------- Read loncaparev table |
|
|
&load_loncaparevs(); |
&load_loncaparevs(); |
|
|
# ------------------------------------------------------- Read serverhostID table |
# ---------------------------------------------------------- Read serverhostID table |
|
|
&load_serverhomeIDs(); |
&load_serverhomeIDs(); |
|
|
Line 13049 were new keys. I.E. 1:foo will become 1:
|
Line 12552 were new keys. I.E. 1:foo will become 1:
|
Calling convention: |
Calling convention: |
|
|
my %record=&Apache::lonnet::restore($symb,$courseid,$domain,$uname); |
my %record=&Apache::lonnet::restore($symb,$courseid,$domain,$uname); |
&Apache::lonnet::cstore(\%newrecord,$symb,$courseid,$domain,$uname,$laststore); |
&Apache::lonnet::cstore(\%newrecord,$symb,$courseid,$domain,$uname); |
|
|
For more detailed information, see lonnet specific documentation. |
For more detailed information, see lonnet specific documentation. |
|
|
Line 13185 escaped strings of the action recorded i
|
Line 12688 escaped strings of the action recorded i
|
|
|
=item * |
=item * |
|
|
allowed($priv,$uri,$symb,$role,$clientip,$noblockcheck) : check for a user privilege; |
allowed($priv,$uri,$symb,$role) : check for a user privilege; returns codes for allowed actions |
returns codes for allowed actions. |
|
|
|
The first argument is required, all others are optional. |
|
|
|
$priv is the privilege being checked. |
|
$uri contains additional information about what is being checked for access (e.g., |
|
URL, course ID etc.). |
|
$symb is the unique resource instance identifier in a course; if needed, |
|
but not provided, it will be retrieved via a call to &symbread(). |
|
$role is the role for which a priv is being checked (only used if priv is evb). |
|
$clientip is the user's IP address (only used when checking for access to portfolio |
|
files). |
|
$noblockcheck, if true, skips calls to &has_comm_blocking() for the bre priv. This |
|
prevents recursive calls to &allowed. |
|
|
|
F: full access |
F: full access |
U,I,K: authentication modes (cxx only) |
U,I,K: authentication modes (cxx only) |
'': forbidden |
'': forbidden |
1: user needs to choose course |
1: user needs to choose course |
2: browse allowed |
2: browse allowed |
A: passphrase authentication needed |
A: passphrase authentication needed |
B: access temporarily blocked because of a blocking event in a course. |
|
|
|
=item * |
=item * |
|
|
Line 13259 provided for types, will default to retu
|
Line 12746 provided for types, will default to retu
|
=item * |
=item * |
|
|
in_course($udom,$uname,$cdom,$cnum,$type,$hideprivileged) : determine if |
in_course($udom,$uname,$cdom,$cnum,$type,$hideprivileged) : determine if |
user: $uname:$udom has a role in the course: $cdom_$cnum. |
user: $uname:$udom has a role in the course: $cdom_$cnum. |
|
|
Additional optional arguments are: $type (if role checking is to be restricted |
Additional optional arguments are: $type (if role checking is to be restricted |
to certain user status types -- previous (expired roles), active (currently |
to certain user status types -- previous (expired roles), active (currently |
available roles) or future (roles available in the future), and |
available roles) or future (roles available in the future), and |
$hideprivileged -- if true will not report course roles for users who |
$hideprivileged -- if true will not report course roles for users who |
Line 13432 Inputs:
|
Line 12919 Inputs:
|
|
|
=item $credits, number of credits student will earn from this class |
=item $credits, number of credits student will earn from this class |
|
|
=item $instsec, institutional course section code for student |
|
|
|
=back |
=back |
|
|
|
|
Line 13500 values that are the resource value. I b
|
Line 12985 values that are the resource value. I b
|
versions are also returned. |
versions are also returned. |
|
|
get_numsuppfiles($cnum,$cdom) : retrieve number of files in a course's |
get_numsuppfiles($cnum,$cdom) : retrieve number of files in a course's |
supplemental content area. This routine caches the number of files for |
supplemental content area. This routine caches the number of files for |
10 minutes. |
10 minutes. |
|
|
=back |
=back |
Line 13603 will be stored for query
|
Line 13088 will be stored for query
|
|
|
=item * |
=item * |
|
|
symbread($filename,$donotrecurse,$ignorecachednull,$checkforblock,$possibles) : |
symbread($filename) : return symbolic list entry (filename argument optional); |
return symbolic list entry (all arguments optional). |
|
|
|
Args: filename is the filename (including path) for the file for which a symb |
|
is required; donotrecurse, if true will prevent calls to allowed() being made |
|
to check access status if more than one resource was found in the bighash |
|
(see rev. 1.249) to avoid an infinite loop if an ambiguous resource is part of |
|
a randompick); ignorecachednull, if true will prevent a symb of '' being |
|
returned if $env{$cache_str} is defined as ''; checkforblock if true will |
|
cause possible symbs to be checked to determine if they are subject to content |
|
blocking, if so they will not be included as possible symbs; possibles is a |
|
ref to a hash, which, as a side effect, will be populated with all possible |
|
symbs (content blocking not tested). |
|
|
|
returns the data handle |
returns the data handle |
|
|
=item * |
=item * |
Line 13626 and is a possible symb for the URL in $t
|
Line 13098 and is a possible symb for the URL in $t
|
resource that the user accessed using /enc/ returns a 1 on success, 0 |
resource that the user accessed using /enc/ returns a 1 on success, 0 |
on failure, user must be in a course, as it assumes the existence of |
on failure, user must be in a course, as it assumes the existence of |
the course initial hash, and uses $env('request.course.id'}. The third |
the course initial hash, and uses $env('request.course.id'}. The third |
arg is an optional reference to a scalar. If this arg is passed in the |
arg is an optional reference to a scalar. If this arg is passed in the |
call to symbverify, it will be set to 1 if the symb has been set to be |
call to symbverify, it will be set to 1 if the symb has been set to be |
encrypted; otherwise it will be null. |
encrypted; otherwise it will be null. |
|
|
=item * |
=item * |
|
|
Line 13681 expirespread($uname,$udom,$stype,$usymb)
|
Line 13153 expirespread($uname,$udom,$stype,$usymb)
|
devalidate($symb) : devalidate temporary spreadsheet calculations, |
devalidate($symb) : devalidate temporary spreadsheet calculations, |
forcing spreadsheet to reevaluate the resource scores next time. |
forcing spreadsheet to reevaluate the resource scores next time. |
|
|
=item * |
=item * |
|
|
can_edit_resource($file,$cnum,$cdom,$resurl,$symb,$group) : determine if current user can edit a particular resource, |
can_edit_resource($file,$cnum,$cdom,$resurl,$symb,$group) : determine if current user can edit a particular resource, |
when viewing in course context. |
when viewing in course context. |
|
|
input: six args -- filename (decluttered), course number, course domain, |
input: six args -- filename (decluttered), course number, course domain, |
url, symb (if registered) and group (if this is a |
url, symb (if registered) and group (if this is a |
group item -- e.g., bulletin board, group page etc.). |
group item -- e.g., bulletin board, group page etc.). |
|
|
output: array of five scalars -- |
output: array of five scalars -- |
Line 13695 when viewing in course context.
|
Line 13167 when viewing in course context.
|
$home -- homeserver of resource (i.e., for author if published, |
$home -- homeserver of resource (i.e., for author if published, |
or course if uploaded.). |
or course if uploaded.). |
$switchserver -- 1 if server switch will be needed. |
$switchserver -- 1 if server switch will be needed. |
$forceedit -- 1 if icon/link should be to go to edit mode |
$forceedit -- 1 if icon/link should be to go to edit mode |
$forceview -- 1 if icon/link should be to go to view mode |
$forceview -- 1 if icon/link should be to go to view mode |
|
|
=item * |
=item * |
|
|
is_course_upload($file,$cnum,$cdom) |
is_course_upload($file,$cnum,$cdom) |
|
|
Used in course context to determine if current file was uploaded to |
Used in course context to determine if current file was uploaded to |
the course (i.e., would be found in /userfiles/docs on the course's |
the course (i.e., would be found in /userfiles/docs on the course's |
homeserver. |
homeserver. |
|
|
input: 3 args -- filename (decluttered), course number and course domain. |
input: 3 args -- filename (decluttered), course number and course domain. |
Line 13717 homeserver.
|
Line 13189 homeserver.
|
|
|
=item * |
=item * |
|
|
store($storehash,$symb,$namespace,$udom,$uname,$laststore) : stores hash |
store($storehash,$symb,$namespace,$udom,$uname) : stores hash permanently |
permanently for this url; hashref needs to be given and should be a \%hashname; |
for this url; hashref needs to be given and should be a \%hashname; the |
the remaining args aren't required and if they aren't passed or are '' they will |
remaining args aren't required and if they aren't passed or are '' they will |
be derived from the env (with the exception of $laststore, which is an |
be derived from the env |
optional arg used when a user's submission is stored in grading). |
|
$laststore is $version=$timestamp, where $version is the most recent version |
|
number retrieved for the corresponding $symb in the $namespace db file, and |
|
$timestamp is the timestamp for that transaction (UNIX time). |
|
$laststore is currently only passed when cstore() is called by |
|
structuretags::finalize_storage(). |
|
|
|
=item * |
=item * |
|
|
cstore($storehash,$symb,$namespace,$udom,$uname,$laststore) : same as store |
cstore($storehash,$symb,$namespace,$udom,$uname) : same as store but |
but uses critical subroutine |
uses critical subroutine |
|
|
=item * |
=item * |
|
|
Line 13754 $range should be either an integer '100'
|
Line 13220 $range should be either an integer '100'
|
|
|
=item * |
=item * |
|
|
putstore($namespace,$symb,$version,$storehash,$udomain,$uname,$tolog) : |
putstore($namespace,$symb,$version,$storehash,$udomain,$uname) : |
replaces a &store() version of data with a replacement set of data |
replaces a &store() version of data with a replacement set of data |
for a particular resource in a namespace passed in the $storehash hash |
for a particular resource in a namespace passed in the $storehash hash |
reference. If $tolog is true, the transaction is logged in the courselog |
reference |
with an action=PUTSTORE. |
|
|
|
=item * |
=item * |
|
|
Line 13868 server ($udom and $uhome are optional)
|
Line 13333 server ($udom and $uhome are optional)
|
|
|
=item * |
=item * |
|
|
get_domain_defaults($target_domain,$ignore_cache) : returns hash with defaults |
get_domain_defaults($target_domain,$ignore_cache) : returns hash with defaults |
for: authentication, language, quotas, timezone, date locale, and portal URL in |
for: authentication, language, quotas, timezone, date locale, and portal URL in |
the target domain. |
the target domain. |
|
|
Line 13923 for course's uploaded content.
|
Line 13388 for course's uploaded content.
|
=over |
=over |
|
|
=item |
=item |
canuse_pdfforms, officialcredits, unofficialcredits, textbookcredits, officialquota, unofficialquota, |
canuse_pdfforms, officialcredits, unofficialcredits, textbookcredits, officialquota, unofficialquota, |
communityquota, textbookquota |
communityquota, textbookquota |
|
|
=back |
=back |
Line 13934 on your servers.
|
Line 13399 on your servers.
|
|
|
=over |
=over |
|
|
=item |
=item |
remotesessions, hostedsessions |
remotesessions, hostedsessions |
|
|
=back |
=back |
Line 13942 remotesessions, hostedsessions
|
Line 13407 remotesessions, hostedsessions
|
=back |
=back |
|
|
In cases where a domain coordinator has never used the "Set Domain Configuration" |
In cases where a domain coordinator has never used the "Set Domain Configuration" |
utility to create a configuration.db file on a domain's primary library server |
utility to create a configuration.db file on a domain's primary library server |
only the following domain defaults: auth_def, auth_arg_def, lang_def |
only the following domain defaults: auth_def, auth_arg_def, lang_def |
-- corresponding values are authentication type (internal, krb4, krb5, |
-- corresponding values are authentication type (internal, krb4, krb5, |
or localauth), initial password or a kerberos realm, language (e.g., en-us) -- |
or localauth), initial password or a kerberos realm, language (e.g., en-us) -- |
will be available. Values are retrieved from cache (if current), unless the |
will be available. Values are retrieved from cache (if current), unless the |
optional $ignore_cache arg is true, or from domain's configuration.db (if available), |
optional $ignore_cache arg is true, or from domain's configuration.db (if available), |
or lastly from values in lonTabs/dns_domain,tab, or lonTabs/domain.tab. |
or lastly from values in lonTabs/dns_domain,tab, or lonTabs/domain.tab. |
Line 14177 filelocation except for hrefs
|
Line 13642 filelocation except for hrefs
|
|
|
=item * |
=item * |
|
|
declutter() : declutters URLs -- remove beginning slashes, 'res' etc. |
declutter() : declutters URLs (remove docroot, beginning slashes, 'res' etc) |
also removes beginning /home/httpd/html unless /priv/ follows it. |
|
|
|
=back |
=back |
|
|
Line 14373 Returns:
|
Line 13837 Returns:
|
|
|
get_timebased_id(): |
get_timebased_id(): |
|
|
Attempts to get a unique timestamp-based suffix for use with items added to a |
Attempts to get a unique timestamp-based suffix for use with items added to a |
course via the Course Editor (e.g., folders, composite pages, |
course via the Course Editor (e.g., folders, composite pages, |
group bulletin boards). |
group bulletin boards). |
|
|
Args: (first three required; six others optional) |
Args: (first three required; six others optional) |
Line 14385 Args: (first three required; six others
|
Line 13849 Args: (first three required; six others
|
2. keyid (alphanumeric): name of temporary locking key in hash, |
2. keyid (alphanumeric): name of temporary locking key in hash, |
e.g., num, boardids |
e.g., num, boardids |
|
|
3. namespace: name of gdbm file used to store suffixes already assigned; |
3. namespace: name of gdbm file used to store suffixes already assigned; |
file will be named nohist_namespace.db |
file will be named nohist_namespace.db |
|
|
4. cdom: domain of course; default is current course domain from %env |
4. cdom: domain of course; default is current course domain from %env |
|
|
5. cnum: course number; default is current course number from %env |
5. cnum: course number; default is current course number from %env |
|
|
6. idtype: set to concat if an additional digit is to be appended to the |
6. idtype: set to concat if an additional digit is to be appended to the |
unix timestamp to form the suffix, if the plain timestamp is already |
unix timestamp to form the suffix, if the plain timestamp is already |
in use. Default is to not do this, but simply increment the unix |
in use. Default is to not do this, but simply increment the unix |
timestamp by 1 until a unique key is obtained. |
timestamp by 1 until a unique key is obtained. |
|
|
7. who: holder of locking key; defaults to user:domain for user. |
7. who: holder of locking key; defaults to user:domain for user. |
|
|
8. locktries: number of attempts to obtain a lock (sleep of 1s before |
8. locktries: number of attempts to obtain a lock (sleep of 1s before |
retrying); default is 3. |
retrying); default is 3. |
|
|
9. maxtries: number of attempts to obtain a unique suffix; default is 20. |
9. maxtries: number of attempts to obtain a unique suffix; default is 20. |
|
|
Returns: |
Returns: |
|
|