version 1.1172.2.70, 2016/08/05 12:20:50
|
version 1.1172.2.93.4.11, 2018/05/02 20:33:18
|
Line 89 use GDBM_File;
|
Line 89 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( gettimeofday tv_interval ); |
use Time::HiRes qw( sleep 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 102 use LONCAPA::Lond;
|
use File::Copy; |
use File::Copy; |
|
|
my $readit; |
my $readit; |
my $max_connection_retries = 10; # Or some such value. |
my $max_connection_retries = 20; # Or some such value. |
|
|
require Exporter; |
require Exporter; |
|
|
Line 142 our @EXPORT = qw(%env);
|
Line 142 our @EXPORT = qw(%env);
|
sub logtouch { |
sub logtouch { |
my $execdir=$perlvar{'lonDaemons'}; |
my $execdir=$perlvar{'lonDaemons'}; |
unless (-e "$execdir/logs/lonnet.log") { |
unless (-e "$execdir/logs/lonnet.log") { |
open(my $fh,">>$execdir/logs/lonnet.log"); |
open(my $fh,">>","$execdir/logs/lonnet.log"); |
close $fh; |
close $fh; |
} |
} |
my ($wwwuid,$wwwgid)=(getpwnam('www'))[2,3]; |
my ($wwwuid,$wwwgid)=(getpwnam('www'))[2,3]; |
Line 154 sub logthis {
|
Line 154 sub logthis {
|
my $execdir=$perlvar{'lonDaemons'}; |
my $execdir=$perlvar{'lonDaemons'}; |
my $now=time; |
my $now=time; |
my $local=localtime($now); |
my $local=localtime($now); |
if (open(my $fh,">>$execdir/logs/lonnet.log")) { |
if (open(my $fh,">>","$execdir/logs/lonnet.log")) { |
my $logstring = $local. " ($$): ".$message."\n"; # Keep any \'s in string. |
my $logstring = $local. " ($$): ".$message."\n"; # Keep any \'s in string. |
print $fh $logstring; |
print $fh $logstring; |
close($fh); |
close($fh); |
Line 167 sub logperm {
|
Line 167 sub logperm {
|
my $execdir=$perlvar{'lonDaemons'}; |
my $execdir=$perlvar{'lonDaemons'}; |
my $now=time; |
my $now=time; |
my $local=localtime($now); |
my $local=localtime($now); |
if (open(my $fh,">>$execdir/logs/lonnet.perm.log")) { |
if (open(my $fh,">>","$execdir/logs/lonnet.perm.log")) { |
print $fh "$now:$message:$local\n"; |
print $fh "$now:$message:$local\n"; |
close($fh); |
close($fh); |
} |
} |
Line 370 sub subreply {
|
Line 370 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(1); |
sleep(0.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 388 sub subreply {
|
} else { |
} else { |
&create_connection(&hostname($server),$server); |
&create_connection(&hostname($server),$server); |
} |
} |
sleep(1); # Try again later if failed connection. |
sleep(0.1); # Try again later if failed connection. |
} |
} |
my $answer; |
my $answer; |
if ($client) { |
if ($client) { |
Line 417 sub reply {
|
Line 417 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 436 sub reconlonc {
|
Line 436 sub reconlonc {
|
|
|
&logthis("Trying to reconnect lonc"); |
&logthis("Trying to reconnect lonc"); |
my $loncfile="$perlvar{'lonDaemons'}/logs/lonc.pid"; |
my $loncfile="$perlvar{'lonDaemons'}/logs/lonc.pid"; |
if (open(my $fh,"<$loncfile")) { |
if (open(my $fh,"<",$loncfile)) { |
my $loncpid=<$fh>; |
my $loncpid=<$fh>; |
chomp($loncpid); |
chomp($loncpid); |
if (kill 0 => $loncpid) { |
if (kill 0 => $loncpid) { |
Line 464 sub critical {
|
Line 464 sub critical {
|
} |
} |
my $answer=reply($cmd,$server); |
my $answer=reply($cmd,$server); |
if ($answer eq 'con_lost') { |
if ($answer eq 'con_lost') { |
&reconlonc("$perlvar{'lonSockDir'}/$server"); |
&reconlonc($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 476 sub critical {
|
Line 476 sub critical {
|
$dumpcount++; |
$dumpcount++; |
{ |
{ |
my $dfh; |
my $dfh; |
if (open($dfh,">$dfilename")) { |
if (open($dfh,">",$dfilename)) { |
print $dfh "$cmd\n"; |
print $dfh "$cmd\n"; |
close($dfh); |
close($dfh); |
} |
} |
} |
} |
sleep 2; |
sleep 1; |
my $wcmd=''; |
my $wcmd=''; |
{ |
{ |
my $dfh; |
my $dfh; |
if (open($dfh,"<$dfilename")) { |
if (open($dfh,"<",$dfilename)) { |
$wcmd=<$dfh>; |
$wcmd=<$dfh>; |
close($dfh); |
close($dfh); |
} |
} |
Line 601 sub transfer_profile_to_env {
|
Line 601 sub transfer_profile_to_env {
|
|
|
# ---------------------------------------------------- Check for valid session |
# ---------------------------------------------------- Check for valid session |
sub check_for_valid_session { |
sub check_for_valid_session { |
my ($r,$name,$userhashref) = @_; |
my ($r,$name,$userhashref,$domref) = @_; |
my %cookies=CGI::Cookie->parse($r->header_in('Cookie')); |
my %cookies=CGI::Cookie->parse($r->header_in('Cookie')); |
if ($name eq '') { |
if ($name eq '') { |
$name = 'lonID'; |
$name = 'lonID'; |
Line 616 sub check_for_valid_session {
|
Line 616 sub check_for_valid_session {
|
} else { |
} else { |
$lonidsdir=$r->dir_config('lonIDsDir'); |
$lonidsdir=$r->dir_config('lonIDsDir'); |
} |
} |
return undef if (!-e "$lonidsdir/$handle.id"); |
if (!-e "$lonidsdir/$handle.id") { |
|
if ((ref($domref)) && ($name eq 'lonID') && |
|
($handle =~ /^($match_username)\_\d+\_($match_domain)\_(.+)$/)) { |
|
my ($possuname,$possudom,$possuhome) = ($1,$2,$3); |
|
if ((&domain($possudom) ne '') && (&homeserver($possuname,$possudom) eq $possuhome)) { |
|
$$domref = $possudom; |
|
} |
|
} |
|
return undef; |
|
} |
|
|
my $opened = open(my $idf,'+<',"$lonidsdir/$handle.id"); |
my $opened = open(my $idf,'+<',"$lonidsdir/$handle.id"); |
return undef if (!$opened); |
return undef if (!$opened); |
Line 686 sub appenv {
|
Line 695 sub appenv {
|
$env{$key}=$newenv->{$key}; |
$env{$key}=$newenv->{$key}; |
} |
} |
} |
} |
my $opened = open(my $env_file,'+<',$env{'user.environment'}); |
my $lonids = $perlvar{'lonIDsDir'}; |
if ($opened |
if ($env{'user.environment'} =~ m{^\Q$lonids/\E$match_username\_\d+\_$match_domain\_[\w\-.]+\.id$}) { |
&& &timed_flock($env_file,LOCK_EX) |
my $opened = open(my $env_file,'+<',$env{'user.environment'}); |
&& |
if ($opened |
tie(my %disk_env,'GDBM_File',$env{'user.environment'}, |
&& &timed_flock($env_file,LOCK_EX) |
(&GDBM_WRITER()|&GDBM_NOLOCK()),0640)) { |
&& |
while (my ($key,$value) = each(%{$newenv})) { |
tie(my %disk_env,'GDBM_File',$env{'user.environment'}, |
$disk_env{$key} = $value; |
(&GDBM_WRITER()|&GDBM_NOLOCK()),0640)) { |
} |
while (my ($key,$value) = each(%{$newenv})) { |
untie(%disk_env); |
$disk_env{$key} = $value; |
|
} |
|
untie(%disk_env); |
|
} |
} |
} |
} |
} |
return 'ok'; |
return 'ok'; |
Line 1002 sub choose_server {
|
Line 1014 sub choose_server {
|
if ($login_host ne '') { |
if ($login_host ne '') { |
$hostname = &hostname($login_host); |
$hostname = &hostname($login_host); |
} |
} |
return ($login_host,$hostname,$portal_path,$isredirect); |
return ($login_host,$hostname,$portal_path,$isredirect,$lowest_load); |
} |
} |
|
|
# --------------------------------------------- Try to change a user's password |
# --------------------------------------------- Try to change a user's password |
Line 1274 sub get_lonbalancer_config {
|
Line 1286 sub get_lonbalancer_config {
|
} |
} |
|
|
sub check_loadbalancing { |
sub check_loadbalancing { |
my ($uname,$udom) = @_; |
my ($uname,$udom,$caller) = @_; |
my ($is_balancer,$currtargets,$currrules,$dom_in_use,$homeintdom, |
my ($is_balancer,$currtargets,$currrules,$dom_in_use,$homeintdom, |
$rule_in_effect,$offloadto,$otherserver); |
$rule_in_effect,$offloadto,$otherserver); |
my $lonhost = $perlvar{'lonHostID'}; |
my $lonhost = $perlvar{'lonHostID'}; |
Line 1283 sub check_loadbalancing {
|
Line 1295 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 1310 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') { |
Line 1356 sub check_loadbalancing {
|
Line 1370 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',$dom_in_use,$domconfig{'loadbalancing'},$cachetime); |
$result = &do_cache_new('loadbalancing',$serverhomedom,$domconfig{'loadbalancing'},$cachetime); |
|
} else { |
|
$domneedscache = $serverhomedom; |
} |
} |
} |
} |
if (ref($result) eq 'HASH') { |
if (ref($result) eq 'HASH') { |
Line 1376 sub check_loadbalancing {
|
Line 1392 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 1412 sub check_loadbalancing {
|
Line 1437 sub check_loadbalancing {
|
} |
} |
} |
} |
} |
} |
if (($otherserver ne '') && (grep(/^\Q$otherserver\E$/,@hosts))) { |
unless ($caller eq 'login') { |
$is_balancer = 0; |
if (($otherserver ne '') && (grep(/^\Q$otherserver\E$/,@hosts))) { |
if ($uname ne '' && $udom ne '') { |
$is_balancer = 0; |
if (($env{'user.name'} eq $uname) && ($env{'user.domain'} eq $udom)) { |
if ($uname ne '' && $udom ne '') { |
|
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 1554 sub idget {
|
Line 1581 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('&',@ids); |
my $idlist=join('&', map { &escape($_); } @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 1564 sub idget {
|
Line 1591 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]}=$answer[$i]; |
$returnhash{$ids[$i]}=&unescape($answer[$i]); |
} |
} |
} |
} |
} |
} |
Line 1673 sub get_dom {
|
Line 1700 sub get_dom {
|
} |
} |
} |
} |
if ($udom && $uhome && ($uhome ne 'no_host')) { |
if ($udom && $uhome && ($uhome ne 'no_host')) { |
my $rep=&reply("getdom:$udom:$namespace:$items",$uhome); |
my $rep; |
|
if ($namespace =~ /^enc/) { |
|
$rep=&reply("encrypt:egetdom:$udom:$namespace:$items",$uhome); |
|
} else { |
|
$rep=&reply("getdom:$udom:$namespace:$items",$uhome); |
|
} |
my %returnhash; |
my %returnhash; |
if ($rep eq '' || $rep =~ /^error: 2 /) { |
if ($rep eq '' || $rep =~ /^error: 2 /) { |
return %returnhash; |
return %returnhash; |
Line 1717 sub put_dom {
|
Line 1749 sub put_dom {
|
$items.=&escape($item).'='.&freeze_escape($$storehash{$item}).'&'; |
$items.=&escape($item).'='.&freeze_escape($$storehash{$item}).'&'; |
} |
} |
$items=~s/\&$//; |
$items=~s/\&$//; |
return &reply("putdom:$udom:$namespace:$items",$uhome); |
if ($namespace =~ /^enc/) { |
|
return &reply("encrypt:putdom:$udom:$namespace:$items",$uhome); |
|
} else { |
|
return &reply("putdom:$udom:$namespace:$items",$uhome); |
|
} |
} else { |
} else { |
&logthis("put_dom failed - no homeserver and/or domain"); |
&logthis("put_dom failed - no homeserver and/or domain"); |
} |
} |
Line 1793 sub retrieve_inst_usertypes {
|
Line 1829 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 1808 sub inst_directory_query {
|
Line 1844 sub inst_directory_query {
|
my $homeserver = &domain($udom,'primary'); |
my $homeserver = &domain($udom,'primary'); |
my $outcome; |
my $outcome; |
if ($homeserver ne '') { |
if ($homeserver ne '') { |
|
unless ($homeserver eq $perlvar{'lonHostID'}) { |
|
if ($srch->{'srchby'} eq 'email') { |
|
my $lcrev = &get_server_loncaparev(undef,$homeserver); |
|
my ($major,$minor,$subver) = ($lcrev =~ /^\'?(\d+)\.(\d+)\.([\w.\-]+)\'?$/); |
|
if (($major eq '' && $minor eq '') || ($major < 2) || |
|
(($major == 2) && ($minor < 11)) || |
|
(($major == 2) && ($minor == 11) && ($subver !~ /^2\.B/))) { |
|
return; |
|
} |
|
} |
|
} |
my $queryid=&reply("querysend:instdirsearch:". |
my $queryid=&reply("querysend:instdirsearch:". |
&escape($srch->{'srchby'}).':'. |
&escape($srch->{'srchby'}).':'. |
&escape($srch->{'srchterm'}).':'. |
&escape($srch->{'srchterm'}).':'. |
&escape($srch->{'srchtype'}),$homeserver); |
&escape($srch->{'srchtype'}),$homeserver); |
my $host=&hostname($homeserver); |
my $host=&hostname($homeserver); |
if ($queryid !~/^\Q$host\E\_/) { |
if ($queryid !~/^\Q$host\E\_/) { |
&logthis('instituional directory search invalid queryid: '.$queryid.' for host: '.$homeserver.'in domain '.$udom); |
&logthis('institutional directory search invalid queryid: '.$queryid.' for host: '.$homeserver.' in domain '.$udom); |
return; |
return; |
} |
} |
my $response = &get_query_reply($queryid); |
my $response = &get_query_reply($queryid); |
Line 1849 sub usersearch {
|
Line 1896 sub usersearch {
|
my $query = 'usersearch'; |
my $query = 'usersearch'; |
foreach my $tryserver (keys(%libserv)) { |
foreach my $tryserver (keys(%libserv)) { |
if (&host_domain($tryserver) eq $dom) { |
if (&host_domain($tryserver) eq $dom) { |
|
unless ($tryserver eq $perlvar{'lonHostID'}) { |
|
if ($srch->{'srchby'} eq 'email') { |
|
my $lcrev = &get_server_loncaparev(undef,$tryserver); |
|
my ($major,$minor,$subver) = ($lcrev =~ /^\'?(\d+)\.(\d+)\.([\w.\-]+)\'?$/); |
|
next if (($major eq '' && $minor eq '') || ($major < 2) || |
|
(($major == 2) && ($minor < 11)) || |
|
(($major == 2) && ($minor == 11) && ($subver !~ /^2\.B/))); |
|
} |
|
} |
my $host=&hostname($tryserver); |
my $host=&hostname($tryserver); |
my $queryid= |
my $queryid= |
&reply("querysend:".&escape($query).':'. |
&reply("querysend:".&escape($query).':'. |
Line 2087 sub get_domain_defaults {
|
Line 2143 sub get_domain_defaults {
|
'requestcourses','inststatus', |
'requestcourses','inststatus', |
'coursedefaults','usersessions', |
'coursedefaults','usersessions', |
'requestauthor','selfenrollment', |
'requestauthor','selfenrollment', |
'coursecategories'],$domain); |
'coursecategories','autoenroll', |
|
'helpsettings'],$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 2096 sub get_domain_defaults {
|
Line 2153 sub get_domain_defaults {
|
$domdefaults{'timezone_def'} = $domconfig{'defaults'}{'timezone_def'}; |
$domdefaults{'timezone_def'} = $domconfig{'defaults'}{'timezone_def'}; |
$domdefaults{'datelocale_def'} = $domconfig{'defaults'}{'datelocale_def'}; |
$domdefaults{'datelocale_def'} = $domconfig{'defaults'}{'datelocale_def'}; |
$domdefaults{'portal_def'} = $domconfig{'defaults'}{'portal_def'}; |
$domdefaults{'portal_def'} = $domconfig{'defaults'}{'portal_def'}; |
|
$domdefaults{'intauth_cost'} = $domconfig{'defaults'}{'intauth_cost'}; |
|
$domdefaults{'intauth_switch'} = $domconfig{'defaults'}{'intauth_switch'}; |
|
$domdefaults{'intauth_check'} = $domconfig{'defaults'}{'intauth_check'}; |
} else { |
} else { |
$domdefaults{'lang_def'} = &domain($domain,'lang_def'); |
$domdefaults{'lang_def'} = &domain($domain,'lang_def'); |
$domdefaults{'auth_def'} = &domain($domain,'auth_def'); |
$domdefaults{'auth_def'} = &domain($domain,'auth_def'); |
Line 2212 sub get_domain_defaults {
|
Line 2272 sub get_domain_defaults {
|
$domdefaults{'catunauth'} = $domconfig{'coursecategories'}{'unauth'}; |
$domdefaults{'catunauth'} = $domconfig{'coursecategories'}{'unauth'}; |
} |
} |
} |
} |
|
if (ref($domconfig{'autoenroll'}) eq 'HASH') { |
|
$domdefaults{'autofailsafe'} = $domconfig{'autoenroll'}{'autofailsafe'}; |
|
} |
|
if (ref($domconfig{'helpsettings'}) eq 'HASH') { |
|
$domdefaults{'submitbugs'} = $domconfig{'helpsettings'}{'submitbugs'}; |
|
if (ref($domconfig{'helpsettings'}{'adhoc'}) eq 'HASH') { |
|
$domdefaults{'adhocroles'} = $domconfig{'helpsettings'}{'adhoc'}; |
|
} |
|
} |
&do_cache_new('domdefaults',$domain,\%domdefaults,$cachetime); |
&do_cache_new('domdefaults',$domain,\%domdefaults,$cachetime); |
return %domdefaults; |
return %domdefaults; |
} |
} |
|
|
|
sub course_portal_url { |
|
my ($cnum,$cdom) = @_; |
|
my $chome = &homeserver($cnum,$cdom); |
|
my $hostname = &hostname($chome); |
|
my $protocol = $protocol{$chome}; |
|
$protocol = 'http' if ($protocol ne 'https'); |
|
my %domdefaults = &get_domain_defaults($cdom); |
|
my $firsturl; |
|
if ($domdefaults{'portal_def'}) { |
|
$firsturl = $domdefaults{'portal_def'}; |
|
} else { |
|
$firsturl = $protocol.'://'.$hostname; |
|
} |
|
return $firsturl; |
|
} |
|
|
# --------------------------------------------------- Assign a key to a student |
# --------------------------------------------------- Assign a key to a student |
|
|
sub assign_access_key { |
sub assign_access_key { |
Line 2452 sub make_key {
|
Line 2537 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{$id}); |
delete($remembered{$remembered_id}); |
delete($accessed{$id}); |
delete($accessed{$remembered_id}); |
} |
} |
|
|
sub is_cached_new { |
sub is_cached_new { |
my ($name,$id,$debug) = @_; |
my ($name,$id,$debug) = @_; |
$id=&make_key($name,$id); |
my $remembered_id=$name.':'.$id; # this is to avoid make_key (which is slow) for |
if (exists($remembered{$id})) { |
# keys in %remembered hash, which persists for |
if ($debug) { &Apache::lonnet::logthis("Early return $id of $remembered{$id} "); } |
# duration of request (no restriction on key length). |
$accessed{$id}=[&gettimeofday()]; |
if (exists($remembered{$remembered_id})) { |
|
if ($debug) { &Apache::lonnet::logthis("Early return $remembered_id of $remembered{$remembered_id} "); } |
|
$accessed{$remembered_id}=[&gettimeofday()]; |
$hits++; |
$hits++; |
return ($remembered{$id},1); |
return ($remembered{$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 2476 sub is_cached_new {
|
Line 2565 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($id,$value,$debug); |
&make_room($remembered_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 2498 sub do_cache_new {
|
Line 2588 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($id,$value,$debug); |
&make_room($remembered_id,$value,$debug); |
return $value; |
return $value; |
} |
} |
|
|
sub make_room { |
sub make_room { |
my ($id,$value,$debug)=@_; |
my ($remembered_id,$value,$debug)=@_; |
|
|
$remembered{$id}= (ref($value)) ? &Storable::dclone($value) |
$remembered{$remembered_id}= (ref($value)) ? &Storable::dclone($value) |
: $value; |
: $value; |
if ($to_remember<0) { return; } |
if ($to_remember<0) { return; } |
$accessed{$id}=[&gettimeofday()]; |
$accessed{$remembered_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 2971 sub can_edit_resource {
|
Line 3061 sub can_edit_resource {
|
$forceedit = 1; |
$forceedit = 1; |
} |
} |
$cfile = $resurl; |
$cfile = $resurl; |
|
} elsif ($resurl =~ m{^/adm/wrapper/adm/$cdom/$cnum/\d+/ext\.tool$}) { |
|
$incourse = 1; |
|
if ($env{'form.forceedit'}) { |
|
$forceview = 1; |
|
} else { |
|
$forceedit = 1; |
|
} |
|
$cfile = $resurl; |
} elsif ($resurl =~ m{^/?adm/viewclasslist$}) { |
} elsif ($resurl =~ m{^/?adm/viewclasslist$}) { |
$incourse = 1; |
$incourse = 1; |
if ($env{'form.forceedit'}) { |
if ($env{'form.forceedit'}) { |
Line 2995 sub can_edit_resource {
|
Line 3093 sub can_edit_resource {
|
$forceedit = 1; |
$forceedit = 1; |
} |
} |
$cfile = $resurl; |
$cfile = $resurl; |
|
} elsif (($resurl =~ m{^/adm/wrapper/adm/$cdom/$cnum/\d+/ext\.tool$}) && ($env{'form.folderpath'} =~ /^supplemental/)) { |
|
$incourse = 1; |
|
if ($env{'form.forceedit'}) { |
|
$forceview = 1; |
|
} else { |
|
$forceedit = 1; |
|
} |
|
$cfile = $resurl; |
} elsif (($resurl eq '/adm/extresedit') && ($symb || $env{'form.folderpath'})) { |
} elsif (($resurl eq '/adm/extresedit') && ($symb || $env{'form.folderpath'})) { |
$incourse = 1; |
$incourse = 1; |
$forceview = 1; |
$forceview = 1; |
Line 3004 sub can_edit_resource {
|
Line 3110 sub can_edit_resource {
|
$cfile = &clutter($res); |
$cfile = &clutter($res); |
} else { |
} else { |
$cfile = $env{'form.suppurl'}; |
$cfile = $env{'form.suppurl'}; |
$cfile =~ s{^http://}{}; |
my $escfile = &unescape($cfile); |
$cfile = '/adm/wrapper/ext/'.$cfile; |
if ($escfile =~ m{^/adm/$cdom/$cnum/\d+/ext\.tool$}) { |
|
$cfile = '/adm/wrapper'.$escfile; |
|
} else { |
|
$escfile =~ s{^http://}{}; |
|
$cfile = &escape("/adm/wrapper/ext/$escfile"); |
|
} |
} |
} |
} elsif ($resurl =~ m{^/?adm/viewclasslist$}) { |
} elsif ($resurl =~ m{^/?adm/viewclasslist$}) { |
if ($env{'form.forceedit'}) { |
if ($env{'form.forceedit'}) { |
Line 3161 sub process_coursefile {
|
Line 3272 sub process_coursefile {
|
$home); |
$home); |
} |
} |
} elsif ($action eq 'uploaddoc') { |
} elsif ($action eq 'uploaddoc') { |
open(my $fh,'>'.$filepath.'/'.$fname); |
open(my $fh,'>',$filepath.'/'.$fname); |
print $fh $env{'form.'.$source}; |
print $fh $env{'form.'.$source}; |
close($fh); |
close($fh); |
if ($parser eq 'parse') { |
if ($parser eq 'parse') { |
Line 3219 sub store_edited_file {
|
Line 3330 sub store_edited_file {
|
($fpath,$fname) = ($file =~ m|^(.*)/([^/]+)$|); |
($fpath,$fname) = ($file =~ m|^(.*)/([^/]+)$|); |
$fpath=$docudom.'/'.$docuname.'/'.$fpath; |
$fpath=$docudom.'/'.$docuname.'/'.$fpath; |
my $filepath = &build_filepath($fpath); |
my $filepath = &build_filepath($fpath); |
open(my $fh,'>'.$filepath.'/'.$fname); |
open(my $fh,'>',$filepath.'/'.$fname); |
print $fh $content; |
print $fh $content; |
close($fh); |
close($fh); |
my $home=&homeserver($docuname,$docudom); |
my $home=&homeserver($docuname,$docudom); |
Line 3335 sub userfileupload {
|
Line 3446 sub userfileupload {
|
'_'.$env{'user.domain'}.'/pending'; |
'_'.$env{'user.domain'}.'/pending'; |
} elsif (($context eq 'existingfile') || ($context eq 'canceloverwrite')) { |
} elsif (($context eq 'existingfile') || ($context eq 'canceloverwrite')) { |
my ($docuname,$docudom); |
my ($docuname,$docudom); |
if ($destudom) { |
if ($destudom =~ /^$match_domain$/) { |
$docudom = $destudom; |
$docudom = $destudom; |
} else { |
} else { |
$docudom = $env{'user.domain'}; |
$docudom = $env{'user.domain'}; |
} |
} |
if ($destuname) { |
if ($destuname =~ /^$match_username$/) { |
$docuname = $destuname; |
$docuname = $destuname; |
} else { |
} else { |
$docuname = $env{'user.name'}; |
$docuname = $env{'user.name'}; |
Line 3370 sub userfileupload {
|
Line 3481 sub userfileupload {
|
mkdir($fullpath,0777); |
mkdir($fullpath,0777); |
} |
} |
} |
} |
open(my $fh,'>'.$fullpath.'/'.$fname); |
open(my $fh,'>',$fullpath.'/'.$fname); |
print $fh $env{'form.'.$formname}; |
print $fh $env{'form.'.$formname}; |
close($fh); |
close($fh); |
if ($context eq 'existingfile') { |
if ($context eq 'existingfile') { |
Line 3445 sub finishuserfileupload {
|
Line 3556 sub finishuserfileupload {
|
|
|
# Save the file |
# Save the file |
{ |
{ |
if (!open(FH,'>'.$filepath.'/'.$file)) { |
if (!open(FH,'>',$filepath.'/'.$file)) { |
&logthis('Failed to create '.$filepath.'/'.$file); |
&logthis('Failed to create '.$filepath.'/'.$file); |
print STDERR ('Failed to create '.$filepath.'/'.$file."\n"); |
print STDERR ('Failed to create '.$filepath.'/'.$file."\n"); |
return '/adm/notfound.html'; |
return '/adm/notfound.html'; |
Line 3503 sub finishuserfileupload {
|
Line 3614 sub finishuserfileupload {
|
my $input = $filepath.'/'.$file; |
my $input = $filepath.'/'.$file; |
my $output = $filepath.'/'.'tn-'.$file; |
my $output = $filepath.'/'.'tn-'.$file; |
my $thumbsize = $thumbwidth.'x'.$thumbheight; |
my $thumbsize = $thumbwidth.'x'.$thumbheight; |
system("convert -sample $thumbsize $input $output"); |
my @args = ('convert','-sample',$thumbsize,$input,$output); |
|
system({$args[0]} @args); |
if (-e $filepath.'/'.'tn-'.$file) { |
if (-e $filepath.'/'.'tn-'.$file) { |
$fetchthumb = 1; |
$fetchthumb = 1; |
} |
} |
Line 3887 sub flushcourselogs {
|
Line 3999 sub flushcourselogs {
|
} |
} |
} |
} |
# |
# |
# Reverse lookup of domain roles (dc, ad, li, sc, au) |
# Reverse lookup of domain roles (dc, ad, li, sc, dh, da, au) |
# |
# |
my %domrolebuffer = (); |
my %domrolebuffer = (); |
foreach my $entry (keys(%domainrolehash)) { |
foreach my $entry (keys(%domainrolehash)) { |
Line 3902 sub flushcourselogs {
|
Line 4014 sub flushcourselogs {
|
delete $domainrolehash{$entry}; |
delete $domainrolehash{$entry}; |
} |
} |
foreach my $dom (keys(%domrolebuffer)) { |
foreach my $dom (keys(%domrolebuffer)) { |
my %servers = &get_servers($dom,'library'); |
my %servers; |
|
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)) { |
unless (&reply('domroleput:'.$dom.':'. |
if (&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 4025 sub userrolelog {
|
Line 4146 sub userrolelog {
|
{$trole.':'.$username.':'.$domain.':'.$env{'user.name'}.':'.$env{'user.domain'}.':'} |
{$trole.':'.$username.':'.$domain.':'.$env{'user.name'}.':'.$env{'user.domain'}.':'} |
=$tend.':'.$tstart; |
=$tend.':'.$tstart; |
} |
} |
if ($trole =~ /^(dc|ad|li|au|dg|sc)/ ) { |
if ($trole =~ /^(dc|ad|li|au|dg|sc|dh|da)/ ) { |
my (undef,$rudom,$runame,$rsec)=split(/\//,$area); |
my (undef,$rudom,$runame,$rsec)=split(/\//,$area); |
$domainrolehash |
$domainrolehash |
{$trole.':'.$username.':'.$domain.':'.$runame.':'.$rudom.':'.$rsec} |
{$trole.':'.$username.':'.$domain.':'.$runame.':'.$rudom.':'.$rsec} |
Line 4252 sub get_my_roles {
|
Line 4373 sub get_my_roles {
|
return %returnhash; |
return %returnhash; |
} |
} |
|
|
|
sub get_all_adhocroles { |
|
my ($dom) = @_; |
|
my @roles_by_num = (); |
|
my %domdefaults = &get_domain_defaults($dom); |
|
my (%description,%access_in_dom,%access_info); |
|
if (ref($domdefaults{'adhocroles'}) eq 'HASH') { |
|
my $count = 0; |
|
my %domcurrent = %{$domdefaults{'adhocroles'}}; |
|
my %ordered; |
|
foreach my $role (sort(keys(%domcurrent))) { |
|
my ($order,$desc,$access_in_dom); |
|
if (ref($domcurrent{$role}) eq 'HASH') { |
|
$order = $domcurrent{$role}{'order'}; |
|
$desc = $domcurrent{$role}{'desc'}; |
|
$access_in_dom{$role} = $domcurrent{$role}{'access'}; |
|
$access_info{$role} = $domcurrent{$role}{$access_in_dom{$role}}; |
|
} |
|
if ($order eq '') { |
|
$order = $count; |
|
} |
|
$ordered{$order} = $role; |
|
if ($desc ne '') { |
|
$description{$role} = $desc; |
|
} else { |
|
$description{$role}= $role; |
|
} |
|
$count++; |
|
} |
|
foreach my $item (sort {$a <=> $b } (keys(%ordered))) { |
|
push(@roles_by_num,$ordered{$item}); |
|
} |
|
} |
|
return (\@roles_by_num,\%description,\%access_in_dom,\%access_info); |
|
} |
|
|
|
sub get_my_adhocroles { |
|
my ($cid,$checkreg) = @_; |
|
my ($cdom,$cnum,%info,@possroles,$description,$roles_by_num); |
|
if ($env{'request.course.id'} eq $cid) { |
|
$cdom = $env{'course.'.$cid.'.domain'}; |
|
$cnum = $env{'course.'.$cid.'.num'}; |
|
$info{'internal.coursecode'} = $env{'course.'.$cid.'.internal.coursecode'}; |
|
} elsif ($cid =~ /^($match_domain)_($match_courseid)$/) { |
|
$cdom = $1; |
|
$cnum = $2; |
|
%info = &Apache::lonnet::get('environment',['internal.coursecode'], |
|
$cdom,$cnum); |
|
} |
|
if (($info{'internal.coursecode'} ne '') && ($checkreg)) { |
|
my $user = $env{'user.name'}.':'.$env{'user.domain'}; |
|
my %rosterhash = &get('classlist',[$user],$cdom,$cnum); |
|
if ($rosterhash{$user} ne '') { |
|
my $type = (split(/:/,$rosterhash{$user}))[5]; |
|
return ([],{}) if ($type eq 'auto'); |
|
} |
|
} |
|
if (($cdom ne '') && ($cnum ne '')) { |
|
if (($env{"user.role.dh./$cdom/"}) || ($env{"user.role.da./$cdom/"})) { |
|
my $then=$env{'user.login.time'}; |
|
my $update=$env{'user.update.time'}; |
|
if (!$update) { |
|
$update = $then; |
|
} |
|
my @liveroles; |
|
foreach my $role ('dh','da') { |
|
if ($env{"user.role.$role./$cdom/"}) { |
|
my ($tstart,$tend)=split(/\./,$env{"user.role.$role./$cdom/"}); |
|
my $limit = $update; |
|
if ($env{'request.role'} eq "$role./$cdom/") { |
|
$limit = $then; |
|
} |
|
my $activerole = 1; |
|
if ($tstart && $tstart>$limit) { $activerole = 0; } |
|
if ($tend && $tend <$limit) { $activerole = 0; } |
|
if ($activerole) { |
|
push(@liveroles,$role); |
|
} |
|
} |
|
} |
|
if (@liveroles) { |
|
if (&homeserver($cnum,$cdom) ne 'no_host') { |
|
my ($accessref,$accessinfo,%access_in_dom); |
|
($roles_by_num,$description,$accessref,$accessinfo) = &get_all_adhocroles($cdom); |
|
if (ref($roles_by_num) eq 'ARRAY') { |
|
if (@{$roles_by_num}) { |
|
my %settings; |
|
if ($env{'request.course.id'} eq $cid) { |
|
foreach my $envkey (keys(%env)) { |
|
if ($envkey =~ /^\Qcourse.$cid.\E(internal\.adhoc.+)$/) { |
|
$settings{$1} = $env{$envkey}; |
|
} |
|
} |
|
} else { |
|
%settings = &dump('environment',$cdom,$cnum,'internal\.adhoc'); |
|
} |
|
my %setincrs; |
|
if ($settings{'internal.adhocaccess'}) { |
|
map { $setincrs{$_} = 1; } split(/,/,$settings{'internal.adhocaccess'}); |
|
} |
|
my @statuses; |
|
if ($env{'environment.inststatus'}) { |
|
@statuses = split(/,/,$env{'environment.inststatus'}); |
|
} |
|
my $user = $env{'user.name'}.':'.$env{'user.domain'}; |
|
if (ref($accessref) eq 'HASH') { |
|
%access_in_dom = %{$accessref}; |
|
} |
|
foreach my $role (@{$roles_by_num}) { |
|
my ($curraccess,@okstatus,@personnel); |
|
if ($setincrs{$role}) { |
|
($curraccess,my $rest) = split(/=/,$settings{'internal.adhoc.'.$role}); |
|
if ($curraccess eq 'status') { |
|
@okstatus = split(/\&/,$rest); |
|
} elsif (($curraccess eq 'exc') || ($curraccess eq 'inc')) { |
|
@personnel = split(/\&/,$rest); |
|
} |
|
} else { |
|
$curraccess = $access_in_dom{$role}; |
|
if (ref($accessinfo) eq 'HASH') { |
|
if ($curraccess eq 'status') { |
|
if (ref($accessinfo->{$role}) eq 'ARRAY') { |
|
@okstatus = @{$accessinfo->{$role}}; |
|
} |
|
} elsif (($curraccess eq 'exc') || ($curraccess eq 'inc')) { |
|
if (ref($accessinfo->{$role}) eq 'ARRAY') { |
|
@personnel = @{$accessinfo->{$role}}; |
|
} |
|
} |
|
} |
|
} |
|
if ($curraccess eq 'none') { |
|
next; |
|
} elsif ($curraccess eq 'all') { |
|
push(@possroles,$role); |
|
} elsif ($curraccess eq 'dh') { |
|
if (grep(/^dh$/,@liveroles)) { |
|
push(@possroles,$role); |
|
} else { |
|
next; |
|
} |
|
} elsif ($curraccess eq 'da') { |
|
if (grep(/^da$/,@liveroles)) { |
|
push(@possroles,$role); |
|
} else { |
|
next; |
|
} |
|
} elsif ($curraccess eq 'status') { |
|
if (@okstatus) { |
|
if (!@statuses) { |
|
if (grep(/^default$/,@okstatus)) { |
|
push(@possroles,$role); |
|
} |
|
} else { |
|
foreach my $status (@okstatus) { |
|
if (grep(/^\Q$status\E$/,@statuses)) { |
|
push(@possroles,$role); |
|
last; |
|
} |
|
} |
|
} |
|
} |
|
} elsif (($curraccess eq 'exc') || ($curraccess eq 'inc')) { |
|
if (grep(/^\Q$user\E$/,@personnel)) { |
|
if ($curraccess eq 'exc') { |
|
push(@possroles,$role); |
|
} |
|
} elsif ($curraccess eq 'inc') { |
|
push(@possroles,$role); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
unless (ref($description) eq 'HASH') { |
|
if (ref($roles_by_num) eq 'ARRAY') { |
|
my %desc; |
|
map { $desc{$_} = $_; } (@{$roles_by_num}); |
|
$description = \%desc; |
|
} else { |
|
$description = {}; |
|
} |
|
} |
|
return (\@possroles,$description); |
|
} |
|
|
# ----------------------------------------------------- Frontpage Announcements |
# ----------------------------------------------------- Frontpage Announcements |
# |
# |
# |
# |
Line 4265 sub postannounce {
|
Line 4575 sub postannounce {
|
|
|
sub getannounce { |
sub getannounce { |
|
|
if (open(my $fh,$perlvar{'lonDocRoot'}.'/announcement.txt')) { |
if (open(my $fh,"<",$perlvar{'lonDocRoot'}.'/announcement.txt')) { |
my $announcement=''; |
my $announcement=''; |
while (my $line = <$fh>) { $announcement .= $line; } |
while (my $line = <$fh>) { $announcement .= $line; } |
close($fh); |
close($fh); |
Line 4492 sub get_domain_roles {
|
Line 4802 sub get_domain_roles {
|
return %personnel; |
return %personnel; |
} |
} |
|
|
|
sub get_active_domroles { |
|
my ($dom,$roles) = @_; |
|
return () unless (ref($roles) eq 'ARRAY'); |
|
my $now = time; |
|
my %dompersonnel = &get_domain_roles($dom,$roles,$now,$now); |
|
my %domroles; |
|
foreach my $server (keys(%dompersonnel)) { |
|
foreach my $user (sort(keys(%{$dompersonnel{$server}}))) { |
|
my ($trole,$uname,$udom,$runame,$rudom,$rsec) = split(/:/,$user); |
|
$domroles{$uname.':'.$udom} = $dompersonnel{$server}{$user}; |
|
} |
|
} |
|
return %domroles; |
|
} |
|
|
# ----------------------------------------------------------- Interval timing |
# ----------------------------------------------------------- Interval timing |
|
|
{ |
{ |
Line 4506 my %cachedtimes=();
|
Line 4831 my %cachedtimes=();
|
my $cachedtime=''; |
my $cachedtime=''; |
|
|
sub load_all_first_access { |
sub load_all_first_access { |
my ($uname,$udom)=@_; |
my ($uname,$udom,$ignorecache)=@_; |
if (($cachedkey eq $uname.':'.$udom) && |
if (($cachedkey eq $uname.':'.$udom) && |
(abs($cachedtime-time)<5) && (!$env{'form.markaccess'})) { |
(abs($cachedtime-time)<5) && (!$env{'form.markaccess'}) && |
|
(!$ignorecache)) { |
return; |
return; |
} |
} |
$cachedtime=time; |
$cachedtime=time; |
Line 4517 sub load_all_first_access {
|
Line 4843 sub load_all_first_access {
|
} |
} |
|
|
sub get_first_access { |
sub get_first_access { |
my ($type,$argsymb,$argmap)=@_; |
my ($type,$argsymb,$argmap,$ignorecache)=@_; |
my ($symb,$courseid,$udom,$uname)=&whichuser(); |
my ($symb,$courseid,$udom,$uname)=&whichuser(); |
if ($argsymb) { $symb=$argsymb; } |
if ($argsymb) { $symb=$argsymb; } |
my ($map,$id,$res)=&decode_symb($symb); |
my ($map,$id,$res)=&decode_symb($symb); |
Line 4529 sub get_first_access {
|
Line 4855 sub get_first_access {
|
} else { |
} else { |
$res=$symb; |
$res=$symb; |
} |
} |
&load_all_first_access($uname,$udom); |
&load_all_first_access($uname,$udom,$ignorecache); |
return $cachedtimes{"$courseid\0$res"}; |
return $cachedtimes{"$courseid\0$res"}; |
} |
} |
|
|
Line 5430 sub rolesinit {
|
Line 5756 sub rolesinit {
|
} |
} |
} |
} |
|
|
@userroles{'user.author', 'user.adv'} = &set_userprivs(\%userroles, |
@userroles{'user.author','user.adv','user.rar'} = &set_userprivs(\%userroles, |
\%allroles, \%allgroups); |
\%allroles, \%allgroups); |
$env{'user.adv'} = $userroles{'user.adv'}; |
$env{'user.adv'} = $userroles{'user.adv'}; |
|
$env{'user.rar'} = $userroles{'user.rar'}; |
|
|
return (\%userroles,\%firstaccenv,\%timerintenv); |
return (\%userroles,\%firstaccenv,\%timerintenv); |
} |
} |
Line 5468 sub custom_roleprivs {
|
Line 5795 sub custom_roleprivs {
|
$$allroles{$spec.'./'.$tdomain.'/'}.=':'.$dompriv; |
$$allroles{$spec.'./'.$tdomain.'/'}.=':'.$dompriv; |
} |
} |
if (($trest ne '') && (defined($coursepriv))) { |
if (($trest ne '') && (defined($coursepriv))) { |
|
if ($trole =~ m{^cr/$tdomain/$tdomain\Q-domainconfig\E/([^/]+)$}) { |
|
my $rolename = $1; |
|
$coursepriv = &course_adhocrole_privs($rolename,$tdomain,$trest,$coursepriv); |
|
} |
$$allroles{'cm.'.$area}.=':'.$coursepriv; |
$$allroles{'cm.'.$area}.=':'.$coursepriv; |
$$allroles{$spec.'.'.$area}.=':'.$coursepriv; |
$$allroles{$spec.'.'.$area}.=':'.$coursepriv; |
} |
} |
Line 5476 sub custom_roleprivs {
|
Line 5807 sub custom_roleprivs {
|
} |
} |
} |
} |
|
|
|
sub course_adhocrole_privs { |
|
my ($rolename,$cdom,$cnum,$coursepriv) = @_; |
|
my %overrides = &get('environment',["internal.adhocpriv.$rolename"],$cdom,$cnum); |
|
if ($overrides{"internal.adhocpriv.$rolename"}) { |
|
my (%currprivs,%storeprivs); |
|
foreach my $item (split(/:/,$coursepriv)) { |
|
my ($priv,$restrict) = split(/\&/,$item); |
|
$currprivs{$priv} = $restrict; |
|
} |
|
my (%possadd,%possremove,%full); |
|
foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:c'})) { |
|
my ($priv,$restrict)=split(/\&/,$item); |
|
$full{$priv} = $restrict; |
|
} |
|
foreach my $item (split(/,/,$overrides{"internal.adhocpriv.$rolename"})) { |
|
next if ($item eq ''); |
|
my ($rule,$rest) = split(/=/,$item); |
|
next unless (($rule eq 'off') || ($rule eq 'on')); |
|
foreach my $priv (split(/:/,$rest)) { |
|
if ($priv ne '') { |
|
if ($rule eq 'off') { |
|
$possremove{$priv} = 1; |
|
} else { |
|
$possadd{$priv} = 1; |
|
} |
|
} |
|
} |
|
} |
|
foreach my $priv (sort(keys(%full))) { |
|
if (exists($currprivs{$priv})) { |
|
unless (exists($possremove{$priv})) { |
|
$storeprivs{$priv} = $currprivs{$priv}; |
|
} |
|
} elsif (exists($possadd{$priv})) { |
|
$storeprivs{$priv} = $full{$priv}; |
|
} |
|
} |
|
$coursepriv = ':'.join(':',map { $_.'&'.$storeprivs{$_}; } sort(keys(%storeprivs))); |
|
} |
|
return $coursepriv; |
|
} |
|
|
sub group_roleprivs { |
sub group_roleprivs { |
my ($allgroups,$area,$group_privs,$tend,$tstart) = @_; |
my ($allgroups,$area,$group_privs,$tend,$tstart) = @_; |
my $access = 1; |
my $access = 1; |
Line 5510 sub set_userprivs {
|
Line 5883 sub set_userprivs {
|
my ($userroles,$allroles,$allgroups,$groups_roles) = @_; |
my ($userroles,$allroles,$allgroups,$groups_roles) = @_; |
my $author=0; |
my $author=0; |
my $adv=0; |
my $adv=0; |
|
my $rar=0; |
my %grouproles = (); |
my %grouproles = (); |
if (keys(%{$allgroups}) > 0) { |
if (keys(%{$allgroups}) > 0) { |
my @groupkeys; |
my @groupkeys; |
Line 5557 sub set_userprivs {
|
Line 5931 sub set_userprivs {
|
$thesepriv{$privilege}.=$restrictions; |
$thesepriv{$privilege}.=$restrictions; |
} |
} |
if ($thesepriv{'adv'} eq 'F') { $adv=1; } |
if ($thesepriv{'adv'} eq 'F') { $adv=1; } |
|
if ($thesepriv{'rar'} eq 'F') { $rar=1; } |
} |
} |
} |
} |
my $thesestr=''; |
my $thesestr=''; |
Line 5565 sub set_userprivs {
|
Line 5940 sub set_userprivs {
|
} |
} |
$userroles->{'user.priv.'.$role} = $thesestr; |
$userroles->{'user.priv.'.$role} = $thesestr; |
} |
} |
return ($author,$adv); |
return ($author,$adv,$rar); |
} |
} |
|
|
sub role_status { |
sub role_status { |
Line 5610 sub role_status {
|
Line 5985 sub role_status {
|
push(@rolecodes,$$role); |
push(@rolecodes,$$role); |
&standard_roleprivs(\%allroles,$$role,$tdomain,$spec,$trest,$$where); |
&standard_roleprivs(\%allroles,$$role,$tdomain,$spec,$trest,$$where); |
} |
} |
my ($author,$adv)= &set_userprivs(\%userroles,\%allroles,\%allgroups,\%groups_roles); |
my ($author,$adv,$rar)= &set_userprivs(\%userroles,\%allroles,\%allgroups, |
|
\%groups_roles); |
&appenv(\%userroles,\@rolecodes); |
&appenv(\%userroles,\@rolecodes); |
&log($env{'user.domain'},$env{'user.name'},$env{'user.home'},"Role ".$role); |
&log($env{'user.domain'},$env{'user.name'},$env{'user.home'},"Role ".$spec); |
} |
} |
} |
} |
$$tstatus = 'is'; |
$$tstatus = 'is'; |
Line 5688 sub delete_env_groupprivs {
|
Line 6064 sub delete_env_groupprivs {
|
} |
} |
|
|
sub check_adhoc_privs { |
sub check_adhoc_privs { |
my ($cdom,$cnum,$update,$refresh,$now,$checkrole,$caller) = @_; |
my ($cdom,$cnum,$update,$refresh,$now,$checkrole,$caller,$sec) = @_; |
my $cckey = 'user.role.'.$checkrole.'./'.$cdom.'/'.$cnum; |
my $cckey = 'user.role.'.$checkrole.'./'.$cdom.'/'.$cnum; |
|
if ($sec) { |
|
$cckey .= '/'.$sec; |
|
} |
my $setprivs; |
my $setprivs; |
if ($env{$cckey}) { |
if ($env{$cckey}) { |
my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus,$tpstart,$tpend); |
my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus,$tpstart,$tpend); |
&role_status($cckey,$update,$refresh,$now,\$role,\$where,\$trolecode,\$tstatus,\$tstart,\$tend); |
&role_status($cckey,$update,$refresh,$now,\$role,\$where,\$trolecode,\$tstatus,\$tstart,\$tend); |
unless (($tstatus eq 'is') || ($tstatus eq 'will_not')) { |
unless (($tstatus eq 'is') || ($tstatus eq 'will_not')) { |
&set_adhoc_privileges($cdom,$cnum,$checkrole,$caller); |
&set_adhoc_privileges($cdom,$cnum,$checkrole,$caller,$sec); |
$setprivs = 1; |
$setprivs = 1; |
} |
} |
} else { |
} else { |
&set_adhoc_privileges($cdom,$cnum,$checkrole,$caller); |
&set_adhoc_privileges($cdom,$cnum,$checkrole,$caller,$sec); |
$setprivs = 1; |
$setprivs = 1; |
} |
} |
return $setprivs; |
return $setprivs; |
} |
} |
|
|
sub set_adhoc_privileges { |
sub set_adhoc_privileges { |
# role can be cc or ca |
# role can be cc, ca, or cr/<dom>/<dom>-domainconfig/role |
my ($dcdom,$pickedcourse,$role,$caller) = @_; |
my ($dcdom,$pickedcourse,$role,$caller,$sec) = @_; |
my $area = '/'.$dcdom.'/'.$pickedcourse; |
my $area = '/'.$dcdom.'/'.$pickedcourse; |
|
if ($sec ne '') { |
|
$area .= '/'.$sec; |
|
} |
my $spec = $role.'.'.$area; |
my $spec = $role.'.'.$area; |
my %userroles = &set_arearole($role,$area,'','',$env{'user.domain'}, |
my %userroles = &set_arearole($role,$area,'','',$env{'user.domain'}, |
$env{'user.name'},1); |
$env{'user.name'},1); |
my %ccrole = (); |
my %rolehash = (); |
&standard_roleprivs(\%ccrole,$role,$dcdom,$spec,$pickedcourse,$area); |
if ($role =~ m{^\Qcr/$dcdom/$dcdom\E\-domainconfig/(\w+)$}) { |
my ($author,$adv)= &set_userprivs(\%userroles,\%ccrole); |
my $rolename = $1; |
|
&custom_roleprivs(\%rolehash,$role,$dcdom,$pickedcourse,$spec,$area); |
|
my %domdef = &get_domain_defaults($dcdom); |
|
if (ref($domdef{'adhocroles'}) eq 'HASH') { |
|
if (ref($domdef{'adhocroles'}{$rolename}) eq 'HASH') { |
|
&appenv({'request.role.desc' => $domdef{'adhocroles'}{$rolename}{'desc'},}); |
|
} |
|
} |
|
} else { |
|
&standard_roleprivs(\%rolehash,$role,$dcdom,$spec,$pickedcourse,$area); |
|
} |
|
my ($author,$adv,$rar)= &set_userprivs(\%userroles,\%rolehash); |
&appenv(\%userroles,[$role,'cm']); |
&appenv(\%userroles,[$role,'cm']); |
&log($env{'user.domain'},$env{'user.name'},$env{'user.home'},"Role ".$role); |
&log($env{'user.domain'},$env{'user.name'},$env{'user.home'},"Role ".$spec); |
unless ($caller eq 'constructaccess' && $env{'request.course.id'}) { |
unless ($caller eq 'constructaccess' && $env{'request.course.id'}) { |
&appenv( {'request.role' => $spec, |
&appenv( {'request.role' => $spec, |
'request.role.domain' => $dcdom, |
'request.role.domain' => $dcdom, |
'request.course.sec' => '' |
'request.course.sec' => $sec, |
} |
} |
); |
); |
my $tadv=0; |
my $tadv=0; |
Line 5868 sub currentdump {
|
Line 6261 sub currentdump {
|
# |
# |
my %returnhash=(); |
my %returnhash=(); |
# |
# |
if ($rep eq "unknown_cmd") { |
if ($rep eq 'unknown_cmd') { |
# an old lond will not know currentdump |
# an old lond will not know currentdump |
# Do a dump and make it look like a currentdump |
# Do a dump and make it look like a currentdump |
my @tmp = &dumpstore($courseid,$sdom,$sname,'.'); |
my @tmp = &dumpstore($courseid,$sdom,$sname,'.'); |
Line 6102 sub tmpget {
|
Line 6495 sub tmpget {
|
if (!defined($server)) { $server = $perlvar{'lonHostID'}; } |
if (!defined($server)) { $server = $perlvar{'lonHostID'}; } |
my $rep=&reply("tmpget:$token",$server); |
my $rep=&reply("tmpget:$token",$server); |
my %returnhash; |
my %returnhash; |
|
if ($rep =~ /^(con_lost|error|no_such_host)/i) { |
|
return %returnhash; |
|
} |
foreach my $item (split(/\&/,$rep)) { |
foreach my $item (split(/\&/,$rep)) { |
my ($key,$value)=split(/=/,$item); |
my ($key,$value)=split(/=/,$item); |
next if ($key =~ /^error: 2 /); |
|
$returnhash{&unescape($key)}=&thaw_unescape($value); |
$returnhash{&unescape($key)}=&thaw_unescape($value); |
} |
} |
return %returnhash; |
return %returnhash; |
Line 6219 sub sixnum_code {
|
Line 6614 sub sixnum_code {
|
# -------------------------------------------------- portfolio access checking |
# -------------------------------------------------- portfolio access checking |
|
|
sub portfolio_access { |
sub portfolio_access { |
my ($requrl) = @_; |
my ($requrl,$clientip) = @_; |
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); |
my $result = &get_portfolio_access($udom,$unum,$file_name,$group,$clientip); |
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 6247 sub portfolio_access {
|
Line 6642 sub portfolio_access {
|
} |
} |
|
|
sub get_portfolio_access { |
sub get_portfolio_access { |
my ($udom,$unum,$file_name,$group,$access_hash) = @_; |
my ($udom,$unum,$file_name,$group,$clientip,$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 6256 sub get_portfolio_access {
|
Line 6651 sub get_portfolio_access {
|
$access_hash = $access_controls{$file_name}; |
$access_hash = $access_controls{$file_name}; |
} |
} |
|
|
my ($public,$guest,@domains,@users,@courses,@groups); |
my ($public,$guest,@domains,@users,@courses,@groups,@ips); |
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 6280 sub get_portfolio_access {
|
Line 6675 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 6784 sub allowed {
|
Line 7194 sub allowed {
|
|
|
if (defined($env{'allowed.'.$priv})) { return $env{'allowed.'.$priv}; } |
if (defined($env{'allowed.'.$priv})) { return $env{'allowed.'.$priv}; } |
# Free bre access to adm and meta resources |
# Free bre access to adm and meta resources |
if (((($uri=~/^adm\//) && ($uri !~ m{/(?:smppg|bulletinboard)$})) |
if (((($uri=~/^adm\//) && ($uri !~ m{/(?:smppg|bulletinboard|ext\.tool)$})) |
|| (($uri=~/\.meta$/) && ($uri!~m|^uploaded/|) )) |
|| (($uri=~/\.meta$/) && ($uri!~m|^uploaded/|) )) |
&& ($priv eq 'bre')) { |
&& ($priv eq 'bre')) { |
return 'F'; |
return 'F'; |
Line 7003 sub allowed {
|
Line 7413 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); |
$thisallowed = &portfolio_access($uri,$clientip); |
} |
} |
|
|
# Full access at system, domain or course-wide level? Exit. |
# Full access at system, domain or course-wide level? Exit. |
Line 7272 sub constructaccess {
|
Line 7682 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 7445 sub get_commblock_resources {
|
Line 7855 sub get_commblock_resources {
|
} |
} |
} |
} |
} |
} |
if ($interval[0] =~ /^\d+$/) { |
if ($interval[0] =~ /^(\d+)/) { |
|
my $timelimit = $1; |
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); |
Line 7455 sub get_commblock_resources {
|
Line 7866 sub get_commblock_resources {
|
$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+$timelimit; |
if ($timesup > $now) { |
if ($timesup > $now) { |
my $activeblock; |
my $activeblock; |
foreach my $res (@to_test) { |
foreach my $res (@to_test) { |
Line 7610 sub get_symb_from_alias {
|
Line 8021 sub get_symb_from_alias {
|
|
|
sub definerole { |
sub definerole { |
if (allowed('mcr','/')) { |
if (allowed('mcr','/')) { |
my ($rolename,$sysrole,$domrole,$courole)=@_; |
my ($rolename,$sysrole,$domrole,$courole,$uname,$udom)=@_; |
foreach my $role (split(':',$sysrole)) { |
foreach my $role (split(':',$sysrole)) { |
my ($crole,$cqual)=split(/\&/,$role); |
my ($crole,$cqual)=split(/\&/,$role); |
if ($pr{'cr:s'}!~/\Q$crole\E/) { return "refused:s:$crole"; } |
if ($pr{'cr:s'}!~/\Q$crole\E/) { return "refused:s:$crole"; } |
Line 7638 sub definerole {
|
Line 8049 sub definerole {
|
} |
} |
} |
} |
} |
} |
|
my $uhome; |
|
if (($uname ne '') && ($udom ne '')) { |
|
$uhome = &homeserver($uname,$udom); |
|
return $uhome if ($uhome eq 'no_host'); |
|
} else { |
|
$uname = $env{'user.name'}; |
|
$udom = $env{'user.domain'}; |
|
$uhome = $env{'user.home'}; |
|
} |
my $command="encrypt:rolesput:$env{'user.domain'}:$env{'user.name'}:". |
my $command="encrypt:rolesput:$env{'user.domain'}:$env{'user.name'}:". |
"$env{'user.domain'}:$env{'user.name'}:". |
"$udom:$uname:rolesdef_$rolename=". |
"rolesdef_$rolename=". |
|
escape($sysrole.'_'.$domrole.'_'.$courole); |
escape($sysrole.'_'.$domrole.'_'.$courole); |
return reply($command,$env{'user.home'}); |
return reply($command,$uhome); |
} else { |
} else { |
return 'refused'; |
return 'refused'; |
} |
} |
Line 7724 sub update_allusers_table {
|
Line 8143 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; |
my ($homeserver,$sleep,$loopmax); |
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 7745 sub fetch_enrollment_query {
|
Line 8166 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); |
my $reply = &get_query_reply($queryid,$sleep,$loopmax); |
my $tries = 1; |
my $tries = 1; |
while (($reply=~/^timeout/) && ($tries < $maxtries)) { |
while (($reply=~/^timeout/) && ($tries < $maxtries)) { |
$reply = &get_query_reply($queryid); |
$reply = &get_query_reply($queryid,$sleep,$loopmax); |
$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 ($homeserver eq $perlvar{'lonHostID'}) { |
if (grep { $_ eq $homeserver } ¤t_machine_ids()) { |
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 7773 sub fetch_enrollment_query {
|
Line 8194 sub fetch_enrollment_query {
|
if ($xml_classlist =~ /^error/) { |
if ($xml_classlist =~ /^error/) { |
&logthis('fetch_enrollment_query - autoretrieve error: '.$xml_classlist.' for '.$filename.' from server: '.$homeserver.' '.$context.' '.$cnum); |
&logthis('fetch_enrollment_query - autoretrieve error: '.$xml_classlist.' for '.$filename.' from server: '.$homeserver.' '.$context.' '.$cnum); |
} else { |
} else { |
if ( open(FILE,">$destname") ) { |
if ( open(FILE,">",$destname) ) { |
print FILE &unescape($xml_classlist); |
print FILE &unescape($xml_classlist); |
close(FILE); |
close(FILE); |
} else { |
} else { |
Line 7790 sub fetch_enrollment_query {
|
Line 8211 sub fetch_enrollment_query {
|
} |
} |
|
|
sub get_query_reply { |
sub get_query_reply { |
my $queryid=shift; |
my ($queryid,$sleep,$loopmax) = @_; |
|
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..100) { |
for (1..$loopmax) { |
sleep 2; |
sleep($sleep); |
if (-e $replyfile.'.end') { |
if (-e $replyfile.'.end') { |
if (open(my $fh,$replyfile)) { |
if (open(my $fh,"<",$replyfile)) { |
$reply = join('',<$fh>); |
$reply = join('',<$fh>); |
close($fh); |
close($fh); |
} else { return 'error: reply_file_error'; } |
} else { return 'error: reply_file_error'; } |
Line 8188 sub auto_validate_class_sec {
|
Line 8615 sub auto_validate_class_sec {
|
return $response; |
return $response; |
} |
} |
|
|
|
sub auto_validate_instclasses { |
|
my ($cdom,$cnum,$owners,$classesref) = @_; |
|
my ($homeserver,%validations); |
|
$homeserver = &homeserver($cnum,$cdom); |
|
unless ($homeserver eq 'no_host') { |
|
my $ownerlist; |
|
if (ref($owners) eq 'ARRAY') { |
|
$ownerlist = join(',',@{$owners}); |
|
} else { |
|
$ownerlist = $owners; |
|
} |
|
if (ref($classesref) eq 'HASH') { |
|
my $classes = &freeze_escape($classesref); |
|
my $response=&reply('autovalidateinstclasses:'.&escape($ownerlist). |
|
':'.$cdom.':'.$classes,$homeserver); |
|
unless ($response =~ /(con_lost|error|no_such_host|refused)/) { |
|
my @items = split(/&/,$response); |
|
foreach my $item (@items) { |
|
my ($key,$value) = split('=',$item); |
|
$validations{&unescape($key)} = &thaw_unescape($value); |
|
} |
|
} |
|
} |
|
} |
|
return %validations; |
|
} |
|
|
sub auto_crsreq_update { |
sub auto_crsreq_update { |
my ($cdom,$cnum,$crstype,$action,$ownername,$ownerdomain,$fullname,$title, |
my ($cdom,$cnum,$crstype,$action,$ownername,$ownerdomain,$fullname,$title, |
$code,$accessstart,$accessend,$inbound) = @_; |
$code,$accessstart,$accessend,$inbound) = @_; |
Line 8216 sub auto_crsreq_update {
|
Line 8670 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 { |
sub check_instcode_cloning { |
my ($codedefaults,$code_order,$cloner,$clonefromcode,$clonetocode) = @_; |
my ($codedefaults,$code_order,$cloner,$clonefromcode,$clonetocode) = @_; |
unless ((ref($codedefaults) eq 'HASH') && (ref($code_order) eq 'ARRAY')) { |
unless ((ref($codedefaults) eq 'HASH') && (ref($code_order) eq 'ARRAY')) { |
Line 8654 sub assignrole {
|
Line 9135 sub assignrole {
|
&courserolelog($role,$uname,$udom,$url,$origstart,$origend,$delflag, |
&courserolelog($role,$uname,$udom,$url,$origstart,$origend,$delflag, |
$selfenroll,$context); |
$selfenroll,$context); |
} elsif (($role eq 'li') || ($role eq 'dg') || ($role eq 'sc') || |
} elsif (($role eq 'li') || ($role eq 'dg') || ($role eq 'sc') || |
($role eq 'au') || ($role eq 'dc')) { |
($role eq 'au') || ($role eq 'dc') || ($role eq 'dh') || |
|
($role eq 'da')) { |
&domainrolelog($role,$uname,$udom,$url,$origstart,$origend,$delflag, |
&domainrolelog($role,$uname,$udom,$url,$origstart,$origend,$delflag, |
$context); |
$context); |
} elsif (($role eq 'ca') || ($role eq 'aa')) { |
} elsif (($role eq 'ca') || ($role eq 'aa')) { |
Line 8959 sub modifyuser {
|
Line 9441 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)=@_; |
$selfenroll,$context,$inststatus,$credits,$instsec)=@_; |
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 8975 sub modifystudent {
|
Line 9457 sub modifystudent {
|
$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); |
$cid,$selfenroll,$context,$credits,$instsec); |
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) = @_; |
$locktype,$cid,$selfenroll,$context,$credits,$instsec) = @_; |
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 9028 sub modify_student_enrollment {
|
Line 9510 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) }, |
join(':',$end,$start,$uid,$usec,$fullname,$type,$locktype,$credits,$instsec) }, |
$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 9393 sub save_selected_files {
|
Line 9875 sub save_selected_files {
|
my ($user, $path, @files) = @_; |
my ($user, $path, @files) = @_; |
my $filename = $user."savedfiles"; |
my $filename = $user."savedfiles"; |
my @other_files = &files_not_in_path($user, $path); |
my @other_files = &files_not_in_path($user, $path); |
open (OUT, '>'.$tmpdir.$filename); |
open (OUT,'>',LONCAPA::tempdir().$filename); |
foreach my $file (@files) { |
foreach my $file (@files) { |
print (OUT $env{'form.currentpath'}.$file."\n"); |
print (OUT $env{'form.currentpath'}.$file."\n"); |
} |
} |
Line 9407 sub save_selected_files {
|
Line 9889 sub save_selected_files {
|
sub clear_selected_files { |
sub clear_selected_files { |
my ($user) = @_; |
my ($user) = @_; |
my $filename = $user."savedfiles"; |
my $filename = $user."savedfiles"; |
open (OUT, '>'.LONCAPA::tempdir().$filename); |
open (OUT,'>',LONCAPA::tempdir().$filename); |
print (OUT undef); |
print (OUT undef); |
close (OUT); |
close (OUT); |
return ("ok"); |
return ("ok"); |
Line 9417 sub files_in_path {
|
Line 9899 sub files_in_path {
|
my ($user, $path) = @_; |
my ($user, $path) = @_; |
my $filename = $user."savedfiles"; |
my $filename = $user."savedfiles"; |
my %return_files; |
my %return_files; |
open (IN, '<'.LONCAPA::tempdir().$filename); |
open (IN,'<',LONCAPA::tempdir().$filename); |
while (my $line_in = <IN>) { |
while (my $line_in = <IN>) { |
chomp ($line_in); |
chomp ($line_in); |
my @paths_and_file = split (m!/!, $line_in); |
my @paths_and_file = split (m!/!, $line_in); |
Line 9439 sub files_not_in_path {
|
Line 9921 sub files_not_in_path {
|
my $filename = $user."savedfiles"; |
my $filename = $user."savedfiles"; |
my @return_files; |
my @return_files; |
my $path_part; |
my $path_part; |
open(IN, '<'.LONCAPA::.$filename); |
open(IN,'<',LONCAPA::tempdir().$filename); |
while (my $line = <IN>) { |
while (my $line = <IN>) { |
#ok, I know it's clunky, but I want it to work |
#ok, I know it's clunky, but I want it to work |
my @paths_and_file = split(m|/|, $line); |
my @paths_and_file = split(m|/|, $line); |
Line 9552 sub modify_access_controls {
|
Line 10034 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 <3) { |
while (($gotlock ne 'ok') && $tries < 10) { |
$tries ++; |
$tries ++; |
sleep 1; |
sleep(0.1); |
$gotlock = &newput('file_permissions',$lockhash,$domain,$user); |
$gotlock = &newput('file_permissions',$lockhash,$domain,$user); |
} |
} |
if ($gotlock eq 'ok') { |
if ($gotlock eq 'ok') { |
Line 9847 sub dirlist {
|
Line 10329 sub dirlist {
|
foreach my $user (sort(keys(%allusers))) { |
foreach my $user (sort(keys(%allusers))) { |
push(@alluserslist,$user.'&user'); |
push(@alluserslist,$user.'&user'); |
} |
} |
return (\@alluserslist); |
if (!%listerror) { |
|
# 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 10064 sub get_userresdata {
|
Line 10562 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 /) { |
&logthis("<font color=\"blue\">WARNING:". |
if ((!defined($cached)) || ($tmp ne 'con_lost')) { |
" Trying to get resource data for ". |
&logthis("<font color=\"blue\">WARNING:". |
$uname." at ".$udom.": ". |
" Trying to get resource data for ". |
$tmp."</font>"); |
$uname." at ".$udom.": ". |
|
$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 10081 sub get_userresdata {
|
Line 10581 sub get_userresdata {
|
# Parameters: |
# Parameters: |
# $name - Course/user name. |
# $name - Course/user name. |
# $domain - Name of the domain the user/course is registered on. |
# $domain - Name of the domain the user/course is registered on. |
# $type - Type of thing $name is (must be 'course' or 'user' |
# $type - Type of thing $name is (must be 'course' or 'user') |
# @which - Array of names of resources desired. |
# @which - Array of names of resources desired. |
# Returns: |
# Returns: |
# The value of the first reasource in @which that is found in the |
# The value of the first reasource in @which that is found in the |
Line 10100 sub resdata {
|
Line 10600 sub resdata {
|
} |
} |
if (!ref($result)) { return $result; } |
if (!ref($result)) { return $result; } |
foreach my $item (@which) { |
foreach my $item (@which) { |
if (defined($result->{$item->[0]})) { |
if (ref($item) eq 'ARRAY') { |
return [$result->{$item->[0]},$item->[1]]; |
if (defined($result->{$item->[0]})) { |
} |
return [$result->{$item->[0]},$item->[1]]; |
|
} |
|
} |
} |
} |
return undef; |
return undef; |
} |
} |
|
|
|
sub get_domain_ltitools { |
|
my ($cdom) = @_; |
|
my %ltitools; |
|
my ($result,$cached)=&is_cached_new('ltitools',$cdom); |
|
if (defined($cached)) { |
|
if (ref($result) eq 'HASH') { |
|
%ltitools = %{$result}; |
|
} |
|
} else { |
|
my %domconfig = &get_dom('configuration',['ltitools'],$cdom); |
|
if (ref($domconfig{'ltitools'}) eq 'HASH') { |
|
%ltitools = %{$domconfig{'ltitools'}}; |
|
my %encdomconfig = &get_dom('encconfig',['ltitools'],$cdom); |
|
if (ref($encdomconfig{'ltitools'}) eq 'HASH') { |
|
foreach my $id (keys(%ltitools)) { |
|
if (ref($encdomconfig{'ltitools'}{$id}) eq 'HASH') { |
|
foreach my $item ('key','secret') { |
|
$ltitools{$id}{$item} = $encdomconfig{'ltitools'}{$id}{$item}; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
my $cachetime = 24*60*60; |
|
&do_cache_new('ltitools',$cdom,\%ltitools,$cachetime); |
|
} |
|
return %ltitools; |
|
} |
|
|
sub get_numsuppfiles { |
sub get_numsuppfiles { |
my ($cnum,$cdom,$ignorecache)=@_; |
my ($cnum,$cdom,$ignorecache)=@_; |
my $hashid=$cnum.':'.$cdom; |
my $hashid=$cnum.':'.$cdom; |
Line 10555 sub add_prefix_and_part {
|
Line 11086 sub add_prefix_and_part {
|
|
|
my %metaentry; |
my %metaentry; |
my %importedpartids; |
my %importedpartids; |
|
my %importedrespids; |
sub metadata { |
sub metadata { |
my ($uri,$what,$liburi,$prefix,$depthcount)=@_; |
my ($uri,$what,$liburi,$prefix,$depthcount)=@_; |
$uri=&declutter($uri); |
$uri=&declutter($uri); |
# if it is a non metadata possible uri return quickly |
# if it is a non metadata possible uri return quickly |
if (($uri eq '') || |
if (($uri eq '') || |
(($uri =~ m|^/*adm/|) && |
(($uri =~ m|^/*adm/|) && |
($uri !~ m|^adm/includes|) && ($uri !~ m{/(smppg|bulletinboard)$})) || |
($uri !~ m|^adm/includes|) && ($uri !~ m{/(smppg|bulletinboard|ext\.tool)$})) || |
($uri =~ m|/$|) || ($uri =~ m|/.meta$|) || ($uri =~ m{^/*uploaded/.+\.sequence$})) { |
($uri =~ m|/$|) || ($uri =~ m|/.meta$|) || ($uri =~ m{^/*uploaded/.+\.sequence$})) { |
return undef; |
return undef; |
} |
} |
Line 10582 sub metadata {
|
Line 11114 sub metadata {
|
} |
} |
{ |
{ |
# Imported parts would go here |
# Imported parts would go here |
my %importedids=(); |
my @origfiletagids=(); |
my @origfileimportpartids=(); |
|
my $importedparts=0; |
my $importedparts=0; |
|
|
|
# Imported responseids would go here |
|
my $importedresponses=0; |
# |
# |
# Is this a recursive call for a library? |
# Is this a recursive call for a library? |
# |
# |
Line 10679 sub metadata {
|
Line 11213 sub metadata {
|
my $dir=$filename; |
my $dir=$filename; |
$dir=~s|[^/]*$||; |
$dir=~s|[^/]*$||; |
$location=&filelocation($dir,$location); |
$location=&filelocation($dir,$location); |
|
|
|
my $importid=$token->[2]->{'id'}; |
my $importmode=$token->[2]->{'importmode'}; |
my $importmode=$token->[2]->{'importmode'}; |
|
# |
|
# Check metadata for imported file to |
|
# see if it contained response items |
|
# |
|
my %currmetaentry = %metaentry; |
|
my $libresponseorder = &metadata($location,'responseorder'); |
|
my $origfile; |
|
if ($libresponseorder ne '') { |
|
if ($#origfiletagids<0) { |
|
undef(%importedrespids); |
|
undef(%importedpartids); |
|
} |
|
@{$importedrespids{$importid}} = split(/\s*,\s*/,$libresponseorder); |
|
if (@{$importedrespids{$importid}} > 0) { |
|
$importedresponses = 1; |
|
# We need to get the original file and the imported file to get the response order correct |
|
# Load and inspect original file |
|
if ($#origfiletagids<0) { |
|
my $origfilelocation=$perlvar{'lonDocRoot'}.&clutter($uri); |
|
$origfile=&getfile($origfilelocation); |
|
@origfiletagids=($origfile=~/<((?:\w+)response|import|part)[^>]*id\s*=\s*[\"\']([^\"\']+)[\"\'][^>]*>/gs); |
|
} |
|
} |
|
} |
|
# Do not overwrite contents of %metaentry hash for resource itself with |
|
# hash populated for imported library file |
|
%metaentry = %currmetaentry; |
|
undef(%currmetaentry); |
if ($importmode eq 'problem') { |
if ($importmode eq 'problem') { |
# Import as problem/response |
# Import as problem/response |
$unikey=&add_prefix_and_part($prefix,$token->[2]->{'part'}); |
$unikey=&add_prefix_and_part($prefix,$token->[2]->{'part'}); |
Line 10689 sub metadata {
|
Line 11252 sub metadata {
|
$importedparts=1; |
$importedparts=1; |
# We need to get the original file and the imported file to get the part order correct |
# We need to get the original file and the imported file to get the part order correct |
# Good news: we do not need to worry about nested libraries, since parts cannot be nested |
# Good news: we do not need to worry about nested libraries, since parts cannot be nested |
# Load and inspect original file |
# Load and inspect original file if we didn't do that already |
if ($#origfileimportpartids<0) { |
if ($#origfiletagids<0) { |
undef(%importedpartids); |
undef(%importedrespids); |
my $origfilelocation=$perlvar{'lonDocRoot'}.&clutter($uri); |
undef(%importedpartids); |
my $origfile=&getfile($origfilelocation); |
if ($origfile eq '') { |
@origfileimportpartids=($origfile=~/<(part|import)[^>]*id\s*=\s*[\"\']([^\"\']+)[\"\'][^>]*>/gs); |
my $origfilelocation=$perlvar{'lonDocRoot'}.&clutter($uri); |
|
$origfile=&getfile($origfilelocation); |
|
@origfiletagids=($origfile=~/<(part|import)[^>]*id\s*=\s*[\"\']([^\"\']+)[\"\'][^>]*>/gs); |
|
} |
} |
} |
|
|
# Load and inspect imported file |
# Load and inspect imported file |
Line 10808 sub metadata {
|
Line 11374 sub metadata {
|
grep { ! $seen{$_} ++ } (split(',',$metaentry{':packages'})); |
grep { ! $seen{$_} ++ } (split(',',$metaentry{':packages'})); |
$metaentry{':packages'} = join(',',@uniq_packages); |
$metaentry{':packages'} = join(',',@uniq_packages); |
|
|
if ($importedparts) { |
if (($importedresponses) || ($importedparts)) { |
|
if ($importedparts) { |
# We had imported parts and need to rebuild partorder |
# We had imported parts and need to rebuild partorder |
$metaentry{':partorder'}=''; |
$metaentry{':partorder'}=''; |
$metathesekeys{'partorder'}=1; |
$metathesekeys{'partorder'}=1; |
for (my $index=0;$index<$#origfileimportpartids;$index+=2) { |
} |
if ($origfileimportpartids[$index] eq 'part') { |
if ($importedresponses) { |
# original part, part of the problem |
# We had imported responses and need to rebuild responseorder |
$metaentry{':partorder'}.=','.$origfileimportpartids[$index+1]; |
$metaentry{':responseorder'}=''; |
} else { |
$metathesekeys{'responseorder'}=1; |
# we have imported parts at this position |
} |
$metaentry{':partorder'}.=','.$importedpartids{$origfileimportpartids[$index+1]}; |
for (my $index=0;$index<$#origfiletagids;$index+=2) { |
} |
my $origid = $origfiletagids[$index+1]; |
} |
if ($origfiletagids[$index] eq 'part') { |
$metaentry{':partorder'}=~s/^\,//; |
# Original part, part of the problem |
|
if ($importedparts) { |
|
$metaentry{':partorder'}.=','.$origid; |
|
} |
|
} elsif ($origfiletagids[$index] eq 'import') { |
|
if ($importedparts) { |
|
# We have imported parts at this position |
|
$metaentry{':partorder'}.=','.$importedpartids{$origid}; |
|
} |
|
if ($importedresponses) { |
|
# We have imported responses at this position |
|
if (ref($importedrespids{$origid}) eq 'ARRAY') { |
|
$metaentry{':responseorder'}.=','.join(',',map { $origid.'_'.$_ } @{$importedrespids{$origid}}); |
|
} |
|
} |
|
} else { |
|
# Original response item, part of the problem |
|
if ($importedresponses) { |
|
$metaentry{':responseorder'}.=','.$origid; |
|
} |
|
} |
|
} |
|
if ($importedparts) { |
|
$metaentry{':partorder'}=~s/^\,//; |
|
} |
|
if ($importedresponses) { |
|
$metaentry{':responseorder'}=~s/^\,//; |
|
} |
} |
} |
|
|
$metaentry{':keys'} = join(',',keys(%metathesekeys)); |
$metaentry{':keys'} = join(',',keys(%metathesekeys)); |
Line 11909 sub readfile {
|
Line 12503 sub readfile {
|
my $file = shift; |
my $file = shift; |
if ( (! -e $file ) || ($file eq '') ) { return -1; }; |
if ( (! -e $file ) || ($file eq '') ) { return -1; }; |
my $fh; |
my $fh; |
open($fh,"<$file"); |
open($fh,"<",$file); |
my $a=''; |
my $a=''; |
while (my $line = <$fh>) { $a .= $line; } |
while (my $line = <$fh>) { $a .= $line; } |
return $a; |
return $a; |
Line 12022 sub machine_ids {
|
Line 12616 sub machine_ids {
|
|
|
sub additional_machine_domains { |
sub additional_machine_domains { |
my @domains; |
my @domains; |
open(my $fh,"<$perlvar{'lonTabDir'}/expected_domains.tab"); |
open(my $fh,"<","$perlvar{'lonTabDir'}/expected_domains.tab"); |
while( my $line = <$fh>) { |
while( my $line = <$fh>) { |
$line =~ s/\s//g; |
$line =~ s/\s//g; |
push(@domains,$line); |
push(@domains,$line); |
Line 12093 sub clutter {
|
Line 12687 sub clutter {
|
# &logthis("Got a blank emb style"); |
# &logthis("Got a blank emb style"); |
} |
} |
} |
} |
|
} elsif ($thisfn =~ m{^/adm/$match_domain/$match_courseid/\d+/ext\.tool$}) { |
|
$thisfn='/adm/wrapper'.$thisfn; |
} |
} |
return $thisfn; |
return $thisfn; |
} |
} |
Line 12166 sub get_dns {
|
Line 12762 sub get_dns {
|
} |
} |
|
|
my %alldns; |
my %alldns; |
open(my $config,"<$perlvar{'lonTabDir'}/hosts.tab"); |
open(my $config,"<","$perlvar{'lonTabDir'}/hosts.tab"); |
foreach my $dns (<$config>) { |
foreach my $dns (<$config>) { |
next if ($dns !~ /^\^(\S*)/x); |
next if ($dns !~ /^\^(\S*)/x); |
my $line = $1; |
my $line = $1; |
Line 12194 sub get_dns {
|
Line 12790 sub get_dns {
|
close($config); |
close($config); |
my $which = (split('/',$url))[3]; |
my $which = (split('/',$url))[3]; |
&logthis("unable to contact DNS defaulting to on disk file dns_$which.tab\n"); |
&logthis("unable to contact DNS defaulting to on disk file dns_$which.tab\n"); |
open($config,"<$perlvar{'lonTabDir'}/dns_$which.tab"); |
open($config,"<","$perlvar{'lonTabDir'}/dns_$which.tab"); |
my @content = <$config>; |
my @content = <$config>; |
&$func(\@content,$hashref); |
&$func(\@content,$hashref); |
return; |
return; |
Line 12287 sub fetch_dns_checksums {
|
Line 12883 sub fetch_dns_checksums {
|
my ($ignore_cache,$nocache) = @_; |
my ($ignore_cache,$nocache) = @_; |
&get_dns('/adm/dns/domain',\&parse_domain_tab,$ignore_cache,$nocache); |
&get_dns('/adm/dns/domain',\&parse_domain_tab,$ignore_cache,$nocache); |
my $fh; |
my $fh; |
if (open($fh,"<".$perlvar{'lonTabDir'}.'/domain.tab')) { |
if (open($fh,"<",$perlvar{'lonTabDir'}.'/domain.tab')) { |
my @lines = <$fh>; |
my @lines = <$fh>; |
&parse_domain_tab(\@lines); |
&parse_domain_tab(\@lines); |
} |
} |
Line 12339 sub fetch_dns_checksums {
|
Line 12935 sub fetch_dns_checksums {
|
my ($id,$domain,$role,$name,$protocol,$intdom)=split(/:/,$configline); |
my ($id,$domain,$role,$name,$protocol,$intdom)=split(/:/,$configline); |
$name=~s/\s//g; |
$name=~s/\s//g; |
if ($id && $domain && $role && $name) { |
if ($id && $domain && $role && $name) { |
|
if ((exists($hostname{$id})) && ($hostname{$id} ne '')) { |
|
my $curr = $hostname{$id}; |
|
my $skip; |
|
if (ref($name_to_host{$curr}) eq 'ARRAY') { |
|
if (($curr eq $name) && (@{$name_to_host{$curr}} == 1)) { |
|
$skip = 1; |
|
} else { |
|
@{$name_to_host{$curr}} = grep { $_ ne $id } @{$name_to_host{$curr}}; |
|
} |
|
} |
|
unless ($skip) { |
|
push(@{$name_to_host{$name}},$id); |
|
} |
|
} else { |
|
push(@{$name_to_host{$name}},$id); |
|
} |
$hostname{$id}=$name; |
$hostname{$id}=$name; |
push(@{$name_to_host{$name}}, $id); |
|
$hostdom{$id}=$domain; |
$hostdom{$id}=$domain; |
if ($role eq 'library') { $libserv{$id}=$name; } |
if ($role eq 'library') { $libserv{$id}=$name; } |
if (defined($protocol)) { |
if (defined($protocol)) { |
Line 12373 sub fetch_dns_checksums {
|
Line 12984 sub fetch_dns_checksums {
|
sub load_hosts_tab { |
sub load_hosts_tab { |
my ($ignore_cache,$nocache) = @_; |
my ($ignore_cache,$nocache) = @_; |
&get_dns('/adm/dns/hosts',\&parse_hosts_tab,$ignore_cache,$nocache); |
&get_dns('/adm/dns/hosts',\&parse_hosts_tab,$ignore_cache,$nocache); |
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); |
close($config); |
close($config); |
Line 12639 sub all_loncaparevs {
|
Line 13250 sub all_loncaparevs {
|
{ |
{ |
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>) { |
chomp($configline); |
chomp($configline); |
my ($hostid,$loncaparev)=split(/:/,$configline); |
my ($hostid,$loncaparev)=split(/:/,$configline); |
Line 12655 sub all_loncaparevs {
|
Line 13266 sub all_loncaparevs {
|
{ |
{ |
sub load_serverhomeIDs { |
sub load_serverhomeIDs { |
if (-e "$perlvar{'lonTabDir'}/serverhomeIDs.tab") { |
if (-e "$perlvar{'lonTabDir'}/serverhomeIDs.tab") { |
if (open(my $config,"<$perlvar{'lonTabDir'}/serverhomeIDs.tab")) { |
if (open(my $config,"<","$perlvar{'lonTabDir'}/serverhomeIDs.tab")) { |
while (my $configline=<$config>) { |
while (my $configline=<$config>) { |
chomp($configline); |
chomp($configline); |
my ($name,$id)=split(/:/,$configline); |
my ($name,$id)=split(/:/,$configline); |
Line 12680 BEGIN {
|
Line 13291 BEGIN {
|
|
|
# ------------------------------------------------------ Read spare server file |
# ------------------------------------------------------ Read spare server file |
{ |
{ |
open(my $config,"<$perlvar{'lonTabDir'}/spare.tab"); |
open(my $config,"<","$perlvar{'lonTabDir'}/spare.tab"); |
|
|
while (my $configline=<$config>) { |
while (my $configline=<$config>) { |
chomp($configline); |
chomp($configline); |
Line 12694 BEGIN {
|
Line 13305 BEGIN {
|
} |
} |
# ------------------------------------------------------------ Read permissions |
# ------------------------------------------------------------ Read permissions |
{ |
{ |
open(my $config,"<$perlvar{'lonTabDir'}/roles.tab"); |
open(my $config,"<","$perlvar{'lonTabDir'}/roles.tab"); |
|
|
while (my $configline=<$config>) { |
while (my $configline=<$config>) { |
chomp($configline); |
chomp($configline); |
Line 12708 BEGIN {
|
Line 13319 BEGIN {
|
|
|
# -------------------------------------------- Read plain texts for permissions |
# -------------------------------------------- Read plain texts for permissions |
{ |
{ |
open(my $config,"<$perlvar{'lonTabDir'}/rolesplain.tab"); |
open(my $config,"<","$perlvar{'lonTabDir'}/rolesplain.tab"); |
|
|
while (my $configline=<$config>) { |
while (my $configline=<$config>) { |
chomp($configline); |
chomp($configline); |
Line 12728 BEGIN {
|
Line 13339 BEGIN {
|
|
|
# ---------------------------------------------------------- Read package table |
# ---------------------------------------------------------- Read package table |
{ |
{ |
open(my $config,"<$perlvar{'lonTabDir'}/packages.tab"); |
open(my $config,"<","$perlvar{'lonTabDir'}/packages.tab"); |
|
|
while (my $configline=<$config>) { |
while (my $configline=<$config>) { |
if ($configline !~ /\S/ || $configline=~/^#/) { next; } |
if ($configline !~ /\S/ || $configline=~/^#/) { next; } |
Line 12774 BEGIN {
|
Line 13385 BEGIN {
|
# ---------------------------------------------------------- Read managers table |
# ---------------------------------------------------------- Read managers table |
{ |
{ |
if (-e "$perlvar{'lonTabDir'}/managers.tab") { |
if (-e "$perlvar{'lonTabDir'}/managers.tab") { |
if (open(my $config,"<$perlvar{'lonTabDir'}/managers.tab")) { |
if (open(my $config,"<","$perlvar{'lonTabDir'}/managers.tab")) { |
while (my $configline=<$config>) { |
while (my $configline=<$config>) { |
chomp($configline); |
chomp($configline); |
next if ($configline =~ /^\#/); |
next if ($configline =~ /^\#/); |
Line 13128 in which case the null string is returne
|
Line 13739 in which case the null string is returne
|
|
|
=item * |
=item * |
|
|
definerole($rolename,$sysrole,$domrole,$courole) : define role; define a custom |
definerole($rolename,$sysrole,$domrole,$courole,$uname,$udom) : define role; |
role rolename set privileges in format of lonTabs/roles.tab for system, domain, |
define a custom role rolename set privileges in format of lonTabs/roles.tab |
and course level |
for system, domain, and course level. $uname and $udom are optional (current |
|
user's username and domain will be used when either of $uname or $udom are absent. |
|
|
=item * |
=item * |
|
|
Line 13334 Inputs:
|
Line 13946 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 |
|
|
|
|