Diff for /loncom/auth/lonacc.pm between versions 1.149 and 1.167

version 1.149, 2013/12/13 02:10:27 version 1.167, 2017/05/08 22:47:01
Line 109  sub cleanup { Line 109  sub cleanup {
     my ($r)=@_;      my ($r)=@_;
     if (! $r->is_initial_req()) { return DECLINED; }      if (! $r->is_initial_req()) { return DECLINED; }
     &Apache::lonnet::save_cache();      &Apache::lonnet::save_cache();
     &Apache::lontexconvert::jsMath_reset();  
     return OK;      return OK;
 }  }
   
Line 160  sub get_posted_cgi { Line 159  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$/i) {
                           $value=~s/[\r\n]$//;
                     }                      }
                     if (ref($fields) eq 'ARRAY') {                      if (ref($fields) eq 'ARRAY') {
                         next if (!grep(/^\Q$name\E$/,@{$fields}));                          next if (!grep(/^\Q$name\E$/,@{$fields}));
Line 201  sub get_posted_cgi { Line 202  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 264  sub upload_size_allowed { Line 273  sub upload_size_allowed {
 =item sso_login()  =item sso_login()
   
  handle the case of the single sign on user, at this point $r->user    handle the case of the single sign on user, at this point $r->user 
  will be set and valid now need to find the loncapa user info, and possibly   will be set and valid; now need to find the loncapa user info, and possibly
  balance them. If $r->user() is set this means either it was either set by   balance them. If $r->user() is set this means either it was either set by
         SSO or by checkauthen.pm if a valid cookie was found. The latter case can          SSO or by checkauthen.pm, if a valid cookie was found. The latter case can
         be identified by the third arg ($usename).          be identified by the third arg ($usename), except when lonacc is called in 
           an internal redirect to /adm/switchserver (e.g., load-balancing following
           successful authentication) -- no cookie set yet.  For that particular case
           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.
Line 278  sub sso_login { Line 290  sub sso_login {
     my ($r,$handle,$username) = @_;      my ($r,$handle,$username) = @_;
   
     my $lonidsdir=$r->dir_config('lonIDsDir');      my $lonidsdir=$r->dir_config('lonIDsDir');
     if (($r->user eq '') || ($username ne '') ||      if (($r->user eq '') || ($username ne '') || ($r->user eq 'public:public') ||
         (defined($env{'user.name'}) && (defined($env{'user.domain'}))          (defined($env{'user.name'}) && (defined($env{'user.domain'}))
   && ($handle ne ''))) {    && ($handle ne ''))) {
  # not an SSO case or already logged in   # not an SSO case or already logged in
  return undef;   return undef;
     }      }
   
     my ($user) = ($r->user =~ m/([a-zA-Z0-9_\-@.]*)/);      my ($user) = ($r->user =~ m/^($match_username)$/);
       if ($user eq '') {
           return undef;
       }
   
     my $query = $r->args;      my $query = $r->args;
     my %form;      my %form;
Line 302  sub sso_login { Line 317  sub sso_login {
     my %sessiondata;      my %sessiondata;
     if ($form{'iptoken'}) {      if ($form{'iptoken'}) {
         %sessiondata = &Apache::lonnet::tmpget($form{'iptoken'});          %sessiondata = &Apache::lonnet::tmpget($form{'iptoken'});
         my $delete = &Apache::lonnet::tmpdel($form{'token'});          my $delete = &Apache::lonnet::tmpdel($form{'iptoken'});
           unless ($sessiondata{'sessionserver'}) {
               delete($form{'iptoken'});
           }
     }      }
   
     my $domain = $r->dir_config('lonSSOUserDomain');      my $domain = $r->dir_config('lonSSOUserDomain');
Line 314  sub sso_login { Line 332  sub sso_login {
  &Apache::lonnet::logthis(" SSO authorized user $user ");   &Apache::lonnet::logthis(" SSO authorized user $user ");
         my ($is_balancer,$otherserver,$hosthere);          my ($is_balancer,$otherserver,$hosthere);
         if ($form{'iptoken'}) {          if ($form{'iptoken'}) {
             if (($sessiondata{'domain'} eq $form{'udom'}) &&              if (($sessiondata{'domain'} eq $domain) &&
                 ($sessiondata{'username'} eq $form{'uname'})) {                  ($sessiondata{'username'} eq $user)) {
                 $hosthere = 1;                  $hosthere = 1;
             }              }
         }          }
         unless ($hosthere) {          unless ($hosthere) {
             ($is_balancer,$otherserver) =              ($is_balancer,$otherserver) =
                 &Apache::lonnet::check_loadbalancing($user,$domain);                  &Apache::lonnet::check_loadbalancing($user,$domain,'login');
               if ($is_balancer) {
                   if ($otherserver eq '') {
                       my $lowest_load;
                       ($otherserver,undef,undef,undef,$lowest_load) = &Apache::lonnet::choose_server($domain);
                       if ($lowest_load > 100) {
                           $otherserver = &Apache::lonnet::spareserver($lowest_load,$lowest_load,1,$domain);
                       }
                   }
                   if ($otherserver ne '') {
                       my @hosts = &Apache::lonnet::current_machine_ids();
                       if (grep(/^\Q$otherserver\E$/,@hosts)) {
                           $hosthere = $otherserver;
                       }
                   }
               }
         }          }
    if (($is_balancer) && (!$hosthere)) {
  if ($is_balancer) {  
     # login but immediately go to switch server to find us a new       # login but immediately go to switch server to find us a new 
     # machine      # machine
     &Apache::lonauth::success($r,$user,$domain,$home,'noredirect');      &Apache::lonauth::success($r,$user,$domain,$home,'noredirect');
Line 342  sub sso_login { Line 374  sub sso_login {
  } 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;      my $ip = $r->get_remote_host();
     my $c = $r->connection;  
     eval {  
         $ip = $c->remote_ip();  
     };  
     if ($@) {  
         $ip = $c->client_ip();  
     }  
     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') {              foreach my $item ('role','symb','iptoken') {
                 if (exists($form{$item})) {                  if (exists($form{$item})) {
                     $info{$item} = $form{$item};                      $info{$item} = $form{$item};
                 }                  }
             }              }
               unless ($info{'symb'}) {
                   unless (($r->uri eq '/adm/roles') || ($r->uri eq '/adm/sso')) {
                       $info{'origurl'} = $r->uri; 
                   }
               }
             if ($r->dir_config("ssodirecturl") == 1) {              if ($r->dir_config("ssodirecturl") == 1) {
                 $info{'origurl'} = $r->uri;                  $info{'origurl'} = $r->uri;
             }              }
Line 368  sub sso_login { Line 398  sub sso_login {
                 $info{'sso.reloginserver'} =                   $info{'sso.reloginserver'} = 
                     $r->dir_config('lonSSOReloginServer');                       $r->dir_config('lonSSOReloginServer'); 
             }              }
               if (($is_balancer) && ($hosthere)) {
                   $info{'noloadbalance'} = $hosthere;
               }
     my $token =       my $token = 
  &Apache::lonnet::tmpput(\%info,   &Apache::lonnet::tmpput(\%info,
  $r->dir_config('lonHostID'));   $r->dir_config('lonHostID'));
Line 376  sub sso_login { Line 409  sub sso_login {
     $r->set_handlers('PerlHandler'=> undef);      $r->set_handlers('PerlHandler'=> undef);
  }   }
  return OK;   return OK;
     } elsif (defined($r->dir_config('lonSSOUserUnknownRedirect'))) {      } else {
  &Apache::lonnet::logthis(" SSO authorized unknown user $user ");   &Apache::lonnet::logthis(" SSO authorized unknown user $user ");
         $r->subprocess_env->set('SSOUserUnknown' => $user);  
         $r->subprocess_env->set('SSOUserDomain' => $domain);  
         my @cancreate;          my @cancreate;
         my %domconfig =          my %domconfig =
             &Apache::lonnet::get_dom('configuration',['usercreation'],$domain);              &Apache::lonnet::get_dom('configuration',['usercreation'],$domain);
Line 393  sub sso_login { Line 424  sub sso_login {
                 }                  }
             }              }
         }          }
         if (grep(/^sso$/,@cancreate)) {          if ((grep(/^sso$/,@cancreate)) || (defined($r->dir_config('lonSSOUserUnknownRedirect')))) {
             $r->internal_redirect('/adm/createaccount');              $r->subprocess_env->set('SSOUserUnknown' => $user);
         } else {              $r->subprocess_env->set('SSOUserDomain' => $domain);
     $r->internal_redirect($r->dir_config('lonSSOUserUnknownRedirect'));              if (grep(/^sso$/,@cancreate)) {
                   $r->set_handlers('PerlHandler'=> [\&Apache::createaccount::handler]);
                   $r->handler('perl-script');
               } else {
           $r->internal_redirect($r->dir_config('lonSSOUserUnknownRedirect'));
                   $r->set_handlers('PerlHandler'=> undef);
               }
       return OK;
         }          }
  $r->set_handlers('PerlHandler'=> undef);  
  return OK;  
     }      }
     return undef;      return undef;
 }  }
Line 419  sub handler { Line 455  sub handler {
     my %user;      my %user;
     my $handle = &Apache::lonnet::check_for_valid_session($r,undef,\%user);      my $handle = &Apache::lonnet::check_for_valid_session($r,undef,\%user);
   
     my $result = &sso_login($r,$handle,$user{'name'});      unless (($requrl eq '/adm/switchserver') && (!$r->is_initial_req())) {
     if (defined($result)) {          my $result = &sso_login($r,$handle,$user{'name'});
  return $result;          if (defined($result)) {
       return $result;
           }
     }      }
   
     my ($is_balancer,$otherserver);      my ($is_balancer,$otherserver);
   
     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{^/adm/help/}) ||
                   ($requrl =~ m{^/res/$match_domain/$match_username/})) {
     $r->log_reason("Cookie not valid", $r->filename);      $r->log_reason("Cookie not valid", $r->filename);
         }          }
     } elsif ($handle ne '') {      } elsif ($handle ne '') {
Line 458  sub handler { Line 499  sub handler {
  }   }
  $env{'request.filename'} = $r->filename;   $env{'request.filename'} = $r->filename;
  $env{'request.noversionuri'} = &Apache::lonnet::deversion($requrl);   $env{'request.noversionuri'} = &Apache::lonnet::deversion($requrl);
         my $suppext;          my ($suppext,$checkabsolute);
         if ($requrl =~ m{^/adm/wrapper/ext/}) {          if ($requrl =~ m{^/adm/wrapper/ext/}) {
             my $query = $r->args;              my $query = $r->args;
             if ($query) {              if ($query) {
Line 479  sub handler { Line 520  sub handler {
                     $env{'request.external.querystring'} = $preserved;                      $env{'request.external.querystring'} = $preserved;
                 }                  }
             }              }
               if ($env{'request.course.id'}) {
                   $checkabsolute = 1;
               }
         } 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 493  sub handler { Line 538  sub handler {
                     }                      }
                 }                  }
             }              }
               if ($requrl =~ m{^/public/$cdom/$cnum/syllabus$}) {
                   $checkabsolute = 1;
               }
           }
           if ($checkabsolute) {
               my $hostname = $r->hostname();
               my $lonhost = &Apache::lonnet::host_from_dns($hostname);
               if ($lonhost) {
                   my $actual = &Apache::lonnet::absolute_url($hostname);
                   my $expected = $Apache::lonnet::protocol{$lonhost}.'://'.$hostname;
                   unless ($actual eq $expected) {
                       $env{'request.use_absolute'} = $expected;
                   }
               }
         }          }
 # -------------------------------------------------------- Load POST parameters  # -------------------------------------------------------- Load POST parameters
   
