Diff for /loncom/auth/lonacc.pm between versions 1.185 and 1.207

version 1.185, 2020/12/22 22:23:37 version 1.207, 2022/09/17 23:38:50
Line 160  sub get_posted_cgi { Line 160  sub get_posted_cgi {
                         if (length($value) == 1) {                          if (length($value) == 1) {
                             $value=~s/[\r\n]$//;                              $value=~s/[\r\n]$//;
                         }                          }
                     } elsif ($fname =~ /\.(xls|doc|ppt)(x|m)$/i) {                      } 
                       if ($fname =~ /\.(xls|doc|ppt)(x|m)$/i) {
                         $value=~s/[\r\n]$//;                          $value=~s/[\r\n]$//;
                     }                      }
                     if (ref($fields) eq 'ARRAY') {                      if (ref($fields) eq 'ARRAY') {
Line 280  sub upload_size_allowed { Line 281  sub upload_size_allowed {
         be identified by the third arg ($usename), except when lonacc is called in           be identified by the third arg ($usename), except when lonacc is called in 
         an internal redirect to /adm/switchserver (e.g., load-balancing following          an internal redirect to /adm/switchserver (e.g., load-balancing following
         successful authentication) -- no cookie set yet.  For that particular case          successful authentication) -- no cookie set yet.  For that particular case
         simply skip the call to sso_login().           simply skip the call to sso_login().
   
  returns OK if it was SSO and user was handled.   returns OK if it was SSO and user was handled.
         returns undef if not SSO or no means to handle the user.          returns undef if not SSO or no means to handle the user.
   
           In the case where the session was started from /adm/launch/tiny/$domain/$id,
           i.e., for a protected link, with launch from another CMS, and user information
           is accepted from the LTI payload, then, if the user has privileged roles,
           authentication will be required.  If SSO authentication is with a username
           and/or domain that differ from the username in the LTI payload and domain
           in the launch URL, then $r->user() will be unset and /adm/relaunch will be
           called.
                   
 =cut  =cut
   
Line 305  sub sso_login { Line 314  sub sso_login {
     my $query = $r->args;      my $query = $r->args;
     my %form;      my %form;
     if ($query) {      if ($query) {
         my @items = ('role','symb','iptoken');          my @items = ('role','symb','iptoken','origurl','ttoken',
                        'ltoken','linkkey','logtoken','sso','lcssowin');
         &Apache::loncommon::get_unprocessed_cgi($query,\@items);          &Apache::loncommon::get_unprocessed_cgi($query,\@items);
         foreach my $item (@items) {          foreach my $item (@items) {
             if (defined($env{'form.'.$item})) {              if (defined($env{'form.'.$item})) {
Line 323  sub sso_login { Line 333  sub sso_login {
         }          }
     }      }
   
       my ($linkprot,$linkprotuser,$linkprotexit,$linkkey,$deeplinkurl);
   
   #
   # If Shibboleth auth is in use, and a dual SSO and non-SSO login page
   # is in use, then the query string will contain the logtoken item with
   # a value set to the name of a .tmp file in /home/httpd/perl/tmp
   # containing the url to display after authentication, and also,
   # optionally, role and symb, or linkprot or linkkey (deep-link access).
   #
   # If Shibboleth auth is in use, but a dual log-in page is not in use,
   # and the originally requested URL was /tiny/$domain/$id (i.e.,
   # for deeplinking), then the query string will contain the sso item
   # with a value set to the name of a .tmp file in /home/httpd/perl/tmp
   # containing the url to display after authentication, and also,
   # optionally, linkprot or linkkey (deep-link access).
   #
   # Otherwise the query string may contain role and symb, or if the
   # originally requested URL was /tiny/$domain/$id (i.e. for deeplinking)
   # then the query string may contain a ttoken item with a value set
   # to the name of a .tmp file in /home/httpd/perl/tmp containing either
   # linkprot or linkkey (deep-link access).
   #
   # If deep-linked, i.e., the originally requested URL was /tiny/$domain/$id
   # the linkkey may have originally been sent in POSTed data, which will
   # have been processed in lontrans.pm
   #
   
       if ($form{'ttoken'}) {
           my %info = &Apache::lonnet::tmpget($form{'ttoken'});
           &Apache::lonnet::tmpdel($form{'ttoken'});
           if ($info{'origurl'}) {
               $form{'origurl'} = $info{'origurl'};
               if ($form{'origurl'} =~ m{^/tiny/$match_domain/\w+$}) {
                   $deeplinkurl = $form{'origurl'};
               }
           }
           if ($info{'linkprot'}) {
               $linkprot = $info{'linkprot'};
               $linkprotuser = $info{'linkprotuser'};
               $linkprotexit = $info{'linkprotexit'};
           } elsif ($info{'linkkey'} ne '') {
               $linkkey = $info{'linkkey'};
           }
       } elsif ($form{'logtoken'}) {
           my ($firsturl,@rest);
           my $lonhost = $r->dir_config('lonHostID');
           my $tmpinfo = &Apache::lonnet::reply('tmpget:'.$form{'logtoken'},$lonhost);
           my $delete = &Apache::lonnet::tmpdel($form{'logtoken'});
           unless (($tmpinfo=~/^error/) || ($tmpinfo eq 'con_lost') ||
                   ($tmpinfo eq 'no_such_host')) {
               (undef,$firsturl,@rest) = split(/&/,$tmpinfo);
               if ($firsturl ne '') {
                   $firsturl = &unescape($firsturl);
               }
               foreach my $item (@rest) {
                   my ($key,$value) = split(/=/,$item);
                   $form{$key} = &unescape($value);
               }
               if ($firsturl =~ m{^/tiny/$match_domain/\w+$}) {
                   $form{'origurl'} = $firsturl;
                   $deeplinkurl = $firsturl;
               } elsif ($firsturl eq '/adm/email') {
                   $form{'origurl'} = $firsturl;
               }
               if ($form{'linkprot'}) {
                   $linkprot = $form{'linkprot'};
                   $linkprotuser = $form{'linkprotuser'};
                   $linkprotexit = $form{'linkprotexit'};
               } elsif ($form{'linkkey'} ne '') {
                   $linkkey = $form{'linkkey'};
               }
               if ($form{'iptoken'}) {
                   %sessiondata = &Apache::lonnet::tmpget($form{'iptoken'});
                   my $delete = &Apache::lonnet::tmpdel($form{'iptoken'});
               }
           }
       } elsif ($form{'sso'}) {
           my $lonhost = $r->dir_config('lonHostID');
           my $info = &Apache::lonnet::reply('tmpget:'.$form{'sso'},$lonhost);
           &Apache::lonnet::tmpdel($form{'sso'});
           unless (($info=~/^error/) || ($info eq 'con_lost') ||
                   ($info eq 'no_such_host')) {
               my ($firsturl,@rest)=split(/\&/,$info);
               if ($firsturl ne '') {
                   $form{'origurl'} = &unescape($firsturl);
                   if ($form{'origurl'} =~ m{^/tiny/$match_domain/\w+$}) {
                       $deeplinkurl = $form{'origurl'};
                   }
               }
               foreach my $item (@rest) {
                   my ($key,$value) = split(/=/,$item);
                   $form{$key} = &unescape($value);
               }
               if ($form{'linkprot'}) {
                   $linkprot = $form{'linkprot'};
                   $linkprotuser = $form{'linkprotuser'};
                   $linkprotexit = $form{'linkprotexit'};
               } elsif ($form{'linkkey'} ne '') {
                   $linkkey = $form{'linkkey'};
               }
           }
       } elsif ($form{'ltoken'}) {
           my %link_info = &Apache::lonnet::tmpget($form{'ltoken'});
           $linkprot = $link_info{'linkprot'};
           if ($linkprot) {
               if ($link_info{'linkprotuser'} ne '') {
                   $linkprotuser = $link_info{'linkprotuser'};
               }
               if ($link_info{'linkprotexit'} ne '') {
                   $linkprotexit = $link_info{'linkprotexit'};
               }
           }
           my $delete = &Apache::lonnet::tmpdel($form{'ltoken'});
           delete($form{'ltoken'});
           if ($form{'origurl'} =~ m{^/tiny/$match_domain/\w+$}) {
               $deeplinkurl = $form{'origurl'};
           }
       } elsif ($form{'linkkey'} ne '') {
           $linkkey = $form{'linkkey'};
       }
   
     my $domain = $r->dir_config('lonSSOUserDomain');      my $domain = $r->dir_config('lonSSOUserDomain');
     if ($domain eq '') {      if ($domain eq '') {
         $domain = $r->dir_config('lonDefDomain');          $domain = $r->dir_config('lonDefDomain');
     }      }
       if (($deeplinkurl) && ($linkprot) && ($linkprotuser ne '')) {
           unless ($linkprotuser eq $user.':'.$domain) {
               $r->user();
               my %data = (
                              origurl => $deeplinkurl,
                              linkprot => $linkprot,
                              linkprotuser => $linkprotuser,
                              linkprotexit => $linkprotexit,
                          );
               if ($env{'form.lcssowin'}) {
                   $data{'lcssowin'} = $env{'form.lcssowin'};
               }
               my $token = &Apache::lonnet::tmpput(\%data,$r->dir_config('lonHostID'),'link');
               unless (($token eq 'con_lost') || ($token eq 'refused') || ($token =~ /^error:/) ||
                       ($token eq 'unknown_cmd') || ($token eq 'no_such_host')) {
                   $r->internal_redirect('/adm/relaunch?rtoken='.$token);
                   $r->set_handlers('PerlHandler'=> undef);
                   return OK;
               }
           }
       }
     my $home=&Apache::lonnet::homeserver($user,$domain);      my $home=&Apache::lonnet::homeserver($user,$domain);
     if ($home !~ /(con_lost|no_host|no_such_host)/) {      if ($home !~ /(con_lost|no_host|no_such_host)/) {
  &Apache::lonnet::logthis(" SSO authorized user $user ");   &Apache::lonnet::logthis(" SSO authorized user $user ");
Line 349  sub sso_login { Line 501  sub sso_login {
                     my $lowest_load;                      my $lowest_load;
                     ($otherserver,undef,undef,undef,$lowest_load) = &Apache::lonnet::choose_server($domain);                      ($otherserver,undef,undef,undef,$lowest_load) = &Apache::lonnet::choose_server($domain);
                     if ($lowest_load > 100) {                      if ($lowest_load > 100) {
                         $otherserver = &Apache::lonnet::spareserver($lowest_load,$lowest_load,1,$domain);                          $otherserver = &Apache::lonnet::spareserver($r,$lowest_load,$lowest_load,1,$domain);
                     }                      }
                     if ($otherserver ne '') {                      if ($otherserver ne '') {
                         my @hosts = &Apache::lonnet::current_machine_ids();                          my @hosts = &Apache::lonnet::current_machine_ids();
Line 367  sub sso_login { Line 519  sub sso_login {
             foreach my $item (keys(%form)) {              foreach my $item (keys(%form)) {
                 $env{'form.'.$item} = $form{$item};                  $env{'form.'.$item} = $form{$item};
             }              }
             unless ($form{'symb'}) {              unless (($form{'symb'}) || ($form{'origurl'})) {
                 unless (($r->uri eq '/adm/roles') || ($r->uri eq '/adm/sso')) {                  unless (($r->uri eq '/adm/roles') || ($r->uri eq '/adm/sso')) {
                     $env{'form.origurl'} = $r->uri;                      $env{'form.origurl'} = $r->uri;
                 }                  }
             }              }
               if (($r->uri eq '/adm/sso') && ($form{'origurl'} =~ m{^/+tiny/+$match_domain/+\w+$})) {
                   $env{'request.deeplink.login'} = $form{'origurl'};
               } elsif ($r->uri =~ m{^/+tiny/+$match_domain/+\w+$}) {
                   $env{'request.deeplink.login'} = $r->uri;
               }
               if ($env{'request.deeplink.login'}) {
                   if ($linkprot) {
                       $env{'request.linkprot'} = $linkprot;
                       if ($linkprotuser ne '') {
                           $env{'request.linkprotuser'} = $linkprotuser;
                       }
                       if ($linkprotexit ne '') {
                           $env{'request.linkprotexit'} = $linkprotexit;
                       }
                   } elsif ($linkkey ne '') {
                       $env{'request.linkkey'} = $linkkey;
                   }
               }
               if (($r->uri eq '/adm/sso') && ($form{'origurl'} eq '/adm/email')) {
                   if ($form{'display'} && ($env{'form.mailrecip'} eq $user.':'.$domain)) {
                       $env{'request.display'} = $form{'display'};
                       $env{'request.mailrecip'} = $env{'form.mailrecip'};
                   }
               }
             $env{'request.sso.login'} = 1;              $env{'request.sso.login'} = 1;
             if (defined($r->dir_config("lonSSOReloginServer"))) {              if (defined($r->dir_config("lonSSOReloginServer"))) {
                 $env{'request.sso.reloginserver'} =                  $env{'request.sso.reloginserver'} =
Line 381  sub sso_login { Line 557  sub sso_login {
             if ($otherserver ne '') {              if ($otherserver ne '') {
                 $redirecturl .= '?otherserver='.$otherserver;                  $redirecturl .= '?otherserver='.$otherserver;
             }              }
               if ($form{'lcssowin'}) {
                   $redirecturl .= (($redirecturl=~/\?/)?'&':'?') . 'lcssowin=1';
               }
     $r->internal_redirect($redirecturl);      $r->internal_redirect($redirecturl);
     $r->set_handlers('PerlHandler'=> undef);      $r->set_handlers('PerlHandler'=> undef);
  } else {   } else {
Line 393  sub sso_login { Line 572  sub sso_login {
       'server'    => $r->dir_config('lonHostID'),        'server'    => $r->dir_config('lonHostID'),
       'sso.login' => 1        'sso.login' => 1
       );        );
             foreach my $item ('role','symb','iptoken') {              foreach my $item ('role','symb','iptoken','origurl','lcssowin') {
                 if (exists($form{$item})) {                  if (exists($form{$item})) {
                     $info{$item} = $form{$item};                      $info{$item} = $form{$item};
                   } elsif ($sessiondata{$item} ne '') {
                       $info{$item} = $sessiondata{$item};
                 }                  }
             }              }
             unless ($info{'symb'}) {              unless (($info{'symb'}) || ($info{'origurl'})) {
                 unless (($r->uri eq '/adm/roles') || ($r->uri eq '/adm/sso')) {                  unless (($r->uri eq '/adm/roles') || ($r->uri eq '/adm/sso')) {
                     $info{'origurl'} = $r->uri;                       $info{'origurl'} = $r->uri; 
                 }                  }
             }              }
               if (($r->uri eq '/adm/sso') && ($form{'origurl'} =~ m{^/+tiny/+$match_domain/+\w+$})) {
                   $info{'deeplink.login'} = $form{'origurl'};
               } elsif ($r->uri =~ m{^/+tiny/+$match_domain/+\w+$}) {
                   $info{'deeplink.login'} = $r->uri;
               }
               if ($info{'deeplink.login'}) {
                   if ($linkprot) {
                       $info{'linkprot'} = $linkprot;
                       if ($linkprotuser ne '') {
                           $info{'linkprotuser'} = $linkprotuser;
                       }
                       if ($linkprotexit ne '') {
                           $info{'linkprotexit'} = $linkprotexit;
                       }
                   } elsif ($linkkey ne '') {
                       $info{'linkkey'} = $linkkey;
                   }
               }
               if (($r->uri eq '/adm/sso') && ($form{'origurl'} eq '/adm/email')) {
                   if ($form{'display'} && ($form{'mailrecip'} eq $user.':'.$domain)) {
                       $info{'display'} = &escape($form{'display'});
                       $info{'mailrecip'} = &escape($form{'mailrecip'});
                   }
               }
             if ($r->dir_config("ssodirecturl") == 1) {              if ($r->dir_config("ssodirecturl") == 1) {
                 $info{'origurl'} = $r->uri;                  $info{'origurl'} = $r->uri;
             }              }
Line 413  sub sso_login { Line 618  sub sso_login {
             if (($is_balancer) && ($hosthere)) {              if (($is_balancer) && ($hosthere)) {
                 $info{'noloadbalance'} = $hosthere;                  $info{'noloadbalance'} = $hosthere;
             }              }
     my $token =       my $token = &Apache::lonnet::tmpput(\%info,$r->dir_config('lonHostID'),'sso');
  &Apache::lonnet::tmpput(\%info,  
  $r->dir_config('lonHostID'));  
     $env{'form.token'} = $token;      $env{'form.token'} = $token;
     $r->internal_redirect('/adm/migrateuser');      $r->internal_redirect('/adm/migrateuser');
     $r->set_handlers('PerlHandler'=> undef);      $r->set_handlers('PerlHandler'=> undef);
Line 440  sub sso_login { Line 643  sub sso_login {
             $r->subprocess_env->set('SSOUserUnknown' => $user);              $r->subprocess_env->set('SSOUserUnknown' => $user);
             $r->subprocess_env->set('SSOUserDomain' => $domain);              $r->subprocess_env->set('SSOUserDomain' => $domain);
             if (grep(/^sso$/,@cancreate)) {              if (grep(/^sso$/,@cancreate)) {
   #FIXME - need to preserve origurl, role and symb, or linkprot or linkkey for use after account
   # creation. If lcssowin is 1, createaccount needs to close pop-up and display in main window.
                 $r->set_handlers('PerlHandler'=> [\&Apache::createaccount::handler]);                  $r->set_handlers('PerlHandler'=> [\&Apache::createaccount::handler]);
                 $r->handler('perl-script');                  $r->handler('perl-script');
             } else {              } else {
Line 479  sub handler { Line 684  sub handler {
     if ($handle eq '') {      if ($handle eq '') {
         unless ((($requrl eq '/adm/switchserver') && (!$r->is_initial_req())) ||          unless ((($requrl eq '/adm/switchserver') && (!$r->is_initial_req())) ||
                 ($requrl =~ m{^/public/$match_domain/$match_courseid/syllabus}) ||                  ($requrl =~ m{^/public/$match_domain/$match_courseid/syllabus}) ||
                 ($requrl =~ m{^/adm/help/}) ||                  ($requrl =~ m{^/adm/help/}) || ($requrl eq '/adm/sso') ||
                 ($requrl =~ m{^/res/$match_domain/$match_username/})) {                  ($requrl =~ m{^/res/$match_domain/$match_username/})) {
     $r->log_reason("Cookie not valid", $r->filename);      $r->log_reason("Cookie not valid", $r->filename);
         }          }
Line 559  sub handler { Line 764  sub handler {
             my $hostname = $r->hostname();              my $hostname = $r->hostname();
             my $lonhost = &Apache::lonnet::host_from_dns($hostname);              my $lonhost = &Apache::lonnet::host_from_dns($hostname);
             if ($lonhost) {              if ($lonhost) {
                 my $actual = &Apache::lonnet::absolute_url($hostname);                  my $actual = &Apache::lonnet::absolute_url($hostname,1,1);
                 my $exphostname = &Apache::lonnet::hostname($lonhost);                  my $exphostname = &Apache::lonnet::hostname($lonhost);
                 my $expected = $Apache::lonnet::protocol{$lonhost}.'://'.$hostname;                  my $expected = $Apache::lonnet::protocol{$lonhost}.'://'.$hostname;
                 unless ($actual eq $expected) {                  unless ($actual eq $expected) {
Line 592  sub handler { Line 797  sub handler {
                 if (($found_server) && ($balancer_cookie =~ /^\Q$env{'user.domain'}\E_\Q$env{'user.name'}\E_/)) {                  if (($found_server) && ($balancer_cookie =~ /^\Q$env{'user.domain'}\E_\Q$env{'user.name'}\E_/)) {
                     $otherserver = $found_server;                      $otherserver = $found_server;
                 }                  }
                 unless ($requrl eq '/adm/switchserver') {                   unless ($requrl eq '/adm/switchserver') {
                     $r->set_handlers('PerlResponseHandler'=>                      $r->set_handlers('PerlResponseHandler'=>
                                      [\&Apache::switchserver::handler]);                                       [\&Apache::switchserver::handler]);
                 }                  }
Line 606  sub handler { Line 811  sub handler {
             }              }
         }          }
         if ($requrl=~m{^/+tiny/+$match_domain/+\w+$}) {          if ($requrl=~m{^/+tiny/+$match_domain/+\w+$}) {
               if ($r->args) {
                   &Apache::loncommon::get_unprocessed_cgi($r->args,['ttoken']);
                   if (defined($env{'form.ttoken'})) {
                       my %info = &Apache::lonnet::tmpget($env{'form.ttoken'});
                       if (($info{'origurl'} ne '') && ($info{'origurl'} eq $requrl)) {
                           my %data;
                           if (($info{'linkprotuser'} ne '') && ($info{'linkprot'}) &&
                               ($info{'linkprotuser'} ne $env{'user.name'}.':'.$env{'user.domain'})) {
                               %data = (
                                   origurl => $requrl,
                                   linkprot => $info{'linkprot'},
                                   linkprotuser => $info{'linkprotuser'},
                                   linkprotexit => $info{'linkprotexit'},
                               );
                           } elsif ($info{'ltoken'} ne '') {
                               my %ltoken_info = &Apache::lonnet::tmpget($info{'ltoken'});
                               if (($ltoken_info{'linkprotuser'} ne '') && ($ltoken_info{'linkprot'}) &&
                                   ($ltoken_info{'linkprotuser'} ne $env{'user.name'}.':'.$env{'user.domain'})) {
                                   %data = (
                                       origurl => $requrl,
                                       linkprot => $ltoken_info{'linkprot'},
                                       linkprotuser => $ltoken_info{'linkprotuser'},
                                       linkprotexit => $ltoken_info{'linkprotexit'},
                                   );
                               }
                           }
                           if (keys(%data)) {
                               my $delete = &Apache::lonnet::tmpdel($env{'form.ttoken'});
                               if ($info{'ltoken'} ne '') {
                                   my $delete = &Apache::lonnet::tmpdel($info{'ltoken'});
                               }
                               my $token =
                                   &Apache::lonnet::tmpput(\%data,$r->dir_config('lonHostID'),'retry');
                               unless (($token eq 'con_lost') || ($token eq 'refused') || ($token =~ /^error:/) ||
                                       ($token eq 'unknown_cmd') || ($token eq 'no_such_host')) {
                                   $r->internal_redirect('/adm/relaunch?rtoken='.$token);
                                   $r->set_handlers('PerlHandler'=> undef);
                                   return OK;
                               }
                           }
                       }
                   }
               }
             if ($env{'user.name'} eq 'public' &&              if ($env{'user.name'} eq 'public' &&
                 $env{'user.domain'} eq 'public') {                  $env{'user.domain'} eq 'public') {
                 $env{'request.firsturl'}=$requrl;                  $env{'request.firsturl'}=$requrl;
                 return FORBIDDEN;                  return FORBIDDEN;
             } else {  
                 return OK;  
             }              }
               return OK;
         }          }
 # ---------------------------------------------------------------- Check access  # ---------------------------------------------------------------- Check access
  my $now = time;   my $now = time;
         my ($check_symb,$check_access);          my ($check_symb,$check_access,$check_block,$access,$poss_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) {
             $check_access = 1;              $check_access = 1;
         }          }
           if ((!$check_access) && ($env{'request.course.id'})) {
               if (($requrl eq '/adm/viewclasslist') ||
                   ($requrl =~ m{^(/adm/wrapper|)\Q/uploaded/$cdom/$cnum/docs/\E}) ||
                   ($requrl =~ m{^/adm/.*/aboutme$}) ||
                   ($requrl=~m{^/adm/coursedocs/showdoc/}) ||
                   ($requrl=~m{^(/adm/wrapper|)/adm/$cdom/$cnum/\d+/ext\.tool$})) {
                   $check_block = 1;
               }
           }
         if (($env{'request.course.id'}) && (!$suppext)) {          if (($env{'request.course.id'}) && (!$suppext)) {
             $requrl=~/\.(\w+)$/;              $requrl=~/\.(\w+)$/;
             if ((&Apache::loncommon::fileembstyle($1) eq 'ssi') ||              if ((&Apache::loncommon::fileembstyle($1) eq 'ssi') ||
Line 635  sub handler { Line 891  sub handler {
                 $check_symb = 1;                  $check_symb = 1;
             }              }
         }          }
         if ($check_access) {          if (($check_access) || ($check_block)) {
             my ($access,$poss_symb);  
             if ($check_symb) {              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'});
Line 656  sub handler { Line 911  sub handler {
                 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);
                     $url = &Apache::lonnet::clutter($url);                      $url = &Apache::lonnet::clutter($url);
                     unless (($url eq $requrl) && (&Apache::lonnet::is_on_map($possmap))) {                      my $toplevelmap = $env{'course.'.$env{'request.course.id'}.'.url'};
                       unless (($url eq $requrl) && (($possmap eq $toplevelmap) ||
                                                     (&Apache::lonnet::is_on_map($possmap)))) {
                         undef($poss_symb);                          undef($poss_symb);
                     }                      }
                     if ($poss_symb) {                      if ($poss_symb) {
                         if ((!$env{'request.role.adv'}) && ($env{'acc.randomout'}) &&                          if ((!$env{'request.role.adv'}) && ($env{'acc.randomout'}) &&
                             ($env{'acc.randomout'}=~/\&\Q$poss_symb\E\&/)) {                              ($env{'acc.randomout'}=~/\&\Q$poss_symb\E\&/)) {
                             undef($poss_symb);                              undef($poss_symb);
                           } elsif ((!$env{'request.role.adv'}) && ($env{'acc.deeplinkout'}) &&
                                    ($env{'acc.deeplinkout'}=~/\&\Q$poss_symb\E\&/)) {
                               undef($poss_symb);
                         }                          }
                     }                      }
                 }                  }
Line 672  sub handler { Line 932  sub handler {
                     $access=&Apache::lonnet::allowed('bre',$requrl,'','','','',1);                      $access=&Apache::lonnet::allowed('bre',$requrl,'','','','',1);
                 }                  }
             } else {              } else {
                 $access=&Apache::lonnet::allowed('bre',$requrl);                  my $nodeeplinkcheck;
                   if (($check_access) && ($requrl =~ /\.(sequence|page)$/)) {
                       unless ($env{'form.navmap'}) {
                           if ($r->args ne '') {
                               &Apache::loncommon::get_unprocessed_cgi($r->args,['navmap']);
                               unless ($env{'form.navmap'}) {
                                   $nodeeplinkcheck = 1;
                               }
                           }
                       }
                   }
                   my $clientip = &Apache::lonnet::get_requestor_ip($r);
                   $access=&Apache::lonnet::allowed('bre',$requrl,'','',$clientip,'','',$nodeeplinkcheck);
             }              }
           }
           if ($check_block) {
               if ($access eq 'B') {
                   if ($poss_symb) {
                       if (&Apache::lonnet::symbverify($poss_symb,$requrl)) {
                           $env{'request.symb'} = $poss_symb;
                       }
                   }
                   &Apache::blockedaccess::setup_handler($r);
                   return OK;
               }
           } elsif ($check_access) {
             if ($handle eq '') {              if ($handle eq '') {
                 unless ($access eq 'F') {                  unless ($access eq 'F') {
                     if ($requrl =~ m{^/res/$match_domain/$match_username/}) {                      if ($requrl =~ m{^/res/$match_domain/$match_username/}) {
Line 691  sub handler { Line 975  sub handler {
     }      }
             if ($access eq 'B') {              if ($access eq 'B') {
                 if ($poss_symb) {                  if ($poss_symb) {
                     if ($requrl=~m{^(/adm/.*/aboutme)/portfolio$}) {  
                         $requrl = $1;  
                     }  
                     if (&Apache::lonnet::symbverify($poss_symb,$requrl)) {                      if (&Apache::lonnet::symbverify($poss_symb,$requrl)) {
                         $env{'request.symb'} = $poss_symb;                          $env{'request.symb'} = $poss_symb;
                     }                      }
Line 721  sub handler { Line 1002  sub handler {
                         }                          }
                     }                      }
                 } elsif (($handle =~ /^publicuser_\d+$/) && (&Apache::lonnet::is_portfolio_url($requrl))) {                  } elsif (($handle =~ /^publicuser_\d+$/) && (&Apache::lonnet::is_portfolio_url($requrl))) {
                     my $clientip = &Apache::lonnet::get_requestor_ip($r);                       my $clientip = &Apache::lonnet::get_requestor_ip($r);
                     if (&Apache::lonnet::allowed('bre',$requrl,undef,undef,$clientip) ne 'F') {                      if (&Apache::lonnet::allowed('bre',$requrl,undef,undef,$clientip) ne 'F') {
                         $env{'user.error.msg'}="$requrl:bre:1:1:Access Denied";                          $env{'user.error.msg'}="$requrl:bre:1:1:Access Denied";
                         return HTTP_NOT_ACCEPTABLE;                          return HTTP_NOT_ACCEPTABLE;
Line 770  sub handler { Line 1051  sub handler {
  }   }
  if ($env{'form.symb'}) {   if ($env{'form.symb'}) {
     $symb=&Apache::lonnet::symbclean($env{'form.symb'});      $symb=&Apache::lonnet::symbclean($env{'form.symb'});
     if ($requrl eq '/adm/navmaps') {                      if (($requrl eq '/adm/navmaps') ||
                         my ($map,$mid,$murl)=&Apache::lonnet::decode_symb($symb);                          ($requrl =~ m{^/adm/wrapper/}) ||
                         &Apache::lonnet::symblist($map,$murl => [$murl,$mid]);                          ($requrl =~ m{^/adm/coursedocs/showdoc/})) {
     } elsif ($requrl =~ m|^/adm/wrapper/|                          unless (&Apache::lonnet::symbverify($symb,$requrl)) {
  || $requrl =~ m|^/adm/coursedocs/showdoc/|) {                              if (&Apache::lonnet::is_on_map($requrl)) {
  my ($map,$mid,$murl)=&Apache::lonnet::decode_symb($symb);                                  $symb = &Apache::lonnet::symbread($requrl);
                         if ($map =~ /\.page$/) {                                  unless (&Apache::lonnet::symbverify($symb,$requrl)) {
                             my $mapsymb = &Apache::lonnet::symbread($map);                                      undef($symb);
                             ($map,$mid,$murl)=&Apache::lonnet::decode_symb($mapsymb);                                   }
                               }
                           }
                           if ($symb) {
                               if ($requrl eq '/adm/navmaps') {
                                   my ($map,$mid,$murl)=&Apache::lonnet::decode_symb($symb);
                                   &Apache::lonnet::symblist($map,$murl => [$murl,$mid]);
                               } elsif (($requrl =~ m{^/adm/wrapper/}) ||
                                        ($requrl =~ m{^/adm/coursedocs/showdoc/})) {
                                   my ($map,$mid,$murl)=&Apache::lonnet::decode_symb($symb);
                                   if ($map =~ /\.page$/) {
                                       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]);  
     } elsif ((&Apache::lonnet::symbverify($symb,$requrl)) ||      } elsif ((&Apache::lonnet::symbverify($symb,$requrl)) ||
      (($requrl=~m|(.*)/smpedit$|) &&       (($requrl=~m|(.*)/smpedit$|) &&
       &Apache::lonnet::symbverify($symb,$1)) ||        &Apache::lonnet::symbverify($symb,$1)) ||
Line 841  sub handler { Line 1136  sub handler {
                                 }                                  }
                             }                              }
                             if ($invalidsymb) {                              if ($invalidsymb) {
                                 $r->log_reason('Invalid symb for '.$requrl.': '.$symb);                                  if ($requrl eq '/adm/navmaps') {
                                 $env{'user.error.msg'}=                                      undef($symb);
                                     "$requrl:bre:1:1:Invalid Access";                                  } else {
                                 return HTTP_NOT_ACCEPTABLE;                                      $r->log_reason('Invalid symb for '.$requrl.': '.$symb);
                                       $env{'user.error.msg'}=
                                           "$requrl:bre:1:1:Invalid Access";
                                       return HTTP_NOT_ACCEPTABLE;
                                   }
                             }                              }
                         }                          }
                     }                      }

Removed from v.1.185  
changed lines
  Added in v.1.207


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>