Diff for /loncom/auth/lonacc.pm between versions 1.159.2.11 and 1.159.2.13

version 1.159.2.11, 2020/09/28 01:31:42 version 1.159.2.13, 2020/10/01 10:42:56
Line 435  sub sso_login { Line 435  sub sso_login {
     return undef;      return undef;
 }  }
   
 sub needs_symb_check {  
     my ($requrl) = @_;  
     $requrl=~/\.(\w+)$/;  
     if ((&Apache::loncommon::fileembstyle($1) eq 'ssi') ||  
         ($requrl=~/^\/adm\/.*\/(aboutme|smppg|bulletinboard)(\?|$ )/x) ||  
         ($requrl=~/^\/adm\/wrapper\//) ||  
         ($requrl=~m|^/adm/coursedocs/showdoc/|) ||  
         ($requrl=~m|\.problem/smpedit$|) ||  
         ($requrl=~/^\/public\/.*\/syllabus$/) ||  
         ($requrl=~/^\/adm\/(viewclasslist|navmaps)$/) ||  
         ($requrl=~/^\/adm\/.*\/aboutme\/portfolio(\?|$)/)) {  
         return 1;  
     }  
     return;  
 }  
   
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
     my $requrl=$r->uri;      my $requrl=$r->uri;
Line 545  sub handler { Line 529  sub handler {
                         if ($value =~ /^supplemental/) {                          if ($value =~ /^supplemental/) {
                             $suppext = 1;                              $suppext = 1;
                         }                          }
                           last;
                     }                      }
                 }                  }
             }              }
