Diff for /loncom/auth/lonacc.pm between versions 1.202 and 1.210

version 1.202, 2021/12/07 23:19:00 version 1.210, 2023/08/28 20:40:00
Line 281  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 307  sub sso_login { Line 315  sub sso_login {
     my %form;      my %form;
     if ($query) {      if ($query) {
         my @items = ('role','symb','iptoken','origurl','ttoken',          my @items = ('role','symb','iptoken','origurl','ttoken',
                      'ltoken','linkkey','logtoken','sso');                       '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 325  sub sso_login { Line 333  sub sso_login {
         }          }
     }      }
   
     my ($linkprot,$linkkey);      my ($linkprot,$linkprotuser,$linkprotexit,$linkkey,$deeplinkurl,
           $linkprotpbid,$linkprotpburl);
   
 #  #
 # If Shibboleth auth is in use, and a dual SSO and non-SSO login page  # If Shibboleth auth is in use, and a dual SSO and non-SSO login page
Line 357  sub sso_login { Line 366  sub sso_login {
         &Apache::lonnet::tmpdel($form{'ttoken'});          &Apache::lonnet::tmpdel($form{'ttoken'});
         if ($info{'origurl'}) {          if ($info{'origurl'}) {
             $form{'origurl'} = $info{'origurl'};              $form{'origurl'} = $info{'origurl'};
               if ($form{'origurl'} =~ m{^/tiny/$match_domain/\w+$}) {
                   $deeplinkurl = $form{'origurl'};
               }
         }          }
         if ($info{'linkprot'}) {          if ($info{'linkprot'}) {
             $linkprot = $info{'linkprot'};              $linkprot = $info{'linkprot'};
               $linkprotuser = $info{'linkprotuser'};
               $linkprotexit = $info{'linkprotexit'};
               $linkprotpbid = $info{'linkprotpbid'};
               $linkprotpburl = $info{'linkprotpburl'};
         } elsif ($info{'linkkey'} ne '') {          } elsif ($info{'linkkey'} ne '') {
             $linkkey = $info{'linkkey'};              $linkkey = $info{'linkkey'};
         }          }
Line 380  sub sso_login { Line 396  sub sso_login {
             }              }
             if ($firsturl =~ m{^/tiny/$match_domain/\w+$}) {              if ($firsturl =~ m{^/tiny/$match_domain/\w+$}) {
                 $form{'origurl'} = $firsturl;                  $form{'origurl'} = $firsturl;
                   $deeplinkurl = $firsturl;
               } elsif ($firsturl eq '/adm/email') {
                   $form{'origurl'} = $firsturl;
             }              }
             if ($form{'linkprot'}) {              if ($form{'linkprot'}) {
                 $linkprot = $form{'linkprot'};                  $linkprot = $form{'linkprot'};
                   $linkprotuser = $form{'linkprotuser'};
                   $linkprotexit = $form{'linkprotexit'};
                   $linkprotpbid = $form{'linkprotpbid'};
                   $linkprotpburl = $form{'linkprotpburl'};
             } elsif ($form{'linkkey'} ne '') {              } elsif ($form{'linkkey'} ne '') {
                 $linkkey = $form{'linkkey'};                  $linkkey = $form{'linkkey'};
             }              }
Line 400  sub sso_login { Line 423  sub sso_login {
             my ($firsturl,@rest)=split(/\&/,$info);              my ($firsturl,@rest)=split(/\&/,$info);
             if ($firsturl ne '') {              if ($firsturl ne '') {
                 $form{'origurl'} = &unescape($firsturl);                  $form{'origurl'} = &unescape($firsturl);
                   if ($form{'origurl'} =~ m{^/tiny/$match_domain/\w+$}) {
                       $deeplinkurl = $form{'origurl'};
                   }
             }              }
             foreach my $item (@rest) {              foreach my $item (@rest) {
                 my ($key,$value) = split(/=/,$item);                  my ($key,$value) = split(/=/,$item);
Line 407  sub sso_login { Line 433  sub sso_login {
             }              }
             if ($form{'linkprot'}) {              if ($form{'linkprot'}) {
                 $linkprot = $form{'linkprot'};                  $linkprot = $form{'linkprot'};
                   $linkprotuser = $form{'linkprotuser'};
                   $linkprotexit = $form{'linkprotexit'};
                   $linkprotpbid = $form{'linkprotpbid'};
                   $linkprotpburl = $form{'linkprotpburl'};
             } elsif ($form{'linkkey'} ne '') {              } elsif ($form{'linkkey'} ne '') {
                 $linkkey = $form{'linkkey'};                  $linkkey = $form{'linkkey'};
             }              }
Line 414  sub sso_login { Line 444  sub sso_login {
     } elsif ($form{'ltoken'}) {      } elsif ($form{'ltoken'}) {
         my %link_info = &Apache::lonnet::tmpget($form{'ltoken'});          my %link_info = &Apache::lonnet::tmpget($form{'ltoken'});
         $linkprot = $link_info{'linkprot'};          $linkprot = $link_info{'linkprot'};
           if ($linkprot) {
               if ($link_info{'linkprotuser'} ne '') {
                   $linkprotuser = $link_info{'linkprotuser'};
               }
               if ($link_info{'linkprotexit'} ne '') {
                   $linkprotexit = $link_info{'linkprotexit'};
               }
               if ($link_info{'linkprotpbid'} ne '') {
                   $linkprotpbid = $link_info{'linkprotpbid'};
               }
               if ($link_info{'linkprotpburl'} ne '') {
                   $linkprotpburl = $link_info{'linkprotpburl'};
               }
           }
         my $delete = &Apache::lonnet::tmpdel($form{'ltoken'});          my $delete = &Apache::lonnet::tmpdel($form{'ltoken'});
         delete($form{'ltoken'});          delete($form{'ltoken'});
           if ($form{'origurl'} =~ m{^/tiny/$match_domain/\w+$}) {
               $deeplinkurl = $form{'origurl'};
           }
     } elsif ($form{'linkkey'} ne '') {      } elsif ($form{'linkkey'} ne '') {
         $linkkey = $form{'linkkey'};          $linkkey = $form{'linkkey'};
     }      }
Line 424  sub sso_login { Line 471  sub sso_login {
     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,
                              linkprotpbid => $linkprotpbid,
                              linkprotpburl => $linkprotpburl,
                          );
               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 477  sub sso_login { Line 547  sub sso_login {
             if ($env{'request.deeplink.login'}) {              if ($env{'request.deeplink.login'}) {
                 if ($linkprot) {                  if ($linkprot) {
                     $env{'request.linkprot'} = $linkprot;                      $env{'request.linkprot'} = $linkprot;
                       if ($linkprotuser ne '') {
                           $env{'request.linkprotuser'} = $linkprotuser;
                       }
                       if ($linkprotexit ne '') {
                           $env{'request.linkprotexit'} = $linkprotexit;
                       }
                       if ($linkprotpbid ne '') {
                           $env{'request.linkprotpbid'} = $linkprotpbid;
                       }
                       if ($linkprotpburl ne '') {
                           $env{'request.linkprotpburl'} = $linkprotpburl;
                       }
                 } elsif ($linkkey ne '') {                  } elsif ($linkkey ne '') {
                     $env{'request.linkkey'} = $linkkey;                      $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 490  sub sso_login { Line 578  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 502  sub sso_login { Line 593  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','origurl') {              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 '') {                  } elsif ($sessiondata{$item} ne '') {
Line 522  sub sso_login { Line 613  sub sso_login {
             if ($info{'deeplink.login'}) {              if ($info{'deeplink.login'}) {
                 if ($linkprot) {                  if ($linkprot) {
                     $info{'linkprot'} = $linkprot;                      $info{'linkprot'} = $linkprot;
                       if ($linkprotuser ne '') {
                           $info{'linkprotuser'} = $linkprotuser;
                       }
                       if ($linkprotexit ne '') {
                           $info{'linkprotexit'} = $linkprotexit;
                       }
                       if ($linkprotpbid ne '') {
                           $info{'linkprotpbid'} = $linkprotpbid;
                       }
                       if ($linkprotpburl ne '') {
                           $info{'linkprotpburl'} = $linkprotpburl;
                       }
                 } elsif ($linkkey ne '') {                  } elsif ($linkkey ne '') {
                     $info{'linkkey'} = $linkkey;                      $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 536  sub sso_login { Line 645  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 564  sub sso_login { Line 671  sub sso_login {
             $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  #FIXME - need to preserve origurl, role and symb, or linkprot or linkkey for use after account
 # creation  # 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 731  sub handler { Line 838  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'},
                                   linkprotpbid => $info{'linkprotpbid'},
                                   linkprotpburl => $info{'linkprotpburl'},
                               );
                           } 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'},
                                       linkprotpbid => $ltoken_info{'linkprotpbid'},
                                       linkprotpburl => $ltoken_info{'linkprotpburl'},
                                   );
                               }
                           }
                           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;
           } elsif (($env{'request.course.id'}) &&
                    (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) &&
                    ($requrl=~m{^(/daxeopen|)(/uploaded/$cdom/$cnum/(?:docs|supplemental)/(?:default|\d+)/\d+/)([^/]+|)$})) {
               my ($daxe,$path,$file) = ($1,$2,$3);
               my $referrer;
               unless ($daxe) {
                   $referrer = $r->headers_in->{'Referer'};
               }
               if (($daxe) || ($referrer =~ m{\Qfile=/daxeopen$path\E})) {
                 return OK;                  return OK;
             }              }
         }          }
Line 811  sub handler { Line 975  sub handler {
                 }                  }
             } else {              } else {
                 my $nodeeplinkcheck;                  my $nodeeplinkcheck;
                 if (($check_access) && ($requrl =~ /\.(sequence|page)$/)) {                  if ($check_access) {
                     unless ($env{'form.navmap'}) {                      if ($requrl =~ m{^/daxeopen/priv/}) {  
                         if ($r->args ne '') {                          $nodeeplinkcheck = 1;
                             &Apache::loncommon::get_unprocessed_cgi($r->args,['navmap']);                      } elsif ($requrl =~ /\.(sequence|page)$/) {
                             unless ($env{'form.navmap'}) {                          unless ($env{'form.navmap'}) {
                                 $nodeeplinkcheck = 1;                              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);                  my $clientip = &Apache::lonnet::get_requestor_ip($r);
                 $access=&Apache::lonnet::allowed('bre',$requrl,'','',$clientip,'','',$nodeeplinkcheck);                  $access=&Apache::lonnet::allowed('bre',$requrl,'','',$clientip,'','',$nodeeplinkcheck);
                   if (($requrl =~ m{^/daxeopen/priv/}) && ($access eq '')) {
                       $env{'request.editurl'}=$requrl;
                   }
             }              }
         }          }
         if ($check_block) {          if ($check_block) {

Removed from v.1.202  
changed lines
  Added in v.1.210


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