Line 520  sub handler { Line 579  sub handler {
             if ($otherserver ne '') {              if ($otherserver ne '') {
                 $env{'form.otherserver'} = $otherserver;                  $env{'form.otherserver'} = $otherserver;
             }              }
               unless (($env{'form.origurl'}) || ($r->uri eq '/adm/roles') ||
                       ($r->uri eq '/adm/switchserver') || ($r->uri eq '/adm/sso')) {
                   $env{'form.origurl'} = $r->uri;
               }
         }          }
   
 # ---------------------------------------------------------------- Check access  # ---------------------------------------------------------------- Check access
Line 527  sub handler { Line 590  sub handler {
  if ($requrl !~ m{^/(?:adm|public|prtspool)/}   if ($requrl !~ m{^/(?:adm|public|prtspool)/}
     || $requrl =~ /^\/adm\/.*\/(smppg|bulletinboard)(\?|$ )/x) {      || $requrl =~ /^\/adm\/.*\/(smppg|bulletinboard)(\?|$ )/x) {
     my $access=&Apache::lonnet::allowed('bre',$requrl);      my $access=&Apache::lonnet::allowed('bre',$requrl);
               if ($handle eq '') {
                   unless ($access eq 'F') {
                       if ($requrl =~ m{^/res/$match_domain/$match_username/}) {
                           $r->log_reason("Cookie not valid", $r->filename);
                       }
                   }
               }
     if ($access eq '1') {      if ($access eq '1') {
  $env{'user.error.msg'}="$requrl:bre:0:0:Choose Course";   $env{'user.error.msg'}="$requrl:bre:0:0:Choose Course";
  return HTTP_NOT_ACCEPTABLE;    return HTTP_NOT_ACCEPTABLE; 
Line 554  sub handler { Line 624  sub handler {
                             return HTTP_NOT_ACCEPTABLE;                              return HTTP_NOT_ACCEPTABLE;
                         }                          }
                     }                      }
                   } elsif (($handle =~ /^publicuser_\d+$/) && (&Apache::lonnet::is_portfolio_url($requrl))) {
                       my $clientip = $r->get_remote_host();
                       if (&Apache::lonnet::allowed('bre',$requrl,undef,undef,$clientip) ne 'F') {
                           $env{'user.error.msg'}="$requrl:bre:1:1:Access Denied";
                           return HTTP_NOT_ACCEPTABLE;
                       }
                 } else {                  } else {
     $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 598  sub handler { Line 674  sub handler {
  ($requrl=~m|\.problem/smpedit$|) ||   ($requrl=~m|\.problem/smpedit$|) ||
  ($requrl=~/^\/public\/.*\/syllabus$/) ||   ($requrl=~/^\/public\/.*\/syllabus$/) ||
                 ($requrl=~/^\/adm\/(viewclasslist|navmaps)$/) ||                  ($requrl=~/^\/adm\/(viewclasslist|navmaps)$/) ||
                 ($requrl=~/^\/adm\/.*\/aboutme\/portfolio(\?|$)/)) {                  ($requrl=~/^\/adm\/.*\/aboutme\/portfolio(\?|$)/) ||
                   ($requrl=~m{^/adm/$cdom/$cnum/\d+/ext\.tool$})) {
 # ------------------------------------- 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 692  sub handler { Line 769  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 $access=&Apache::lonnet::allowed('bre',$requrl);          my $clientip = $r->get_remote_host();
           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.149  
changed lines
  Added in v.1.167


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