version 1.1172.2.125, 2020/09/08 01:19:47
|
version 1.1172.2.126, 2020/09/28 13:56:29
|
Line 7784 sub customaccess {
|
Line 7784 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,$noblockcheck,$ignorecache)=@_; |
my $ver_orguri=$uri; |
my $ver_orguri=$uri; |
$uri=&deversion($uri); |
$uri=&deversion($uri); |
my $orguri=$uri; |
my $orguri=$uri; |
Line 8009 sub allowed {
|
Line 8009 sub allowed {
|
if ($noblockcheck) { |
if ($noblockcheck) { |
$thisallowed.=$value; |
$thisallowed.=$value; |
} else { |
} else { |
my @blockers = &has_comm_blocking($priv,$symb,$uri); |
my @blockers = &has_comm_blocking($priv,$symb,$uri,$ignorecache); |
if (@blockers > 0) { |
if (@blockers > 0) { |
$thisallowed = 'B'; |
$thisallowed = 'B'; |
} else { |
} else { |
Line 8029 sub allowed {
|
Line 8029 sub allowed {
|
if ($noblockcheck) { |
if ($noblockcheck) { |
$thisallowed='F'; |
$thisallowed='F'; |
} else { |
} else { |
my @blockers = &has_comm_blocking($priv,$symb,$refuri); |
my @blockers = &has_comm_blocking($priv,$symb,$refuri,$ignorecache); |
if (@blockers > 0) { |
if (@blockers > 0) { |
$thisallowed = 'B'; |
$thisallowed = 'B'; |
} else { |
} else { |
Line 8102 sub allowed {
|
Line 8102 sub allowed {
|
if ($noblockcheck) { |
if ($noblockcheck) { |
$thisallowed.=$value; |
$thisallowed.=$value; |
} else { |
} else { |
my @blockers = &has_comm_blocking($priv,$symb,$uri); |
my @blockers = &has_comm_blocking($priv,$symb,$uri,$ignorecache); |
if (@blockers > 0) { |
if (@blockers > 0) { |
$thisallowed = 'B'; |
$thisallowed = 'B'; |
} else { |
} else { |
Line 8115 sub allowed {
|
Line 8115 sub allowed {
|
$checkreferer=0; |
$checkreferer=0; |
} |
} |
} |
} |
|
|
if ($checkreferer) { |
if ($checkreferer) { |
my $refuri=$env{'httpref.'.$orguri}; |
my $refuri=$env{'httpref.'.$orguri}; |
unless ($refuri) { |
unless ($refuri) { |
Line 8144 sub allowed {
|
Line 8144 sub allowed {
|
if ($noblockcheck) { |
if ($noblockcheck) { |
$thisallowed.=$value; |
$thisallowed.=$value; |
} else { |
} else { |
my @blockers = &has_comm_blocking($priv,$symb,$refuri); |
my @blockers = &has_comm_blocking($priv,'',$refuri,$ignorecache); |
if (@blockers > 0) { |
if (@blockers > 0) { |
$thisallowed = 'B'; |
$thisallowed = 'B'; |
} else { |
} else { |
Line 8230 sub allowed {
|
Line 8230 sub allowed {
|
} |
} |
} |
} |
} |
} |
|
|
# |
# |
# Rest of the restrictions depend on selected course |
# Rest of the restrictions depend on selected course |
# |
# |
Line 8388 sub constructaccess {
|
Line 8388 sub constructaccess {
|
# |
# |
# User for whom data are being temporarily cached. |
# User for whom data are being temporarily cached. |
my $cacheduser=''; |
my $cacheduser=''; |
|
# Course for which data are being temporarily cached. |
|
my $cachedcid=''; |
|
# List of blocks passed to &get_commblock_resources(); |
|
my $cachedblocks=''; |
# Cached blockers for this user (a hash of blocking items). |
# Cached blockers for this user (a hash of blocking items). |
my %cachedblockers=(); |
my %cachedblockers=(); |
# When the data were last cached. |
# When the data were last cached. |
Line 8397 sub load_all_blockers {
|
Line 8401 sub load_all_blockers {
|
my ($uname,$udom,$blocks)=@_; |
my ($uname,$udom,$blocks)=@_; |
if (($uname ne '') && ($udom ne '')) { |
if (($uname ne '') && ($udom ne '')) { |
if (($cacheduser eq $uname.':'.$udom) && |
if (($cacheduser eq $uname.':'.$udom) && |
(abs($cachedlast-time)<5)) { |
($cachedcid eq $env{'request.course.id'}) && |
|
(abs($cachedlast-time)<5) && |
|
(((ref($blocks) eq 'HASH') && |
|
($cachedblocks eq join(',',sort(keys(%{$blocks}))))) || |
|
(!ref($blocks) && $cachedblocks eq ''))) { |
return; |
return; |
} |
} |
} |
} |
$cachedlast=time; |
$cachedlast=time; |
$cacheduser=$uname.':'.$udom; |
$cacheduser=$uname.':'.$udom; |
|
$cachedcid=$env{'request.course.id'}; |
%cachedblockers = &get_commblock_resources($blocks); |
%cachedblockers = &get_commblock_resources($blocks); |
|
if ((ref($blocks) eq 'HASH') && (keys(%{$blocks}) > 0)) { |
|
$cachedblocks = join(',',sort(keys(%{$blocks}))); |
|
} |
|
return; |
} |
} |
|
|
sub get_comm_blocks { |
sub get_comm_blocks { |
Line 8540 sub get_commblock_resources {
|
Line 8553 sub get_commblock_resources {
|
} |
} |
|
|
sub has_comm_blocking { |
sub has_comm_blocking { |
my ($priv,$symb,$uri,$blocks) = @_; |
my ($priv,$symb,$uri,$nosymbcache,$blocked,$blocks) = @_; |
my @blockers; |
my @blockers; |
return unless ($env{'request.course.id'}); |
return unless ($env{'request.course.id'}); |
return unless ($priv eq 'bre'); |
return unless ($priv eq 'bre'); |
Line 8550 sub has_comm_blocking {
|
Line 8563 sub has_comm_blocking {
|
return unless (keys(%cachedblockers) > 0); |
return unless (keys(%cachedblockers) > 0); |
my (%possibles,@symbs); |
my (%possibles,@symbs); |
if (!$symb) { |
if (!$symb) { |
$symb = &symbread($uri,1,1,1,\%possibles); |
$symb = &symbread($uri,1,1,'',\%possibles,$nosymbcache); |
} |
} |
if ($symb) { |
if ($symb) { |
@symbs = ($symb); |
@symbs = ($symb); |
Line 8564 sub has_comm_blocking {
|
Line 8577 sub has_comm_blocking {
|
foreach my $block (keys(%cachedblockers)) { |
foreach my $block (keys(%cachedblockers)) { |
if ($block =~ /^firstaccess____(.+)$/) { |
if ($block =~ /^firstaccess____(.+)$/) { |
my $item = $1; |
my $item = $1; |
if (($item eq $map) || ($item eq $symb)) { |
unless ($blocked) { |
$noblock = 1; |
if (($item eq $map) || ($item eq $symb)) { |
last; |
$noblock = 1; |
|
last; |
|
} |
} |
} |
} |
} |
if (ref($cachedblockers{$block}) eq 'HASH') { |
if (ref($cachedblockers{$block}) eq 'HASH') { |
Line 8577 sub has_comm_blocking {
|
Line 8592 sub has_comm_blocking {
|
} |
} |
} |
} |
} |
} |
} |
if (ref($cachedblockers{$block}{'maps'}) eq 'HASH') { |
if (ref($cachedblockers{$block}{'maps'}) eq 'HASH') { |
if ($cachedblockers{$block}{'maps'}{$map}) { |
if ($cachedblockers{$block}{'maps'}{$map}) { |
unless (grep(/^\Q$block\E$/,@blockers)) { |
unless (grep(/^\Q$block\E$/,@blockers)) { |
push(@blockers,$block); |
push(@blockers,$block); |
} |
} |
} |
} |
} |
} |
} |
} |
} |
} |
} |
return if ($noblock); |
unless ($noblock) { |
return @blockers; |
return @blockers; |
|
} |
|
return; |
} |
} |
} |
} |
|
|
Line 12427 sub deversion {
|
Line 12444 sub deversion {
|
# ------------------------------------------------------ Return symb list entry |
# ------------------------------------------------------ Return symb list entry |
|
|
sub symbread { |
sub symbread { |
my ($thisfn,$donotrecurse,$ignorecachednull,$checkforblock,$possibles)=@_; |
my ($thisfn,$donotrecurse,$ignorecachednull,$checkforblock,$possibles, |
|
$nocache)=@_; |
my $cache_str='request.symbread.cached.'.$thisfn; |
my $cache_str='request.symbread.cached.'.$thisfn; |
if (defined($env{$cache_str})) { |
if (defined($env{$cache_str}) && !$nocache) { |
if ($ignorecachednull) { |
unless (ref($possibles) eq 'HASH') { |
return $env{$cache_str} unless ($env{$cache_str} eq ''); |
if ($ignorecachednull) { |
} else { |
return $env{$cache_str} unless ($env{$cache_str} eq ''); |
return $env{$cache_str}; |
} 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'}); |
if ($nocache) { |
|
return &symbclean($env{'request.symb'}); |
|
} else { |
|
return $env{$cache_str}=&symbclean($env{'request.symb'}); |
|
} |
} |
} |
$thisfn=$env{'request.filename'}; |
$thisfn=$env{'request.filename'}; |
} |
} |
Line 12447 sub symbread {
|
Line 12471 sub symbread {
|
# is that filename actually a symb? Verify, clean, and return |
# is that filename actually a symb? Verify, clean, and return |
if ($thisfn=~/\_\_\_\d+\_\_\_(.*)$/) { |
if ($thisfn=~/\_\_\_\d+\_\_\_(.*)$/) { |
if (&symbverify($thisfn,$1)) { |
if (&symbverify($thisfn,$1)) { |
return $env{$cache_str}=&symbclean($thisfn); |
if ($nocache) { |
|
return &symbclean($thisfn); |
|
} else { |
|
return $env{$cache_str}=&symbclean($thisfn); |
|
} |
} |
} |
} |
} |
$thisfn=declutter($thisfn); |
$thisfn=declutter($thisfn); |
Line 12462 sub symbread {
|
Line 12490 sub symbread {
|
if ($targetfn =~ m|^adm/wrapper/(ext/.*)|) { |
if ($targetfn =~ m|^adm/wrapper/(ext/.*)|) { |
$targetfn=$1; |
$targetfn=$1; |
} |
} |
if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db', |
unless ($nocache) { |
&GDBM_READER(),0640)) { |
if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db', |
$syval=$hash{$targetfn}; |
&GDBM_READER(),0640)) { |
untie(%hash); |
$syval=$hash{$targetfn}; |
|
untie(%hash); |
|
} |
|
if ($syval) { |
|
my @blockers = &has_comm_blocking('bre',$syval,$thisfn,$nocache); |
|
if (@blockers) { |
|
$syval=''; |
|
} |
|
} |
} |
} |
# ---------------------------------------------------------- There was an entry |
# ---------------------------------------------------------- There was an entry |
if ($syval) { |
if ($syval) { |
Line 12498 sub symbread {
|
Line 12534 sub symbread {
|
$syval=&encode_symb($bighash{'map_id_'.$mapid}, |
$syval=&encode_symb($bighash{'map_id_'.$mapid}, |
$resid,$thisfn); |
$resid,$thisfn); |
if (ref($possibles) eq 'HASH') { |
if (ref($possibles) eq 'HASH') { |
$possibles->{$syval} = 1; |
unless ($bighash{'randomout_'.$ids} || $env{'request.role.adv'}) { |
|
$possibles->{$syval} = 1; |
|
} |
} |
} |
if ($checkforblock) { |
if ($checkforblock) { |
my @blockers = &has_comm_blocking('bre',$syval,$bighash{'src_'.$ids}); |
unless ($bighash{'randomout_'.$ids} || $env{'request.role.adv'}) { |
if (@blockers) { |
my @blockers = &has_comm_blocking('bre',$syval,$bighash{'src_'.$ids}); |
$syval = ''; |
if (@blockers) { |
return; |
$syval = ''; |
|
untie(%bighash); |
|
return '' if ($nocache); |
|
return $env{$cache_str}=''; |
|
} |
} |
} |
} |
} |
} elsif ((!$donotrecurse) || ($checkforblock) || (ref($possibles) eq 'HASH')) { |
} elsif ((!$donotrecurse) || ($checkforblock) || (ref($possibles) eq 'HASH')) { |
Line 12523 sub symbread {
|
Line 12565 sub symbread {
|
if ($bighash{'map_type_'.$mapid} ne 'page') { |
if ($bighash{'map_type_'.$mapid} ne 'page') { |
my $poss_syval=&encode_symb($bighash{'map_id_'.$mapid}, |
my $poss_syval=&encode_symb($bighash{'map_id_'.$mapid}, |
$resid,$thisfn); |
$resid,$thisfn); |
if (ref($possibles) eq 'HASH') { |
next if ($bighash{'randomout_'.$id} && !$env{'request.role.adv'}); |
$possibles->{$syval} = 1; |
next unless ($bighash{'encrypted_'.$id} eq $env{'request.enc'}); |
} |
|
if ($checkforblock) { |
if ($checkforblock) { |
my @blockers = &has_comm_blocking('bre',$poss_syval,$file); |
my @blockers = &has_comm_blocking('bre',$poss_syval,$file); |
unless (@blockers > 0) { |
if (@blockers > 0) { |
|
$syval = ''; |
|
} else { |
$syval = $poss_syval; |
$syval = $poss_syval; |
$realpossible++; |
$realpossible++; |
} |
} |
Line 12536 sub symbread {
|
Line 12579 sub symbread {
|
$syval = $poss_syval; |
$syval = $poss_syval; |
$realpossible++; |
$realpossible++; |
} |
} |
|
if ($syval) { |
|
if (ref($possibles) eq 'HASH') { |
|
$possibles->{$syval} = 1; |
|
} |
|
} |
} |
} |
} |
} |
} |
} |
Line 12548 sub symbread {
|
Line 12596 sub symbread {
|
} |
} |
} |
} |
if ($syval) { |
if ($syval) { |
return $env{$cache_str}=$syval; |
if ($nocache) { |
|
return $syval; |
|
} else { |
|
return $env{$cache_str}=$syval; |
|
} |
} |
} |
} |
} |
&appenv({'request.ambiguous' => $thisfn}); |
&appenv({'request.ambiguous' => $thisfn}); |
|
return '' if ($nocache); |
return $env{$cache_str}=''; |
return $env{$cache_str}=''; |
} |
} |
|
|