version 1.1172.2.68, 2015/05/22 18:06:13
|
version 1.1278, 2015/03/30 21:13:24
|
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 109 require Exporter;
|
Line 112 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 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 = &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 $try_server_hostname = &hostname($try_server); |
} |
my $serverhomeID = &get_server_homeID($try_server_hostname); |
} |
my $serverhomedom = &host_domain($serverhomeID); |
if (($canhost) && ($uint_dom)) { |
my %defdomdefaults = &get_domain_defaults($serverhomedom); |
my @intdoms; |
my $remoterev = &get_server_loncaparev(undef,$try_server); |
my $internet_names = &get_internet_names($try_server); |
$canhost = &can_host_session($udom,$try_server,$remoterev, |
if (ref($internet_names) eq 'ARRAY') { |
$remotesessions, |
@intdoms = @{$internet_names}; |
$defdomdefaults{'hostedsessions'}); |
} |
|
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 1301 sub check_loadbalancing {
|
Line 1303 sub check_loadbalancing {
|
} |
} |
} |
} |
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 1360 sub check_loadbalancing {
|
Line 1362 sub check_loadbalancing {
|
} |
} |
} |
} |
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 1416 sub check_loadbalancing {
|
Line 1418 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 1606 sub idput {
|
Line 1608 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 2074 sub get_domain_defaults {
|
Line 2076 sub get_domain_defaults {
|
} |
} |
} |
} |
if (ref($domconfig{'coursedefaults'}) eq 'HASH') { |
if (ref($domconfig{'coursedefaults'}) eq 'HASH') { |
|
$domdefaults{'canuse_pdfforms'} = $domconfig{'coursedefaults'}{'canuse_pdfforms'}; |
$domdefaults{'usejsme'} = $domconfig{'coursedefaults'}{'usejsme'}; |
$domdefaults{'usejsme'} = $domconfig{'coursedefaults'}{'usejsme'}; |
$domdefaults{'uselcmath'} = $domconfig{'coursedefaults'}{'uselcmath'}; |
$domdefaults{'uselcmath'} = $domconfig{'coursedefaults'}{'uselcmath'}; |
if (ref($domconfig{'coursedefaults'}{'postsubmit'}) eq 'HASH') { |
if (ref($domconfig{'coursedefaults'}{'postsubmit'}) eq 'HASH') { |
Line 2090 sub get_domain_defaults {
|
Line 2093 sub get_domain_defaults {
|
} |
} |
if ($domdefaults{'postsubmit'} eq 'on') { |
if ($domdefaults{'postsubmit'} eq 'on') { |
if (ref($domconfig{'coursedefaults'}{'postsubmit'}{'timeout'}) eq 'HASH') { |
if (ref($domconfig{'coursedefaults'}{'postsubmit'}{'timeout'}) eq 'HASH') { |
$domdefaults{$type.'postsubtimeout'} = |
$domdefaults{$type.'postsubtimeout'} = |
$domconfig{'coursedefaults'}{'postsubmit'}{'timeout'}{$type}; |
$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 2113 sub get_domain_defaults {
|
Line 2106 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 2148 sub get_domain_defaults {
|
Line 2138 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'}) { |
Line 2745 sub ssi {
|
Line 2735 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 { |
my $name = escape($_); |
my $name = escape($_); |
"$name=" . ( ref($form{$_}) eq 'ARRAY' |
"$name=" . ( ref($form{$_}) eq 'ARRAY' |
? join("&$name=", map {escape($_) } @{$form{$_}}) |
? join("&$name=", map {escape($_) } @{$form{$_}}) |
: &escape($form{$_}) ); |
: &escape($form{$_}) ); |
} keys(%form))); |
} keys(%form))); |
} else { |
} else { |
$request=new HTTP::Request('GET',&absolute_url().$fn); |
$request=new HTTP::Request('GET',&absolute_url().$fn); |
Line 2757 sub ssi {
|
Line 2747 sub ssi {
|
|
|
$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 2792 sub allowuploaded {
|
Line 2785 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 2800 sub allowuploaded {
|
Line 2793 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 2894 sub can_edit_resource {
|
Line 2887 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 2925 sub can_edit_resource {
|
Line 2918 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 2972 sub can_edit_resource {
|
Line 2965 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 2999 sub in_course {
|
Line 2992 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 3505 sub extract_embedded_items {
|
Line 3498 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 4176 sub get_my_roles {
|
Line 4169 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 4271 sub courseiddump {
|
Line 4264 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 4284 sub courseiddump {
|
Line 4277 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 4306 sub courseiddump {
|
Line 4298 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 4446 my $cachedkey='';
|
Line 4438 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 4508 sub set_first_access {
|
Line 4500 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 5187 sub privileged {
|
Line 5093 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 5214 sub privileged {
|
Line 5120 sub privileged {
|
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 5252 sub privileged_by_domain {
|
Line 5158 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 5723 sub unserialize {
|
Line 5629 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 5745 sub dump {
|
Line 5652 sub dump {
|
} else { |
} else { |
$regexp='.'; |
$regexp='.'; |
} |
} |
if (grep { $_ eq $uhome } ¤t_machine_ids()) { |
if (grep { $_ eq $uhome } current_machine_ids()) { |
# user is hosted on this machine |
# user is hosted on this machine |
my $reply = LONCAPA::Lond::dump_with_regexp(join(':', ($udomain, |
my $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)}; |
} |
} |
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 5757 sub dump {
|
Line 5664 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 5801 sub currentdump {
|
Line 5709 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 6060 sub tmpdel {
|
Line 5968 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 6080 sub get_timebased_id {
|
Line 5988 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 6162 sub sixnum_code {
|
Line 6070 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 6190 sub portfolio_access {
|
Line 6098 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 6199 sub get_portfolio_access {
|
Line 6107 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 6223 sub get_portfolio_access {
|
Line 6131 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 6448 sub usertools_access {
|
Line 6371 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 6710 sub customaccess {
|
Line 6633 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,$clientip)=@_; |
my $ver_orguri=$uri; |
my $ver_orguri=$uri; |
$uri=&deversion($uri); |
$uri=&deversion($uri); |
my $orguri=$uri; |
my $orguri=$uri; |
Line 6905 sub allowed {
|
Line 6828 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 6926 sub allowed {
|
Line 6844 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 6946 sub allowed {
|
Line 6860 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. |
if ($thisallowed=~/F/) { |
if ($thisallowed=~/F/) { |
return 'F'; |
return 'F'; |
Line 6989 sub allowed {
|
Line 6903 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 7031 sub allowed {
|
Line 6941 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 7270 sub constructaccess {
|
Line 7176 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 7316 sub get_comm_blocks {
|
Line 7196 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 7338 sub get_commblock_resources {
|
Line 7224 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 7355 sub get_commblock_resources {
|
Line 7245 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 7387 sub get_commblock_resources {
|
Line 7278 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 7426 sub get_commblock_resources {
|
Line 7308 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 7600 sub metadata_query {
|
Line 7449 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 8147 sub auto_crsreq_update {
|
Line 7996 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 8159 sub auto_crsreq_update {
|
Line 8009 sub auto_crsreq_update {
|
return \%crsreqresponse; |
return \%crsreqresponse; |
} |
} |
|
|
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 8501 sub assignrole {
|
Line 8277 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 8509 sub assignrole {
|
Line 8285 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 8602 sub assignrole {
|
Line 8378 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 8917 sub modifystudent {
|
Line 8693 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); |
$cid,$selfenroll,$context,$credits); |
return $reply; |
return $reply; |
} |
} |
Line 9399 sub files_not_in_path {
|
Line 9175 sub files_not_in_path {
|
return (@return_files); |
return (@return_files); |
} |
} |
|
|
|
#------------------------------Submitted/Handedback Portfolio Files Versioning |
|
|
|
sub portfiles_versioning { |
|
my ($symb,$domain,$stu_name,$portfiles,$versioned_portfiles) = @_; |
|
my $portfolio_root = '/userfiles/portfolio'; |
|
return unless ((ref($portfiles) eq 'ARRAY') && (ref($versioned_portfiles) eq 'ARRAY')); |
|
foreach my $file (@{$portfiles}) { |
|
&unmark_as_readonly($domain,$stu_name,[$symb,$env{'request.course.id'}],$file); |
|
my ($directory,$answer_file) =($file =~ /^(.*?)([^\/]*)$/); |
|
my ($answer_name,$answer_ver,$answer_ext) = &file_name_version_ext($answer_file); |
|
my $getpropath = 1; |
|
my ($dir_list,$listerror) = &dirlist($portfolio_root.$directory,$domain, |
|
$stu_name,$getpropath); |
|
my $version = &get_next_version($answer_name,$answer_ext,$dir_list); |
|
my $new_answer = |
|
&version_selected_portfile($domain,$stu_name,$directory,$answer_file,$version); |
|
if ($new_answer ne 'problem getting file') { |
|
push(@{$versioned_portfiles}, $directory.$new_answer); |
|
&mark_as_readonly($domain,$stu_name,[$directory.$new_answer], |
|
[$symb,$env{'request.course.id'},'graded']); |
|
} |
|
} |
|
} |
|
|
|
sub get_next_version { |
|
my ($answer_name, $answer_ext, $dir_list) = @_; |
|
my $version; |
|
if (ref($dir_list) eq 'ARRAY') { |
|
foreach my $row (@{$dir_list}) { |
|
my ($file) = split(/\&/,$row,2); |
|
my ($file_name,$file_version,$file_ext) = |
|
&file_name_version_ext($file); |
|
if (($file_name eq $answer_name) && |
|
($file_ext eq $answer_ext)) { |
|
# gets here if filename and extension match, |
|
# regardless of version |
|
if ($file_version ne '') { |
|
# a versioned file is found so save it for later |
|
if ($file_version > $version) { |
|
$version = $file_version; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
$version ++; |
|
return($version); |
|
} |
|
|
|
sub version_selected_portfile { |
|
my ($domain,$stu_name,$directory,$file_name,$version) = @_; |
|
my ($answer_name,$answer_ver,$answer_ext) = |
|
&file_name_version_ext($file_name); |
|
my $new_answer; |
|
$env{'form.copy'} = |
|
&getfile("/uploaded/$domain/$stu_name/portfolio$directory$file_name"); |
|
if($env{'form.copy'} eq '-1') { |
|
$new_answer = 'problem getting file'; |
|
} else { |
|
$new_answer = $answer_name.'.'.$version.'.'.$answer_ext; |
|
my $copy_result = |
|
&finishuserfileupload($stu_name,$domain,'copy', |
|
'/portfolio'.$directory.$new_answer); |
|
} |
|
undef($env{'form.copy'}); |
|
return ($new_answer); |
|
} |
|
|
|
sub file_name_version_ext { |
|
my ($file)=@_; |
|
my @file_parts = split(/\./, $file); |
|
my ($name,$version,$ext); |
|
if (@file_parts > 1) { |
|
$ext=pop(@file_parts); |
|
if (@file_parts > 1 && $file_parts[-1] =~ /^\d+$/) { |
|
$version=pop(@file_parts); |
|
} |
|
$name=join('.',@file_parts); |
|
} else { |
|
$name=join('.',@file_parts); |
|
} |
|
return($name,$version,$ext); |
|
} |
|
|
#----------------------------------------------Get portfolio file permissions |
#----------------------------------------------Get portfolio file permissions |
|
|
sub get_portfile_permissions { |
sub get_portfile_permissions { |
Line 9543 sub modify_access_controls {
|
Line 9403 sub modify_access_controls {
|
} |
} |
|
|
sub make_public_indefinitely { |
sub make_public_indefinitely { |
my ($requrl) = @_; |
my (@requrl) = @_; |
|
return &automated_portfile_access('public',\@requrl); |
|
} |
|
|
|
sub automated_portfile_access { |
|
my ($accesstype,$addsref,$delsref,$info) = @_; |
|
unless (($accesstype eq 'public') || ($accesstype eq 'ip')) { |
|
return 'invalid'; |
|
} |
|
my %urls; |
|
if (ref($addsref) eq 'ARRAY') { |
|
foreach my $requrl (@{$addsref}) { |
|
if (&is_portfolio_url($requrl)) { |
|
unless (exists($urls{$requrl})) { |
|
$urls{$requrl} = 'add'; |
|
} |
|
} |
|
} |
|
} |
|
if (ref($delsref) eq 'ARRAY') { |
|
foreach my $requrl (@{$delsref}) { |
|
if (&is_portfolio_url($requrl)) { |
|
unless (exists($urls{$requrl})) { |
|
$urls{$requrl} = 'delete'; |
|
} |
|
} |
|
} |
|
} |
|
unless (keys(%urls)) { |
|
return 'invalid'; |
|
} |
|
my $ip; |
|
if ($accesstype eq 'ip') { |
|
if (ref($info) eq 'HASH') { |
|
if ($info->{'ip'} ne '') { |
|
$ip = $info->{'ip'}; |
|
} |
|
} |
|
if ($ip eq '') { |
|
return 'invalid'; |
|
} |
|
} |
|
my $errors; |
my $now = time; |
my $now = time; |
my $action = 'activate'; |
my %current_perms; |
my $aclnum = 0; |
foreach my $requrl (sort(keys(%urls))) { |
if (&is_portfolio_url($requrl)) { |
my $action; |
|
if ($urls{$requrl} eq 'add') { |
|
$action = 'activate'; |
|
} else { |
|
$action = 'none'; |
|
} |
|
my $aclnum = 0; |
my (undef,$udom,$unum,$file_name,$group) = |
my (undef,$udom,$unum,$file_name,$group) = |
&parse_portfolio_url($requrl); |
&parse_portfolio_url($requrl); |
my $current_perms = &get_portfile_permissions($udom,$unum); |
unless (exists($current_perms{$unum.':'.$udom})) { |
my %access_controls = &get_access_controls($current_perms, |
$current_perms{$unum.':'.$udom} = &get_portfile_permissions($udom,$unum); |
|
} |
|
my %access_controls = &get_access_controls($current_perms{$unum.':'.$udom}, |
$group,$file_name); |
$group,$file_name); |
foreach my $key (keys(%{$access_controls{$file_name}})) { |
foreach my $key (keys(%{$access_controls{$file_name}})) { |
my ($num,$scope,$end,$start) = |
my ($num,$scope,$end,$start) = |
($key =~ /^([^:]+):([a-z]+)_(\d*)_?(\d*)$/); |
($key =~ /^([^:]+):([a-z]+)_(\d*)_?(\d*)$/); |
if ($scope eq 'public') { |
if ($scope eq $accesstype) { |
if ($start <= $now && $end == 0) { |
if (($start <= $now) && ($end == 0)) { |
$action = 'none'; |
if ($accesstype eq 'ip') { |
} else { |
if (ref($access_controls{$file_name}{$key}) eq 'HASH') { |
|
if (ref($access_controls{$file_name}{$key}{'ip'}) eq 'ARRAY') { |
|
if (grep(/^\Q$ip\E$/,@{$access_controls{$file_name}{$key}{'ip'}})) { |
|
if ($urls{$requrl} eq 'add') { |
|
$action = 'none'; |
|
last; |
|
} else { |
|
$action = 'delete'; |
|
$aclnum = $num; |
|
last; |
|
} |
|
} |
|
} |
|
} |
|
} elsif ($accesstype eq 'public') { |
|
if ($urls{$requrl} eq 'add') { |
|
$action = 'none'; |
|
last; |
|
} else { |
|
$action = 'delete'; |
|
$aclnum = $num; |
|
last; |
|
} |
|
} |
|
} elsif ($accesstype eq 'public') { |
$action = 'update'; |
$action = 'update'; |
$aclnum = $num; |
$aclnum = $num; |
|
last; |
} |
} |
last; |
|
} |
} |
} |
} |
if ($action eq 'none') { |
if ($action eq 'none') { |
return 'ok'; |
next; |
} else { |
} else { |
my %changes; |
my %changes; |
my $newend = 0; |
my $newend = 0; |
my $newstart = $now; |
my $newstart = $now; |
my $newkey = $aclnum.':public_'.$newend.'_'.$newstart; |
my $newkey = $aclnum.':'.$accesstype.'_'.$newend.'_'.$newstart; |
$changes{$action}{$newkey} = { |
$changes{$action}{$newkey} = { |
type => 'public', |
type => $accesstype, |
time => { |
time => { |
start => $newstart, |
start => $newstart, |
end => $newend, |
end => $newend, |
}, |
}, |
}; |
}; |
|
if ($accesstype eq 'ip') { |
|
$changes{$action}{$newkey}{'ip'} = [$ip]; |
|
} |
my ($outcome,$deloutcome,$new_values,$translation) = |
my ($outcome,$deloutcome,$new_values,$translation) = |
&modify_access_controls($file_name,\%changes,$udom,$unum); |
&modify_access_controls($file_name,\%changes,$udom,$unum); |
return $outcome; |
unless ($outcome eq 'ok') { |
|
$errors .= $outcome.' '; |
|
} |
} |
} |
|
} |
|
if ($errors) { |
|
$errors =~ s/\s$//; |
|
return $errors; |
} else { |
} else { |
return 'invalid'; |
return 'ok'; |
} |
} |
} |
} |
|
|
Line 10062 sub get_numsuppfiles {
|
Line 10005 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 10257 sub EXT {
|
Line 10200 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 11045 sub symbverify {
|
Line 10988 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 11061 sub symbverify {
|
Line 11004 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 11140 sub deversion {
|
Line 11083 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='request.symbread.cached.'.$thisfn; |
if (defined($env{$cache_str})) { |
if (defined($env{$cache_str})) { return $env{$cache_str}; } |
if ($ignorecachednull) { |
|
return $env{$cache_str} unless ($env{$cache_str} eq ''); |
|
} else { |
|
return $env{$cache_str}; |
|
} |
|
} |
|
# no filename provided? try from environment |
# no filename provided? try from environment |
unless ($thisfn) { |
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 11210 sub symbread {
|
Line 11147 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 11257 sub symbread {
|
Line 11166 sub symbread {
|
$syval=''; |
$syval=''; |
} |
} |
} |
} |
untie(%bighash); |
untie(%bighash) |
} |
} |
} |
} |
if ($syval) { |
if ($syval) { |
Line 11410 sub rndseed {
|
Line 11319 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 11595 sub rndseed_CODE_64bit5 {
|
Line 11505 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) = map { abs($_); } (split(/[,:]/,$rndseed)); |
if ((!$num1) || (!$num2) || ($num1 > 2147483562) || ($num2 > 2147483398)) { |
if ((!$num1) || (!$num2) || ($num1 > 2147483562) || ($num2 > 2147483398)) { |
&Math::Random::random_set_seed_from_phrase($rndseed); |
&Math::Random::random_set_seed_from_phrase($rndseed); |
} else { |
} else { |
Line 12128 sub get_dns {
|
Line 12038 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 12167 sub parse_dns_checksums_tab {
|
Line 12077 sub parse_dns_checksums_tab {
|
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 ($file =~ m{^/etc/httpd/conf}) { |
Line 12575 sub all_loncaparevs {
|
Line 12485 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 12591 sub all_loncaparevs {
|
Line 12501 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 12683 BEGIN {
|
Line 12593 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 13027 escaped strings of the action recorded i
|
Line 12937 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 13101 provided for types, will default to retu
|
Line 12995 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 13340 values that are the resource value. I b
|
Line 13234 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 13443 will be stored for query
|
Line 13337 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 13466 and is a possible symb for the URL in $t
|
Line 13347 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 13521 expirespread($uname,$udom,$stype,$usymb)
|
Line 13402 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 13535 when viewing in course context.
|
Line 13416 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 13557 homeserver.
|
Line 13438 homeserver.
|
|
|
=item * |
=item * |
|
|
store($storehash,$symb,$namespace,$udom,$uname,$laststore) : stores hash |
store($storehash,$symb,$namespace,$udom,$uname,$laststore) : stores hash |
permanently for this url; hashref needs to be given and should be a \%hashname; |
permanently for this url; hashref needs to be given and should be a \%hashname; |
the remaining args aren't required and if they aren't passed or are '' they will |
the 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 (with the exception of $laststore, which is an |
optional arg used when a user's submission is stored in grading). |
optional arg used when a user's submission is stored in grading). |
$laststore is $version=$timestamp, where $version is the most recent version |
$laststore is $version=$timestamp, where $version is the most recent version |
number retrieved for the corresponding $symb in the $namespace db file, and |
number retrieved for the corresponding $symb in the $namespace db file, and |
$timestamp is the timestamp for that transaction (UNIX time). |
$timestamp is the timestamp for that transaction (UNIX time). |
$laststore is currently only passed when cstore() is called by |
$laststore is currently only passed when cstore() is called by |
structuretags::finalize_storage(). |
structuretags::finalize_storage(). |
|
|
=item * |
=item * |
|
|
cstore($storehash,$symb,$namespace,$udom,$uname,$laststore) : same as store |
cstore($storehash,$symb,$namespace,$udom,$uname,$laststore) : same as store |
but uses critical subroutine |
but uses critical subroutine |
|
|
=item * |
=item * |
Line 13708 server ($udom and $uhome are optional)
|
Line 13589 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 13763 for course's uploaded content.
|
Line 13644 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 13774 on your servers.
|
Line 13655 on your servers.
|
|
|
=over |
=over |
|
|
=item |
=item |
remotesessions, hostedsessions |
remotesessions, hostedsessions |
|
|
=back |
=back |
Line 13782 remotesessions, hostedsessions
|
Line 13663 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 14213 Returns:
|
Line 14094 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 14225 Args: (first three required; six others
|
Line 14106 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: |
|
|