version 1.1172.2.50, 2014/06/13 03:15:31
|
version 1.1172.2.67, 2015/05/22 17:58:00
|
Line 844 sub spareserver {
|
Line 844 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'} }) { |
if ($uint_dom) { |
next unless (&spare_can_host($udom,$uint_dom,$remotesessions, |
next unless (&spare_can_host($udom,$uint_dom,$remotesessions, |
$try_server)); |
$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 858 sub spareserver {
|
Line 856 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'} }) { |
if ($uint_dom) { |
next unless (&spare_can_host($udom,$uint_dom, |
next unless (&spare_can_host($udom,$uint_dom, |
$remotesessions,$try_server)); |
$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 1173 sub can_host_session {
|
Line 1169 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 @intdoms; |
my $try_server_hostname = &hostname($try_server); |
my $internet_names = &Apache::lonnet::get_internet_names($try_server); |
my $serverhomeID = &get_server_homeID($try_server_hostname); |
if (ref($internet_names) eq 'ARRAY') { |
my $serverhomedom = &host_domain($serverhomeID); |
@intdoms = @{$internet_names}; |
my %defdomdefaults = &get_domain_defaults($serverhomedom); |
} |
if (ref($defdomdefaults{'offloadnow'}) eq 'HASH') { |
unless (grep(/^\Q$uint_dom\E$/,@intdoms)) { |
if ($defdomdefaults{'offloadnow'}{$try_server}) { |
my $serverhomeID = &Apache::lonnet::get_server_homeID($try_server); |
$canhost = 0; |
my $serverhomedom = &Apache::lonnet::host_domain($serverhomeID); |
} |
my %defdomdefaults = &Apache::lonnet::get_domain_defaults($serverhomedom); |
} |
my $remoterev = &Apache::lonnet::get_server_loncaparev(undef,$try_server); |
if (($canhost) && ($uint_dom)) { |
$canhost = &can_host_session($udom,$try_server,$remoterev, |
my @intdoms; |
$remotesessions, |
my $internet_names = &get_internet_names($try_server); |
$defdomdefaults{'hostedsessions'}); |
if (ref($internet_names) eq 'ARRAY') { |
|
@intdoms = @{$internet_names}; |
|
} |
|
unless (grep(/^\Q$uint_dom\E$/,@intdoms)) { |
|
my $remoterev = &get_server_loncaparev(undef,$try_server); |
|
$canhost = &can_host_session($udom,$try_server,$remoterev, |
|
$remotesessions, |
|
$defdomdefaults{'hostedsessions'}); |
|
} |
} |
} |
return $canhost; |
return $canhost; |
} |
} |
Line 1647 sub dump_dom {
|
Line 1651 sub dump_dom {
|
|
|
sub get_dom { |
sub get_dom { |
my ($namespace,$storearr,$udom,$uhome)=@_; |
my ($namespace,$storearr,$udom,$uhome)=@_; |
|
return if ($udom eq 'public'); |
my $items=''; |
my $items=''; |
foreach my $item (@$storearr) { |
foreach my $item (@$storearr) { |
$items.=&escape($item).'&'; |
$items.=&escape($item).'&'; |
Line 1654 sub get_dom {
|
Line 1659 sub get_dom {
|
$items=~s/\&$//; |
$items=~s/\&$//; |
if (!$udom) { |
if (!$udom) { |
$udom=$env{'user.domain'}; |
$udom=$env{'user.domain'}; |
|
return if ($udom eq 'public'); |
if (defined(&domain($udom,'primary'))) { |
if (defined(&domain($udom,'primary'))) { |
$uhome=&domain($udom,'primary'); |
$uhome=&domain($udom,'primary'); |
} else { |
} else { |
Line 2068 sub get_domain_defaults {
|
Line 2074 sub get_domain_defaults {
|
} |
} |
} |
} |
if (ref($domconfig{'coursedefaults'}) eq 'HASH') { |
if (ref($domconfig{'coursedefaults'}) eq 'HASH') { |
|
$domdefaults{'usejsme'} = $domconfig{'coursedefaults'}{'usejsme'}; |
|
$domdefaults{'uselcmath'} = $domconfig{'coursedefaults'}{'uselcmath'}; |
|
if (ref($domconfig{'coursedefaults'}{'postsubmit'}) eq 'HASH') { |
|
$domdefaults{'postsubmit'} = $domconfig{'coursedefaults'}{'postsubmit'}{'client'}; |
|
} |
foreach my $type (@coursetypes) { |
foreach my $type (@coursetypes) { |
if (ref($domconfig{'coursedefaults'}{'coursecredits'}) eq 'HASH') { |
if (ref($domconfig{'coursedefaults'}{'coursecredits'}) eq 'HASH') { |
unless ($type eq 'community') { |
unless ($type eq 'community') { |
Line 2077 sub get_domain_defaults {
|
Line 2088 sub get_domain_defaults {
|
if (ref($domconfig{'coursedefaults'}{'uploadquota'}) eq 'HASH') { |
if (ref($domconfig{'coursedefaults'}{'uploadquota'}) eq 'HASH') { |
$domdefaults{$type.'quota'} = $domconfig{'coursedefaults'}{'uploadquota'}{$type}; |
$domdefaults{$type.'quota'} = $domconfig{'coursedefaults'}{'uploadquota'}{$type}; |
} |
} |
|
if ($domdefaults{'postsubmit'} eq 'on') { |
|
if (ref($domconfig{'coursedefaults'}{'postsubmit'}{'timeout'}) eq 'HASH') { |
|
$domdefaults{$type.'postsubtimeout'} = |
|
$domconfig{'coursedefaults'}{'postsubmit'}{'timeout'}{$type}; |
|
} |
|
} |
|
} |
|
if (ref($domconfig{'coursedefaults'}{'canclone'}) eq 'HASH') { |
|
if (ref($domconfig{'coursedefaults'}{'canclone'}{'instcode'}) eq 'ARRAY') { |
|
my @clonecodes = @{$domconfig{'coursedefaults'}{'canclone'}{'instcode'}}; |
|
if (@clonecodes) { |
|
$domdefaults{'canclone'} = join('+',@clonecodes); |
|
} |
|
} |
|
} elsif ($domconfig{'coursedefaults'}{'canclone'}) { |
|
$domdefaults{'canclone'}=$domconfig{'coursedefaults'}{'canclone'}; |
} |
} |
} |
} |
if (ref($domconfig{'usersessions'}) eq 'HASH') { |
if (ref($domconfig{'usersessions'}) eq 'HASH') { |
Line 2086 sub get_domain_defaults {
|
Line 2113 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 2715 sub ssi {
|
Line 2745 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 { &escape($_).'='.&escape($form{$_}) } keys(%form))); |
$request->content(join('&',map { |
|
my $name = escape($_); |
|
"$name=" . ( ref($form{$_}) eq 'ARRAY' |
|
? join("&$name=", map {escape($_) } @{$form{$_}}) |
|
: &escape($form{$_}) ); |
|
} keys(%form))); |
} else { |
} else { |
$request=new HTTP::Request('GET',&absolute_url().$fn); |
$request=new HTTP::Request('GET',&absolute_url().$fn); |
} |
} |
Line 4410 my $cachedkey='';
|
Line 4445 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 4928 sub tmprestore {
|
Line 4963 sub tmprestore {
|
# ----------------------------------------------------------------------- Store |
# ----------------------------------------------------------------------- Store |
|
|
sub store { |
sub store { |
my ($storehash,$symb,$namespace,$domain,$stuname) = @_; |
my ($storehash,$symb,$namespace,$domain,$stuname,$laststore) = @_; |
my $home=''; |
my $home=''; |
|
|
if ($stuname) { $home=&homeserver($stuname,$domain); } |
if ($stuname) { $home=&homeserver($stuname,$domain); } |
Line 4958 sub store {
|
Line 4993 sub store {
|
} |
} |
$namevalue=~s/\&$//; |
$namevalue=~s/\&$//; |
&courselog($symb.':'.$stuname.':'.$domain.':STORE:'.$namevalue); |
&courselog($symb.':'.$stuname.':'.$domain.':STORE:'.$namevalue); |
return reply("store:$domain:$stuname:$namespace:$symb:$namevalue","$home"); |
return reply("store:$domain:$stuname:$namespace:$symb:$namevalue:$laststore","$home"); |
} |
} |
|
|
# -------------------------------------------------------------- Critical Store |
# -------------------------------------------------------------- Critical Store |
|
|
sub cstore { |
sub cstore { |
my ($storehash,$symb,$namespace,$domain,$stuname) = @_; |
my ($storehash,$symb,$namespace,$domain,$stuname,$laststore) = @_; |
my $home=''; |
my $home=''; |
|
|
if ($stuname) { $home=&homeserver($stuname,$domain); } |
if ($stuname) { $home=&homeserver($stuname,$domain); } |
Line 4995 sub cstore {
|
Line 5030 sub cstore {
|
$namevalue=~s/\&$//; |
$namevalue=~s/\&$//; |
&courselog($symb.':'.$stuname.':'.$domain.':CSTORE:'.$namevalue); |
&courselog($symb.':'.$stuname.':'.$domain.':CSTORE:'.$namevalue); |
return critical |
return critical |
("store:$domain:$stuname:$namespace:$symb:$namevalue","$home"); |
("store:$domain:$stuname:$namespace:$symb:$namevalue:$laststore","$home"); |
} |
} |
|
|
# --------------------------------------------------------------------- Restore |
# --------------------------------------------------------------------- Restore |
Line 5175 sub privileged {
|
Line 5210 sub privileged {
|
my %rolesdump = &dump("roles", $domain, $username) or return 0; |
my %rolesdump = &dump("roles", $domain, $username) or return 0; |
my $now = time; |
my $now = time; |
|
|
for my $role (@rolesdump{grep { ! /^rolesdef_/ } keys %rolesdump}) { |
for my $role (@rolesdump{grep { ! /^rolesdef_/ } keys(%rolesdump)}) { |
my ($trole, $tend, $tstart) = split(/_/, $role); |
my ($trole, $tend, $tstart) = split(/_/, $role); |
if (grep(/^\Q$trole\E$/,@{$roles})) { |
if (grep(/^\Q$trole\E$/,@{$roles})) { |
return 1 unless ($tend && $tend < $now) |
return 1 unless ($tend && $tend < $now) |
Line 5264 sub rolesinit {
|
Line 5299 sub rolesinit {
|
my %allroles=(); |
my %allroles=(); |
my %allgroups=(); |
my %allgroups=(); |
|
|
for my $area (grep { ! /^rolesdef_/ } keys %rolesdump) { |
for my $area (grep { ! /^rolesdef_/ } keys(%rolesdump)) { |
my $role = $rolesdump{$area}; |
my $role = $rolesdump{$area}; |
$area =~ s/\_\w\w$//; |
$area =~ s/\_\w\w$//; |
|
|
Line 5704 sub dump {
|
Line 5739 sub dump {
|
if (!$uname) { $uname=$env{'user.name'}; } |
if (!$uname) { $uname=$env{'user.name'}; } |
my $uhome=&homeserver($uname,$udomain); |
my $uhome=&homeserver($uname,$udomain); |
|
|
my $reply; |
if ($regexp) { |
|
$regexp=&escape($regexp); |
|
} else { |
|
$regexp='.'; |
|
} |
if (grep { $_ eq $uhome } ¤t_machine_ids()) { |
if (grep { $_ eq $uhome } ¤t_machine_ids()) { |
# user is hosted on this machine |
# user is hosted on this machine |
$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)}; |
} |
} |
if ($regexp) { |
|
$regexp=&escape($regexp); |
|
} else { |
|
$regexp='.'; |
|
} |
|
my $rep=&reply("dump:$udomain:$uname:$namespace:$regexp:$range",$uhome); |
my $rep=&reply("dump:$udomain:$uname:$namespace:$regexp:$range",$uhome); |
my @pairs=split(/\&/,$rep); |
my @pairs=split(/\&/,$rep); |
my %returnhash=(); |
my %returnhash=(); |
Line 5892 sub newput {
|
Line 5926 sub newput {
|
# --------------------------------------------------------- putstore interface |
# --------------------------------------------------------- putstore interface |
|
|
sub putstore { |
sub putstore { |
my ($namespace,$symb,$version,$storehash,$udomain,$uname)=@_; |
my ($namespace,$symb,$version,$storehash,$udomain,$uname,$tolog)=@_; |
if (!$udomain) { $udomain=$env{'user.domain'}; } |
if (!$udomain) { $udomain=$env{'user.domain'}; } |
if (!$uname) { $uname=$env{'user.name'}; } |
if (!$uname) { $uname=$env{'user.name'}; } |
my $uhome=&homeserver($uname,$udomain); |
my $uhome=&homeserver($uname,$udomain); |
Line 5906 sub putstore {
|
Line 5940 sub putstore {
|
my $reply = |
my $reply = |
&reply("putstore:$udomain:$uname:$namespace:$esc_symb:$esc_v:$items", |
&reply("putstore:$udomain:$uname:$namespace:$esc_symb:$esc_v:$items", |
$uhome); |
$uhome); |
|
if (($tolog) && ($reply eq 'ok')) { |
|
my $namevalue=''; |
|
foreach my $key (keys(%{$storehash})) { |
|
$namevalue.=&escape($key).'='.&freeze_escape($storehash->{$key}).'&'; |
|
} |
|
$namevalue .= 'ip='.&escape($ENV{'REMOTE_ADDR'}). |
|
'&host='.&escape($perlvar{'lonHostID'}). |
|
'&version='.$esc_v. |
|
'&by='.&escape($env{'user.name'}.':'.$env{'user.domain'}); |
|
&Apache::lonnet::courselog($symb.':'.$uname.':'.$udomain.':PUTSTORE:'.$namevalue); |
|
} |
if ($reply eq 'unknown_cmd') { |
if ($reply eq 'unknown_cmd') { |
# gfall back to way things use to be done |
# gfall back to way things use to be done |
return &old_putstore($namespace,$symb,$version,$storehash,$udomain, |
return &old_putstore($namespace,$symb,$version,$storehash,$udomain, |
Line 6064 sub get_timebased_id {
|
Line 6109 sub get_timebased_id {
|
my %inuse = &Apache::lonnet::dump('nohist_'.$namespace,$cdom,$cnum,$prefix); |
my %inuse = &Apache::lonnet::dump('nohist_'.$namespace,$cdom,$cnum,$prefix); |
my $id = time; |
my $id = time; |
$newid = $id; |
$newid = $id; |
|
if ($idtype eq 'addcode') { |
|
$newid .= &sixnum_code(); |
|
} |
my $idtries = 0; |
my $idtries = 0; |
while (exists($inuse{$prefix."\0".$newid}) && $idtries < $maxtries) { |
while (exists($inuse{$prefix."\0".$newid}) && $idtries < $maxtries) { |
if ($idtype eq 'concat') { |
if ($idtype eq 'concat') { |
$newid = $id.$idtries; |
$newid = $id.$idtries; |
|
} elsif ($idtype eq 'addcode') { |
|
$newid = $newid.&sixnum_code(); |
} else { |
} else { |
$newid ++; |
$newid ++; |
} |
} |
Line 6084 sub get_timebased_id {
|
Line 6134 sub get_timebased_id {
|
$error = 'error saving new item: '.$putresult; |
$error = 'error saving new item: '.$putresult; |
} |
} |
} else { |
} else { |
|
undef($newid); |
$error = ('error: no unique suffix available for the new item '); |
$error = ('error: no unique suffix available for the new item '); |
} |
} |
# remove lock |
# remove lock |
Line 6092 sub get_timebased_id {
|
Line 6143 sub get_timebased_id {
|
} else { |
} else { |
$error = "error: could not obtain lockfile\n"; |
$error = "error: could not obtain lockfile\n"; |
$dellock = 'ok'; |
$dellock = 'ok'; |
|
if (($prefix eq 'paste') && ($namespace eq 'courseeditor') && ($keyid eq 'num')) { |
|
$dellock = 'nolock'; |
|
} |
} |
} |
return ($newid,$dellock,$error); |
return ($newid,$dellock,$error); |
} |
} |
|
|
|
sub sixnum_code { |
|
my $code; |
|
for (0..6) { |
|
$code .= int( rand(9) ); |
|
} |
|
return $code; |
|
} |
|
|
# -------------------------------------------------- portfolio access checking |
# -------------------------------------------------- portfolio access checking |
|
|
sub portfolio_access { |
sub portfolio_access { |
Line 6647 sub customaccess {
|
Line 6709 sub customaccess {
|
# ------------------------------------------------- Check for a user privilege |
# ------------------------------------------------- Check for a user privilege |
|
|
sub allowed { |
sub allowed { |
my ($priv,$uri,$symb,$role)=@_; |
my ($priv,$uri,$symb,$role,$clientip,$noblockcheck)=@_; |
my $ver_orguri=$uri; |
my $ver_orguri=$uri; |
$uri=&deversion($uri); |
$uri=&deversion($uri); |
my $orguri=$uri; |
my $orguri=$uri; |
Line 6842 sub allowed {
|
Line 6904 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 @blockers = &has_comm_blocking($priv,$symb,$uri); |
my $value = $1; |
if (@blockers > 0) { |
if ($noblockcheck) { |
$thisallowed = 'B'; |
$thisallowed.=$value; |
} else { |
} else { |
$thisallowed.=$1; |
my @blockers = &has_comm_blocking($priv,$symb,$uri); |
|
if (@blockers > 0) { |
|
$thisallowed = 'B'; |
|
} else { |
|
$thisallowed.=$value; |
|
} |
} |
} |
} |
} |
} else { |
} else { |
Line 6858 sub allowed {
|
Line 6925 sub allowed {
|
$refuri=&declutter($refuri); |
$refuri=&declutter($refuri); |
my ($match) = &is_on_map($refuri); |
my ($match) = &is_on_map($refuri); |
if ($match) { |
if ($match) { |
my @blockers = &has_comm_blocking($priv,$symb,$refuri); |
if ($noblockcheck) { |
if (@blockers > 0) { |
|
$thisallowed = 'B'; |
|
} else { |
|
$thisallowed='F'; |
$thisallowed='F'; |
|
} else { |
|
my @blockers = &has_comm_blocking($priv,$symb,$refuri); |
|
if (@blockers > 0) { |
|
$thisallowed = 'B'; |
|
} else { |
|
$thisallowed='F'; |
|
} |
} |
} |
} |
} |
} |
} |
Line 6917 sub allowed {
|
Line 6988 sub allowed {
|
=~/\Q$priv\E\&([^\:]*)/) { |
=~/\Q$priv\E\&([^\:]*)/) { |
my $value = $1; |
my $value = $1; |
if ($priv eq 'bre') { |
if ($priv eq 'bre') { |
my @blockers = &has_comm_blocking($priv,$symb,$uri); |
if ($noblockcheck) { |
if (@blockers > 0) { |
|
$thisallowed = 'B'; |
|
} else { |
|
$thisallowed.=$value; |
$thisallowed.=$value; |
|
} else { |
|
my @blockers = &has_comm_blocking($priv,$symb,$uri); |
|
if (@blockers > 0) { |
|
$thisallowed = 'B'; |
|
} else { |
|
$thisallowed.=$value; |
|
} |
} |
} |
} else { |
} else { |
$thisallowed.=$value; |
$thisallowed.=$value; |
Line 6955 sub allowed {
|
Line 7030 sub allowed {
|
=~/\Q$priv\E\&([^\:]*)/) { |
=~/\Q$priv\E\&([^\:]*)/) { |
my $value = $1; |
my $value = $1; |
if ($priv eq 'bre') { |
if ($priv eq 'bre') { |
my @blockers = &has_comm_blocking($priv,$symb,$refuri); |
if ($noblockcheck) { |
if (@blockers > 0) { |
|
$thisallowed = 'B'; |
|
} else { |
|
$thisallowed.=$value; |
$thisallowed.=$value; |
|
} else { |
|
my @blockers = &has_comm_blocking($priv,$symb,$refuri); |
|
if (@blockers > 0) { |
|
$thisallowed = 'B'; |
|
} else { |
|
$thisallowed.=$value; |
|
} |
} |
} |
} else { |
} else { |
$thisallowed.=$value; |
$thisallowed.=$value; |
Line 7190 sub constructaccess {
|
Line 7269 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 7210 sub get_comm_blocks {
|
Line 7315 sub get_comm_blocks {
|
return %commblocks; |
return %commblocks; |
} |
} |
|
|
sub has_comm_blocking { |
sub get_commblock_resources { |
my ($priv,$symb,$uri,$blocks) = @_; |
my ($blocks) = @_; |
return unless ($env{'request.course.id'}); |
my %blockers = (); |
return unless ($priv eq 'bre'); |
return %blockers unless ($env{'request.course.id'}); |
return if ($env{'user.priv.'.$env{'request.role'}} =~/evb\&([^\:]*)/); |
return %blockers 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 unless (keys(%commblocks) > 0); |
return %blockers unless (keys(%commblocks) > 0); |
if (!$symb) { $symb=&symbread($uri,1); } |
|
my ($map,$resid,undef)=&decode_symb($symb); |
|
my %tocheck = ( |
|
maps => $map, |
|
resources => $symb, |
|
); |
|
my @blockers; |
|
my $now = time; |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
return %blockers unless (ref($navmap)); |
|
my $now = time; |
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 7238 sub has_comm_blocking {
|
Line 7337 sub has_comm_blocking {
|
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 ($commblocks{$block}{'blocks'}{'docs'}{'maps'}{$map}) { |
if (keys(%{$commblocks{$block}{'blocks'}{'docs'}{'maps'}})) { |
unless (grep(/^\Q$block\E$/,@blockers)) { |
$blockers{$block}{maps} = $commblocks{$block}{'blocks'}{'docs'}{'maps'}; |
push(@blockers,$block); |
|
} |
|
} |
} |
} |
} |
if (ref($commblocks{$block}{'blocks'}{'docs'}{'resources'}) eq 'HASH') { |
if (ref($commblocks{$block}{'blocks'}{'docs'}{'resources'}) eq 'HASH') { |
if ($commblocks{$block}{'blocks'}{'docs'}{'resources'}{$symb}) { |
if (keys(%{$commblocks{$block}{'blocks'}{'docs'}{'resources'}})) { |
unless (grep(/^\Q$block\E$/,@blockers)) { |
$blockers{$block}{'resources'} = $commblocks{$block}{'blocks'}{'docs'}{'resources'}; |
push(@blockers,$block); |
|
} |
|
} |
} |
} |
} |
} |
} |
Line 7259 sub has_comm_blocking {
|
Line 7354 sub has_comm_blocking {
|
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 $check_interval; |
my @interval; |
if (&check_docs_block($commblocks{$block}{'blocks'}{'docs'},\%tocheck)) { |
my $type = 'map'; |
my @interval; |
if ($item eq 'course') { |
my $type = 'map'; |
$type = 'course'; |
if ($item eq 'course') { |
@interval=&EXT("resource.0.interval"); |
$type = 'course'; |
} else { |
@interval=&EXT("resource.0.interval"); |
if ($item =~ /___\d+___/) { |
|
$type = 'resource'; |
|
@interval=&EXT("resource.0.interval",$item); |
|
if (ref($navmap)) { |
|
my $res = $navmap->getBySymb($item); |
|
push(@to_test,$res); |
|
} |
} else { |
} else { |
if ($item =~ /___\d+___/) { |
my $mapsymb = &symbread($item,1); |
$type = 'resource'; |
if ($mapsymb) { |
@interval=&EXT("resource.0.interval",$item); |
if (ref($navmap)) { |
if (ref($navmap)) { |
my $mapres = $navmap->getBySymb($mapsymb); |
my $res = $navmap->getBySymb($item); |
@to_test = $mapres->retrieveResources($mapres,undef,0,0,0,1); |
push(@to_test,$res); |
foreach my $res (@to_test) { |
} |
my $symb = $res->symb(); |
} else { |
next if ($symb eq $mapsymb); |
my $mapsymb = &symbread($item,1); |
if ($symb ne '') { |
if ($mapsymb) { |
@interval=&EXT("resource.0.interval",$symb); |
if (ref($navmap)) { |
if ($interval[1] eq 'map') { |
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 7292 sub has_comm_blocking {
|
Line 7386 sub has_comm_blocking {
|
} |
} |
} |
} |
} |
} |
if ($interval[0] =~ /\d+/) { |
} |
my $first_access; |
if ($interval[0] =~ /^\d+$/) { |
if ($type eq 'resource') { |
my $first_access; |
$first_access=&get_first_access($interval[1],$item); |
if ($type eq 'resource') { |
} elsif ($type eq 'map') { |
$first_access=&get_first_access($interval[1],$item); |
$first_access=&get_first_access($interval[1],undef,$item); |
} elsif ($type eq 'map') { |
} else { |
$first_access=&get_first_access($interval[1],undef,$item); |
$first_access=&get_first_access($interval[1]); |
} else { |
} |
$first_access=&get_first_access($interval[1]); |
if ($first_access) { |
} |
my $timesup = $first_access+$interval[0]; |
if ($first_access) { |
if ($timesup > $now) { |
my $timesup = $first_access+$interval[0]; |
foreach my $res (@to_test) { |
if ($timesup > $now) { |
if ($res->is_problem()) { |
my $activeblock; |
if ($res->completable()) { |
foreach my $res (@to_test) { |
unless (grep(/^\Q$block\E$/,@blockers)) { |
if ($res->answerable()) { |
push(@blockers,$block); |
$activeblock = 1; |
} |
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 7322 sub has_comm_blocking {
|
Line 7425 sub has_comm_blocking {
|
} |
} |
} |
} |
} |
} |
return @blockers; |
return %blockers; |
} |
} |
|
|
sub check_docs_block { |
sub has_comm_blocking { |
my ($docsblock,$tocheck) =@_; |
my ($priv,$symb,$uri,$blocks) = @_; |
if ((ref($docsblock) ne 'HASH') || (ref($tocheck) ne 'HASH')) { |
my @blockers; |
return; |
return unless ($env{'request.course.id'}); |
|
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 (ref($docsblock->{'maps'}) eq 'HASH') { |
if ($symb) { |
if ($tocheck->{'maps'}) { |
@symbs = ($symb); |
if ($docsblock->{'maps'}{$tocheck->{'maps'}}) { |
} elsif (keys(%possibles)) { |
return 1; |
@symbs = keys(%possibles); |
|
} |
|
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 (ref($docsblock->{'resources'}) eq 'HASH') { |
if ($cachedblockers{$block}{'resources'}{$symb}) { |
if ($tocheck->{'resources'}) { |
unless (grep(/^\Q$block\E$/,@blockers)) { |
if ($docsblock->{'resources'}{$tocheck->{'resources'}}) { |
push(@blockers,$block); |
return 1; |
} |
|
} |
|
} |
|
} |
|
if (ref($cachedblockers{$block}{'maps'}) eq 'HASH') { |
|
if ($cachedblockers{$block}{'maps'}{$map}) { |
|
unless (grep(/^\Q$block\E$/,@blockers)) { |
|
push(@blockers,$block); |
|
} |
|
} |
} |
} |
} |
} |
} |
} |
return; |
return if ($noblock); |
|
return @blockers; |
|
} |
} |
} |
|
|
|
# -------------------------------- Deversion and split uri into path an filename |
|
|
# |
# |
# Removes the versino from a URI and |
# Removes the version 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 10558 sub metadata {
|
Line 10694 sub metadata {
|
|
|
$metaentry{':keys'} = join(',',keys(%metathesekeys)); |
$metaentry{':keys'} = join(',',keys(%metathesekeys)); |
&metadata_generate_part0(\%metathesekeys,\%metaentry,$uri); |
&metadata_generate_part0(\%metathesekeys,\%metaentry,$uri); |
$metaentry{':allpossiblekeys'}=join(',',keys %metathesekeys); |
$metaentry{':allpossiblekeys'}=join(',',keys(%metathesekeys)); |
&do_cache_new('meta',$uri,\%metaentry,$cachetime); |
&do_cache_new('meta',$uri,\%metaentry,$cachetime); |
# this is the end of "was not already recently cached |
# this is the end of "was not already recently cached |
} |
} |
Line 10929 sub deversion {
|
Line 11065 sub deversion {
|
# ------------------------------------------------------ Return symb list entry |
# ------------------------------------------------------ Return symb list entry |
|
|
sub symbread { |
sub symbread { |
my ($thisfn,$donotrecurse)=@_; |
my ($thisfn,$donotrecurse,$ignorecachednull,$checkforblock,$possibles)=@_; |
my $cache_str; |
my $cache_str='request.symbread.cached.'.$thisfn; |
if ($thisfn ne '') { |
if (defined($env{$cache_str})) { |
$cache_str='request.symbread.cached.'.$thisfn; |
if ($ignorecachednull) { |
if ($env{$cache_str} ne '') { |
return $env{$cache_str} unless ($env{$cache_str} eq ''); |
|
} else { |
return $env{$cache_str}; |
return $env{$cache_str}; |
} |
} |
} else { |
} |
# no filename provided? try from environment |
# no filename provided? try from environment |
|
unless ($thisfn) { |
if ($env{'request.symb'}) { |
if ($env{'request.symb'}) { |
return $env{$cache_str}=&symbclean($env{'request.symb'}); |
return $env{$cache_str}=&symbclean($env{'request.symb'}); |
} |
} |
Line 10997 sub symbread {
|
Line 11135 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); |
} elsif (!$donotrecurse) { |
if (ref($possibles) eq 'HASH') { |
|
$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}; |
if (&allowed('bre',$file)) { |
my $canaccess; |
my ($mapid,$resid)=split(/\./,$id); |
if (($donotrecurse) || ($checkforblock) || (ref($possibles) eq 'HASH')) { |
if ($bighash{'map_type_'.$mapid} ne 'page') { |
$canaccess = 1; |
$realpossible++; |
} else { |
$syval=&encode_symb($bighash{'map_id_'.$mapid}, |
$canaccess = &allowed('bre',$file); |
$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 11016 sub symbread {
|
Line 11182 sub symbread {
|
$syval=''; |
$syval=''; |
} |
} |
} |
} |
untie(%bighash) |
untie(%bighash); |
} |
} |
} |
} |
if ($syval) { |
if ($syval) { |
Line 11354 sub rndseed_CODE_64bit5 {
|
Line 11520 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)=split(/[,:]/,$rndseed); |
my ($num1,$num2) = map { abs($_); } (split(/[,:]/,$rndseed)); |
&Math::Random::random_set_seed(abs($num1),abs($num2)); |
if ((!$num1) || (!$num2) || ($num1 > 2147483562) || ($num2 > 2147483398)) { |
|
&Math::Random::random_set_seed_from_phrase($rndseed); |
|
} else { |
|
&Math::Random::random_set_seed($num1,$num2); |
|
} |
} else { |
} else { |
&Math::Random::random_set_seed_from_phrase($rndseed); |
&Math::Random::random_set_seed_from_phrase($rndseed); |
} |
} |
Line 11875 sub get_dns {
|
Line 12045 sub get_dns {
|
$alldns{$host} = $protocol; |
$alldns{$host} = $protocol; |
} |
} |
while (%alldns) { |
while (%alldns) { |
my ($dns) = keys(%alldns); |
my ($dns) = sort { $b cmp $a } keys(%alldns); |
my $ua=new LWP::UserAgent; |
my $ua=new LWP::UserAgent; |
$ua->timeout(30); |
$ua->timeout(30); |
my $request=new HTTP::Request('GET',"$alldns{$dns}://$dns$url"); |
my $request=new HTTP::Request('GET',"$alldns{$dns}://$dns$url"); |
Line 11901 sub get_dns {
|
Line 12071 sub get_dns {
|
# ------------------------------------------------------Get DNS checksums file |
# ------------------------------------------------------Get DNS checksums file |
sub parse_dns_checksums_tab { |
sub parse_dns_checksums_tab { |
my ($lines,$hashref) = @_; |
my ($lines,$hashref) = @_; |
my $machine_dom = &Apache::lonnet::host_domain($perlvar{'lonHostID'}); |
my $lonhost = $perlvar{'lonHostID'}; |
|
my $machine_dom = &Apache::lonnet::host_domain($lonhost); |
my $loncaparev = &get_server_loncaparev($machine_dom); |
my $loncaparev = &get_server_loncaparev($machine_dom); |
|
my $distro = (split(/\:/,&get_server_distarch($lonhost)))[0]; |
|
my $webconfdir = '/etc/httpd/conf'; |
|
if ($distro =~ /^(ubuntu|debian)(\d+)$/) { |
|
$webconfdir = '/etc/apache2'; |
|
} elsif ($distro =~ /^sles(\d+)$/) { |
|
if ($1 >= 10) { |
|
$webconfdir = '/etc/apache2'; |
|
} |
|
} elsif ($distro =~ /^suse(\d+\.\d+)$/) { |
|
if ($1 >= 10.0) { |
|
$webconfdir = '/etc/apache2'; |
|
} |
|
} |
my ($release,$timestamp) = split(/\-/,$loncaparev); |
my ($release,$timestamp) = split(/\-/,$loncaparev); |
my (%chksum,%revnum); |
my (%chksum,%revnum); |
if (ref($lines) eq 'ARRAY') { |
if (ref($lines) eq 'ARRAY') { |
Line 11911 sub parse_dns_checksums_tab {
|
Line 12095 sub parse_dns_checksums_tab {
|
if ($version eq $release) { |
if ($version eq $release) { |
foreach my $line (@{$lines}) { |
foreach my $line (@{$lines}) { |
my ($file,$version,$shasum) = split(/,/,$line); |
my ($file,$version,$shasum) = split(/,/,$line); |
|
if ($file =~ m{^/etc/httpd/conf}) { |
|
if ($webconfdir eq '/etc/apache2') { |
|
$file =~ s{^\Q/etc/httpd/conf/\E}{$webconfdir/}; |
|
} |
|
} |
$chksum{$file} = $shasum; |
$chksum{$file} = $shasum; |
$revnum{$file} = $version; |
$revnum{$file} = $version; |
} |
} |
Line 12627 were new keys. I.E. 1:foo will become 1:
|
Line 12816 were new keys. I.E. 1:foo will become 1:
|
Calling convention: |
Calling convention: |
|
|
my %record=&Apache::lonnet::restore($symb,$courseid,$domain,$uname); |
my %record=&Apache::lonnet::restore($symb,$courseid,$domain,$uname); |
&Apache::lonnet::cstore(\%newrecord,$symb,$courseid,$domain,$uname); |
&Apache::lonnet::cstore(\%newrecord,$symb,$courseid,$domain,$uname,$laststore); |
|
|
For more detailed information, see lonnet specific documentation. |
For more detailed information, see lonnet specific documentation. |
|
|
Line 12763 escaped strings of the action recorded i
|
Line 12952 escaped strings of the action recorded i
|
|
|
=item * |
=item * |
|
|
allowed($priv,$uri,$symb,$role) : check for a user privilege; returns codes for allowed actions |
allowed($priv,$uri,$symb,$role,$clientip,$noblockcheck) : check for a user privilege; |
|
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 13163 will be stored for query
|
Line 13368 will be stored for query
|
|
|
=item * |
=item * |
|
|
symbread($filename) : return symbolic list entry (filename argument optional); |
symbread($filename,$donotrecurse,$ignorecachednull,$checkforblock,$possibles) : |
|
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 13264 homeserver.
|
Line 13482 homeserver.
|
|
|
=item * |
=item * |
|
|
store($storehash,$symb,$namespace,$udom,$uname) : stores hash permanently |
store($storehash,$symb,$namespace,$udom,$uname,$laststore) : stores hash |
for this url; hashref needs to be given and should be a \%hashname; the |
permanently for this url; hashref needs to be given and should be a \%hashname; |
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 |
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). |
|
$laststore is $version=$timestamp, where $version is the most recent version |
|
number retrieved for the corresponding $symb in the $namespace db file, and |
|
$timestamp is the timestamp for that transaction (UNIX time). |
|
$laststore is currently only passed when cstore() is called by |
|
structuretags::finalize_storage(). |
|
|
=item * |
=item * |
|
|
cstore($storehash,$symb,$namespace,$udom,$uname) : same as store but |
cstore($storehash,$symb,$namespace,$udom,$uname,$laststore) : same as store |
uses critical subroutine |
but uses critical subroutine |
|
|
=item * |
=item * |
|
|
Line 13295 $range should be either an integer '100'
|
Line 13519 $range should be either an integer '100'
|
|
|
=item * |
=item * |
|
|
putstore($namespace,$symb,$version,$storehash,$udomain,$uname) : |
putstore($namespace,$symb,$version,$storehash,$udomain,$uname,$tolog) : |
replaces a &store() version of data with a replacement set of data |
replaces a &store() version of data with a replacement set of data |
for a particular resource in a namespace passed in the $storehash hash |
for a particular resource in a namespace passed in the $storehash hash |
reference |
reference. If $tolog is true, the transaction is logged in the courselog |
|
with an action=PUTSTORE. |
|
|
=item * |
=item * |
|
|