Diff for /loncom/auth/lonacc.pm between versions 1.159.2.21.2.3 and 1.201

version 1.159.2.21.2.3, 2022/08/30 11:58:44 version 1.201, 2021/11/30 15:55:40
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 204  sub get_posted_cgi { Line 203  sub get_posted_cgi {
  $fname='';   $fname='';
  $fmime='';   $fmime='';
     }      }
                       if ($i<$#lines && $lines[$i+1]=~/^Content\-Type\:\s*([\w\-\/]+)/i) {
                           # TODO: something with $1 !
                           $i++;
                       }
                       if ($i<$#lines && $lines[$i+1]=~/^Content\-transfer\-encoding\:\s*([\w\-\/]+)/i) {
                           # TODO: something with $1 !
                           $i++;
                       }
     $i++;      $i++;
  }   }
     } else {      } else {
Line 273  sub upload_size_allowed { Line 280  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 306  sub sso_login { Line 305  sub sso_login {
     my $query = $r->args;      my $query = $r->args;
     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','lcssowin');                       'ltoken','linkkey','logtoken','sso');
         &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 326  sub sso_login { Line 324  sub sso_login {
         }          }
     }      }
   
     my ($linkprot,$linkprotuser,$linkprotexit,$linkkey,$deeplinkurl);      my ($linkprot,$linkkey);
   
 #  #
 # 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 358  sub sso_login { Line 356  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'};  
         } elsif ($info{'linkkey'} ne '') {          } elsif ($info{'linkkey'} ne '') {
             $linkkey = $info{'linkkey'};              $linkkey = $info{'linkkey'};
         }          }
Line 386  sub sso_login { Line 379  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;  
             }              }
             if ($form{'linkprot'}) {              if ($form{'linkprot'}) {
                 $linkprot = $form{'linkprot'};                  $linkprot = $form{'linkprot'};
                 $linkprotuser = $form{'linkprotuser'};  
                 $linkprotexit = $form{'linkprotexit'};  
             } elsif ($form{'linkkey'} ne '') {              } elsif ($form{'linkkey'} ne '') {
                 $linkkey = $form{'linkkey'};                  $linkkey = $form{'linkkey'};
             }              }
Line 409  sub sso_login { Line 399  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 419  sub sso_login { Line 406  sub sso_login {
             }              }
             if ($form{'linkprot'}) {              if ($form{'linkprot'}) {
                 $linkprot = $form{'linkprot'};                  $linkprot = $form{'linkprot'};
                 $linkprotuser = $form{'linkprotuser'};  
                 $linkprotexit = $form{'linkprotexit'};  
             } elsif ($form{'linkkey'} ne '') {              } elsif ($form{'linkkey'} ne '') {
                 $linkkey = $form{'linkkey'};                  $linkkey = $form{'linkkey'};
             }              }
Line 428  sub sso_login { Line 413  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'};  
             }  
         }  
         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 449  sub sso_login { Line 423  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,  
                        );  
             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 523  sub sso_login { Line 476  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;  
                     }  
                 } elsif ($linkkey ne '') {                  } elsif ($linkkey ne '') {
                     $env{'request.linkkey'} = $linkkey;                      $env{'request.linkkey'} = $linkkey;
                 }                  }
