[LON-CAPA-cvs] cvs: loncom(version_2_11_X) /lonnet/perl lonnet.pm

raeburn raeburn at source.lon-capa.org
Mon Sep 28 09:56:30 EDT 2020


raeburn		Mon Sep 28 13:56:30 2020 EDT

  Modified files:              (Branch: version_2_11_X)
    /loncom/lonnet/perl	lonnet.pm 
  Log:
  - For 2.11
    Backport 1.1424, 1.1425
  
  
-------------- next part --------------
Index: loncom/lonnet/perl/lonnet.pm
diff -u loncom/lonnet/perl/lonnet.pm:1.1172.2.125 loncom/lonnet/perl/lonnet.pm:1.1172.2.126
--- loncom/lonnet/perl/lonnet.pm:1.1172.2.125	Tue Sep  8 01:19:47 2020
+++ loncom/lonnet/perl/lonnet.pm	Mon Sep 28 13:56:29 2020
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # TCP networking package
 #
-# $Id: lonnet.pm,v 1.1172.2.125 2020/09/08 01:19:47 raeburn Exp $
+# $Id: lonnet.pm,v 1.1172.2.126 2020/09/28 13:56:29 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -7784,7 +7784,7 @@
 # ------------------------------------------------- Check for a user privilege
 
 sub allowed {
-    my ($priv,$uri,$symb,$role,$clientip,$noblockcheck)=@_;
+    my ($priv,$uri,$symb,$role,$clientip,$noblockcheck,$ignorecache)=@_;
     my $ver_orguri=$uri;
     $uri=&deversion($uri);
     my $orguri=$uri;
@@ -8009,7 +8009,7 @@
                 if ($noblockcheck) {
                     $thisallowed.=$value;
                 } else {
-                    my @blockers = &has_comm_blocking($priv,$symb,$uri);
+                    my @blockers = &has_comm_blocking($priv,$symb,$uri,$ignorecache);
                     if (@blockers > 0) {
                         $thisallowed = 'B';
                     } else {
@@ -8029,7 +8029,7 @@
                         if ($noblockcheck) {
                             $thisallowed='F';
                         } else {
-                            my @blockers = &has_comm_blocking($priv,$symb,$refuri);
+                            my @blockers = &has_comm_blocking($priv,$symb,$refuri,$ignorecache);
                             if (@blockers > 0) {
                                 $thisallowed = 'B';
                             } else {
@@ -8102,7 +8102,7 @@
                    if ($noblockcheck) {
                        $thisallowed.=$value;
                    } else {
-                       my @blockers = &has_comm_blocking($priv,$symb,$uri);
+                       my @blockers = &has_comm_blocking($priv,$symb,$uri,$ignorecache);
                        if (@blockers > 0) {
                            $thisallowed = 'B';
                        } else {
@@ -8115,7 +8115,7 @@
                $checkreferer=0;
            }
        }
-       
+
        if ($checkreferer) {
 	  my $refuri=$env{'httpref.'.$orguri};
             unless ($refuri) {
@@ -8144,7 +8144,7 @@
                       if ($noblockcheck) {
                           $thisallowed.=$value;
                       } else {
-                          my @blockers = &has_comm_blocking($priv,$symb,$refuri);
+                          my @blockers = &has_comm_blocking($priv,'',$refuri,$ignorecache);
                           if (@blockers > 0) {
                               $thisallowed = 'B';
                           } else {
@@ -8230,7 +8230,7 @@
 	   }
        }
     }
-   
+
 #
 # Rest of the restrictions depend on selected course
 #
@@ -8388,6 +8388,10 @@
 #
 # User for whom data are being temporarily cached.
 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).
 my %cachedblockers=();
 # When the data were last cached.
@@ -8397,13 +8401,22 @@
     my ($uname,$udom,$blocks)=@_;
     if (($uname ne '') && ($udom ne '')) {
         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;
         }
     }
     $cachedlast=time;
     $cacheduser=$uname.':'.$udom;
+    $cachedcid=$env{'request.course.id'};
     %cachedblockers = &get_commblock_resources($blocks);
+    if ((ref($blocks) eq 'HASH') && (keys(%{$blocks}) > 0)) {
+        $cachedblocks = join(',',sort(keys(%{$blocks})));
+    }
+    return;
 }
 
 sub get_comm_blocks {
@@ -8540,7 +8553,7 @@
 }
 
 sub has_comm_blocking {
-    my ($priv,$symb,$uri,$blocks) = @_;
+    my ($priv,$symb,$uri,$nosymbcache,$blocked,$blocks) = @_;
     my @blockers;
     return unless ($env{'request.course.id'});
     return unless ($priv eq 'bre');
@@ -8550,7 +8563,7 @@
     return unless (keys(%cachedblockers) > 0);
     my (%possibles, at symbs);
     if (!$symb) {
-        $symb = &symbread($uri,1,1,1,\%possibles);
+        $symb = &symbread($uri,1,1,'',\%possibles,$nosymbcache);
     }
     if ($symb) {
         @symbs = ($symb);
@@ -8564,9 +8577,11 @@
         foreach my $block (keys(%cachedblockers)) {
             if ($block =~ /^firstaccess____(.+)$/) {
                 my $item = $1;
-                if (($item eq $map) || ($item eq $symb)) {
-                    $noblock = 1;
-                    last;
+                unless ($blocked) {
+                    if (($item eq $map) || ($item eq $symb)) {
+                        $noblock = 1;
+                        last;
+                    }
                 }
             }
             if (ref($cachedblockers{$block}) eq 'HASH') {
@@ -8577,18 +8592,20 @@
                         }
                     }
                 }
-            }
-            if (ref($cachedblockers{$block}{'maps'}) eq 'HASH') {
-                if ($cachedblockers{$block}{'maps'}{$map}) {
-                    unless (grep(/^\Q$block\E$/, at blockers)) {
-                        push(@blockers,$block);
+                if (ref($cachedblockers{$block}{'maps'}) eq 'HASH') {
+                    if ($cachedblockers{$block}{'maps'}{$map}) {
+                        unless (grep(/^\Q$block\E$/, at blockers)) {
+                            push(@blockers,$block);
+                        }
                     }
                 }
             }
         }
     }
-    return if ($noblock);
-    return @blockers;
+    unless ($noblock) {
+        return @blockers;
+    }
+    return;
 }
 }
 
@@ -12427,19 +12444,26 @@
 # ------------------------------------------------------ Return symb list entry
 
 sub symbread {
-    my ($thisfn,$donotrecurse,$ignorecachednull,$checkforblock,$possibles)=@_;
+    my ($thisfn,$donotrecurse,$ignorecachednull,$checkforblock,$possibles,
+        $nocache)=@_;
     my $cache_str='request.symbread.cached.'.$thisfn;
-    if (defined($env{$cache_str})) {
-        if ($ignorecachednull) {
-            return $env{$cache_str} unless ($env{$cache_str} eq '');
-        } else {
-            return $env{$cache_str};
+    if (defined($env{$cache_str}) && !$nocache) {
+        unless (ref($possibles) eq 'HASH') {
+            if ($ignorecachednull) {
+                return $env{$cache_str} unless ($env{$cache_str} eq '');
+            } else {
+                return $env{$cache_str};
+            }
         }
     }
 # no filename provided? try from environment
     unless ($thisfn) {
         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'};
     }
@@ -12447,7 +12471,11 @@
 # is that filename actually a symb? Verify, clean, and return
     if ($thisfn=~/\_\_\_\d+\_\_\_(.*)$/) {
 	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);
@@ -12462,10 +12490,18 @@
 	if ($targetfn =~ m|^adm/wrapper/(ext/.*)|) {
 	    $targetfn=$1;
 	}
-        if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
-                      &GDBM_READER(),0640)) {
-	    $syval=$hash{$targetfn};
-            untie(%hash);
+        unless ($nocache) {
+            if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
+                          &GDBM_READER(),0640)) {
+	        $syval=$hash{$targetfn};
+                untie(%hash);
+            }
+            if ($syval) {
+                my @blockers = &has_comm_blocking('bre',$syval,$thisfn,$nocache);
+                if (@blockers) {
+                    $syval='';
+                }
+            }
         }
 # ---------------------------------------------------------- There was an entry
         if ($syval) {
@@ -12498,13 +12534,19 @@
 		     $syval=&encode_symb($bighash{'map_id_'.$mapid},
 						    $resid,$thisfn);
                      if (ref($possibles) eq 'HASH') {
-                         $possibles->{$syval} = 1;
+                         unless ($bighash{'randomout_'.$ids} || $env{'request.role.adv'}) {
+                             $possibles->{$syval} = 1;
+                         }
                      }
                      if ($checkforblock) {
-                         my @blockers = &has_comm_blocking('bre',$syval,$bighash{'src_'.$ids});
-                         if (@blockers) {
-                             $syval = '';
-                             return;
+                         unless ($bighash{'randomout_'.$ids} || $env{'request.role.adv'}) {
+                             my @blockers = &has_comm_blocking('bre',$syval,$bighash{'src_'.$ids});
+                             if (@blockers) {
+                                 $syval = '';
+                                 untie(%bighash);
+                                 return '' if ($nocache);
+                                 return $env{$cache_str}='';
+                             }
                          }
                      }
                  } elsif ((!$donotrecurse) || ($checkforblock) || (ref($possibles) eq 'HASH')) {
@@ -12523,12 +12565,13 @@
                              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;
-                                 }
+                                 next if ($bighash{'randomout_'.$id} && !$env{'request.role.adv'});
+                                 next unless ($bighash{'encrypted_'.$id} eq $env{'request.enc'});
                                  if ($checkforblock) {
                                      my @blockers = &has_comm_blocking('bre',$poss_syval,$file);
-                                     unless (@blockers > 0) {
+                                     if (@blockers > 0) {
+                                         $syval = '';
+                                     } else {
                                          $syval = $poss_syval;
                                          $realpossible++;
                                      }
@@ -12536,6 +12579,11 @@
                                      $syval = $poss_syval;
                                      $realpossible++;
                                  }
+                                 if ($syval) {
+                                     if (ref($possibles) eq 'HASH') {
+                                         $possibles->{$syval} = 1;
+                                     }
+                                 }
                              }
 			 }
                      }
@@ -12548,10 +12596,15 @@
            }
         }
         if ($syval) {
-	    return $env{$cache_str}=$syval;
+            if ($nocache) {
+                return $syval;
+            } else {
+	        return $env{$cache_str}=$syval;
+            }
         }
     }
     &appenv({'request.ambiguous' => $thisfn});
+    return '' if ($nocache);
     return $env{$cache_str}='';
 }
 


More information about the LON-CAPA-cvs mailing list