Line 608  sub handler { Line 593  sub handler {
   
 # ---------------------------------------------------------------- Check access  # ---------------------------------------------------------------- Check access
  my $now = time;   my $now = time;
           my $check_symb;
  if ($requrl !~ m{^/(?:adm|public|(?:prt|zip)spool)/}   if ($requrl !~ m{^/(?:adm|public|(?:prt|zip)spool)/}
     || $requrl =~ /^\/adm\/.*\/(smppg|bulletinboard)(\?|$ )/x) {      || $requrl =~ /^\/adm\/.*\/(smppg|bulletinboard)(\?|$ )/x) {
             my ($access,$poss_symb);              my ($access,$poss_symb);
             if (($env{'request.course.id'}) && (!$suppext) && (&needs_symb_check($requrl))) {              if (($env{'request.course.id'}) && (!$suppext)) {
                 unless ($env{'form.symb'}) {                  $requrl=~/\.(\w+)$/;
                     if ($r->args) {                  if ((&Apache::loncommon::fileembstyle($1) eq 'ssi') ||
                         &Apache::loncommon::get_unprocessed_cgi($r->args,['symb']);                      ($requrl=~/^\/adm\/.*\/(aboutme|smppg|bulletinboard)(\?|$ )/x) ||
                     }                      ($requrl=~/^\/adm\/wrapper\//) ||
                       ($requrl=~m|^/adm/coursedocs/showdoc/|) ||
                       ($requrl=~m|\.problem/smpedit$|) ||
                       ($requrl=~/^\/public\/.*\/syllabus$/) ||
                       ($requrl=~/^\/adm\/(viewclasslist|navmaps)$/) ||
                       ($requrl=~/^\/adm\/.*\/aboutme\/portfolio(\?|$)/)) {
                       $check_symb = 1;
                 }                  }
               }
               if ($check_symb) {
                 if ($env{'form.symb'}) {                  if ($env{'form.symb'}) {
                     $poss_symb=&Apache::lonnet::symbclean($env{'form.symb'});                      $poss_symb=&Apache::lonnet::symbclean($env{'form.symb'});
                   } elsif (($env{'request.course.id'}) && ($r->args ne '')) {
                       my $query = $r->args;
                       foreach my $pair (split(/&/,$query)) {
                           my ($name, $value) = split(/=/,$pair);
                           $name = &unescape($name);
                           $value =~ tr/+/ /;
                           $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
                           if ($name eq 'symb') {
                               $poss_symb = &Apache::lonnet::symbclean($value);
                               last;
                           }
                       }
                 }                  }
                 if ($poss_symb) {                  if ($poss_symb) {
                     my ($possmap,$resid,$url)=&Apache::lonnet::decode_symb($poss_symb);                      my ($possmap,$resid,$url)=&Apache::lonnet::decode_symb($poss_symb);
Line 715  sub handler { Line 721  sub handler {
     $env{'user.domain'} eq 'public' &&      $env{'user.domain'} eq 'public' &&
     $requrl !~ m{^/+(res|public|uploaded)/} &&      $requrl !~ m{^/+(res|public|uploaded)/} &&
     $requrl !~ m{^/adm/[^/]+/[^/]+/aboutme/portfolio$ }x &&      $requrl !~ m{^/adm/[^/]+/[^/]+/aboutme/portfolio$ }x &&
         $requrl !~ m{^/adm/blockingstatus/.*$} &&              $requrl !~ m{^/adm/blockingstatus/.*$} &&
     $requrl !~ m{^/+adm/(help|logout|restrictedaccess|randomlabel\.png)}) {      $requrl !~ m{^/+adm/(help|logout|restrictedaccess|randomlabel\.png)}) {
     $env{'request.querystring'}=$r->args;      $env{'request.querystring'}=$r->args;
     $env{'request.firsturl'}=$requrl;      $env{'request.firsturl'}=$requrl;
Line 725  sub handler { Line 731  sub handler {
  if ($env{'request.course.id'}) {   if ($env{'request.course.id'}) {
     &Apache::lonnet::countacc($requrl);      &Apache::lonnet::countacc($requrl);
             my $query=$r->args;              my $query=$r->args;
             if (&needs_symb_check($requrl)) {              if ($check_symb) {
 # ------------------------------------- This is serious stuff, get symb and log  # ------------------------------------- This is serious stuff, get symb and log
  my $symb;   my $symb;
  if ($query) {   if ($query) {
Line 768  sub handler { Line 774  sub handler {
                     if ($requrl=~m{^(/adm/.*/aboutme)/portfolio$}) {                      if ($requrl=~m{^(/adm/.*/aboutme)/portfolio$}) {
                         $requrl = $1;                          $requrl = $1;
                     }                      }
                     unless ($suppext) {      $symb=&Apache::lonnet::symbread($requrl);
         $symb=&Apache::lonnet::symbread($requrl);                      if (&Apache::lonnet::is_on_map($requrl) && $symb) {
                         if (&Apache::lonnet::is_on_map($requrl) && $symb) {                          my ($encstate,$invalidsymb);
                             my ($encstate,$invalidsymb);                          unless (&Apache::lonnet::symbverify($symb,$requrl,\$encstate)) {
                             unless (&Apache::lonnet::symbverify($symb,$requrl,\$encstate)) {                              $invalidsymb = 1;
                                 $invalidsymb = 1;                              #
                                 #                              # If $env{'request.enc'} is true, but no encryption for $symb retrieved
                                 # If $env{'request.enc'} is true, but no encryption for $symb retrieved                              # by original lonnet::symbread() call, call again to check for an instance
                                 # by original lonnet::symbread() call, call again to check for an instance                              # of $requrl in the course which has encryption, and set that as the symb.
                                 # of $requrl in the course which has encryption, and set that as the symb.                              # If there is no such symb, or symbverify() fails for the new symb proceed
                                 # If there is no such symb, or symbverify() fails for the new symb proceed                              # to report invalid symb.
                                 # to report invalid symb.                              #
                                 #                              if ($env{'request.enc'} && !$encstate) {
                                 if ($env{'request.enc'} && !$encstate) {                                  my %possibles;
                                     my %possibles;                                  my $nocache = 1;
                                     my $nocache = 1;                                  $symb = &Apache::lonnet::symbread($requrl,'','','',\%possibles,$nocache);
                                     $symb = &Apache::lonnet::symbread($requrl,'','','',\%possibles,$nocache);                                  if ($symb) {
                                     if ($symb) {                                      if (&Apache::lonnet::symbverify($symb,$requrl)) {
                                         if (&Apache::lonnet::symbverify($symb,$requrl)) {                                          $invalidsymb = '';
                                             $invalidsymb = '';  
                                         }  
                                     } elsif (keys(%possibles) > 1) {  
                                         $r->internal_redirect('/adm/ambiguous');  
                                         return OK;  
                                     }                                      }
                                   } elsif (keys(%possibles) > 1) {
                                       $r->internal_redirect('/adm/ambiguous');
                                       return OK;
                                 }                                  }
                                 if ($invalidsymb) {                              }
                                     $r->log_reason('Invalid symb for '.$requrl.': '.$symb);                              if ($invalidsymb) {
                                     $env{'user.error.msg'}=                                  $r->log_reason('Invalid symb for '.$requrl.': '.$symb);
                                         "$requrl:bre:1:1:Invalid Access";                                  $env{'user.error.msg'}=
                                     return HTTP_NOT_ACCEPTABLE;                                      "$requrl:bre:1:1:Invalid Access";
                                 }                                  return HTTP_NOT_ACCEPTABLE;
                             }                              }
                         }                          }
         if ($symb) {                      }
     my ($map,$mid,$murl)=      if ($symb) {
         &Apache::lonnet::decode_symb($symb);   my ($map,$mid,$murl)=
                             if ($requrl eq '/adm/navmaps') {      &Apache::lonnet::decode_symb($symb);
                                 &Apache::lonnet::symblist($map,$murl =>[$murl,$mid]);                          if ($requrl eq '/adm/navmaps') {
                             } else {                              &Apache::lonnet::symblist($map,$murl =>[$murl,$mid]);
                                 if (($map =~ /\.page$/) && ($requrl !~ /\.page$/)) {                          } else {
                                     my $mapsymb = &Apache::lonnet::symbread($map);                              if (($map =~ /\.page$/) && ($requrl !~ /\.page$/)) {
                                     ($map,$mid,$murl)=&Apache::lonnet::decode_symb($mapsymb);                                  my $mapsymb = &Apache::lonnet::symbread($map);
                                 }                                  ($map,$mid,$murl)=&Apache::lonnet::decode_symb($mapsymb);
                                 &Apache::lonnet::symblist($map,$murl =>[$murl,$mid],  
                                                           'last_known' =>[$murl,$mid]);  
                             }                              }
         }                              &Apache::lonnet::symblist($map,$murl =>[$murl,$mid],
                                                         'last_known' =>[$murl,$mid]);
                           }
     }      }
  }   }
  $env{'request.symb'}=$symb;   $env{'request.symb'}=$symb;

Removed from v.1.159.2.11  
changed lines
  Added in v.1.159.2.13


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.