Line 542  sub sso_login { Line 489  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 {
     # need to login them in, so generate the need data that      # need to login them in, so generate the need data that
     # migrate expects to do login      # migrate expects to do login
             my $ip = &Apache::lonnet::get_requestor_ip($r);      my $ip = &Apache::lonnet::get_requestor_ip($r);
     my %info=('ip'        => $ip,      my %info=('ip'        => $ip,
       'domain'    => $domain,        'domain'    => $domain,
       'username'  => $user,        'username'  => $user,
       'server'    => $r->dir_config('lonHostID'),        'server'    => $r->dir_config('lonHostID'),
       'sso.login' => 1        'sso.login' => 1
       );        );
             foreach my $item ('role','symb','iptoken','origurl','lcssowin') {              foreach my $item ('role','symb','iptoken','origurl') {
                 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 577  sub sso_login { Line 521  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;  
                     }  
                 } elsif ($linkkey ne '') {                  } elsif ($linkkey ne '') {
                     $info{'linkkey'} = $linkkey;                      $info{'linkkey'} = $linkkey;
                 }                  }
Line 597  sub sso_login { Line 535  sub sso_login {
             if (($is_balancer) && ($hosthere)) {              if (($is_balancer) && ($hosthere)) {
                 $info{'noloadbalance'} = $hosthere;                  $info{'noloadbalance'} = $hosthere;
             }              }
     my $token = &Apache::lonnet::tmpput(\%info,$r->dir_config('lonHostID'),'sso');      my $token = 
    &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 623  sub sso_login { Line 563  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. If lcssowin is 1, createaccount needs to close pop-up and display in main window.  # creation
                 $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 721  sub handler { Line 661  sub handler {
             }              }
         } elsif ($env{'request.course.id'} &&          } elsif ($env{'request.course.id'} &&
                  (($requrl =~ m{^/adm/$match_domain/$match_username/aboutme$}) ||                   (($requrl =~ m{^/adm/$match_domain/$match_username/aboutme$}) ||
                   ($requrl =~ m{^/public/$cdom/$cnum/syllabus$}))) {                    ($requrl eq "/public/$cdom/$cnum/syllabus") ||
                     ($requrl =~ m{^/adm/$cdom/$cnum/\d+/ext\.tool$}))) {
             my $query = $r->args;              my $query = $r->args;
             if ($query) {              if ($query) {
                 foreach my $pair (split(/&/,$query)) {                  foreach my $pair (split(/&/,$query)) {
Line 743  sub handler { Line 684  sub handler {
             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,1,1);                  my $actual = &Apache::lonnet::absolute_url($hostname,1,1);
                   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) {
                     $env{'request.use_absolute'} = $expected;                      $env{'request.use_absolute'} = $expected;
Line 788  sub handler { Line 730  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;
Line 934  sub handler { Line 834  sub handler {
                 &Apache::blockedaccess::setup_handler($r);                  &Apache::blockedaccess::setup_handler($r);
                 return OK;                  return OK;
             }              }
         } elsif ($check_access) {           } 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 1134  sub handler { Line 1034  sub handler {
                                 my $mapsymb = &Apache::lonnet::symbread($map);                                  my $mapsymb = &Apache::lonnet::symbread($map);
                                 ($map,$mid,$murl)=&Apache::lonnet::decode_symb($mapsymb);                                  ($map,$mid,$murl)=&Apache::lonnet::decode_symb($mapsymb);
                             }                              }
                             &Apache::lonnet::symblist($map,$murl =>[$murl,$mid],      &Apache::lonnet::symblist($map,$murl =>[$murl,$mid],
                                                       'last_known' =>[$murl,$mid]);        'last_known' =>[$murl,$mid]);
                         }                          }
     }      }
  }   }
Line 1188  sub handler { Line 1088  sub handler {
 # ------------------------------------ See if this is a viewable portfolio file  # ------------------------------------ See if this is a viewable portfolio file
     if (&Apache::lonnet::is_portfolio_url($requrl)) {      if (&Apache::lonnet::is_portfolio_url($requrl)) {
         my $clientip = &Apache::lonnet::get_requestor_ip($r);          my $clientip = &Apache::lonnet::get_requestor_ip($r);
  my $access=&Apache::lonnet::allowed('bre',$requrl,undef,undef,$clientip);          my $access=&Apache::lonnet::allowed('bre',$requrl,undef,undef,$clientip);
  if ($access eq 'A') {   if ($access eq 'A') {
     &Apache::restrictedaccess::setup_handler($r);      &Apache::restrictedaccess::setup_handler($r);
     return OK;      return OK;

Removed from v.1.159.2.21.2.3  
changed lines
  Added in v.1.201


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