Diff for /loncom/auth/lonacc.pm between versions 1.132 and 1.145

version 1.132, 2010/03/17 00:06:14 version 1.145, 2013/09/29 00:49:24
Line 105  use Apache::lonlocal; Line 105  use Apache::lonlocal;
 use Apache::restrictedaccess();  use Apache::restrictedaccess();
 use Apache::blockedaccess();   use Apache::blockedaccess(); 
 use Fcntl qw(:flock);  use Fcntl qw(:flock);
 use LONCAPA;  use LONCAPA qw(:DEFAULT :match);
   
 sub cleanup {  sub cleanup {
     my ($r)=@_;      my ($r)=@_;
Line 156  sub get_posted_cgi { Line 156  sub get_posted_cgi {
  for ($i=0;$i<=$#lines;$i++) {   for ($i=0;$i<=$#lines;$i++) {
     if ($lines[$i]=~/^--\Q$contentsep\E/) {      if ($lines[$i]=~/^--\Q$contentsep\E/) {
  if ($name) {   if ($name) {
     chomp($value);                      chomp($value);
                       if (($r->uri eq '/adm/portfolio') && 
                           ($name eq 'uploaddoc')) {
                           if (length($value) == 1) {
                               $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 269  sub sso_login { Line 275  sub sso_login {
     my ($r,$handle) = @_;      my ($r,$handle) = @_;
   
     my $lonidsdir=$r->dir_config('lonIDsDir');      my $lonidsdir=$r->dir_config('lonIDsDir');
     if (!($r->user       if (($r->user eq '') ||
   && (!defined($env{'user.name'}) && !defined($env{'user.domain'}))          (defined($env{'user.name'}) && (defined($env{'user.domain'}))
   && ($handle eq ''))) {    && ($handle ne ''))) {
  # not an SSO case or already logged in   # not an SSO case or already logged in
  return undef;   return undef;
     }      }
Line 281  sub sso_login { Line 287  sub sso_login {
     my $query = $r->args;      my $query = $r->args;
     my %form;      my %form;
     if ($query) {      if ($query) {
         my @items = ('role','symb');          my @items = ('role','symb','iptoken');
         &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 290  sub sso_login { Line 296  sub sso_login {
         }          }
     }      }
   
     my $domain = $r->dir_config('lonDefDomain');      my %sessiondata;
       if ($form{'iptoken'}) {
           %sessiondata = &Apache::lonnet::tmpget($form{'iptoken'});
           my $delete = &Apache::lonnet::tmpdel($form{'token'});
       }
   
       my $domain = $r->dir_config('lonSSOUserDomain');
       if ($domain eq '') {
           $domain = $r->dir_config('lonDefDomain');
       }
     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 ");
  if ($r->dir_config("lonBalancer") eq 'yes') {          my ($is_balancer,$otherserver,$hosthere);
     # login but immeaditly go to switch server to find us a new           if ($form{'iptoken'}) {
               if (($sessiondata{'domain'} eq $form{'udom'}) &&
                   ($sessiondata{'username'} eq $form{'uname'})) {
                   $hosthere = 1;
               }
           }
           unless ($hosthere) {
               ($is_balancer,$otherserver) =
                   &Apache::lonnet::check_loadbalancing($user,$domain);
           }
   
    if ($is_balancer) {
       # 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');
             $env{'request.sso.login'} = 1;              $env{'request.sso.login'} = 1;
Line 303  sub sso_login { Line 330  sub sso_login {
                 $env{'request.sso.reloginserver'} =                  $env{'request.sso.reloginserver'} =
                     $r->dir_config('lonSSOReloginServer');                      $r->dir_config('lonSSOReloginServer');
             }              }
     $r->internal_redirect('/adm/switchserver');              my $redirecturl = '/adm/switchserver';
               if ($otherserver ne '') {
                   $redirecturl .= '?otherserver='.$otherserver;
               }
       $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
Line 380  sub handler { Line 411  sub handler {
  return $result;   return $result;
     }      }
   
       my ($is_balancer,$otherserver);
   
     if ($r->dir_config("lonBalancer") eq 'yes') {  
  $r->set_handlers('PerlResponseHandler'=>  
  [\&Apache::switchserver::handler]);  
     }  
       
     if ($handle eq '') {      if ($handle eq '') {
  $r->log_reason("Cookie $handle not valid", $r->filename);           unless (($requrl eq '/adm/switchserver') && (!$r->is_initial_req())) {
       $r->log_reason("Cookie $handle not valid", $r->filename);
           }
     } elsif ($handle ne '') {      } elsif ($handle ne '') {
   
 # ------------------------------------------------------ Initialize Environment  # ------------------------------------------------------ Initialize Environment
Line 404  sub handler { Line 433  sub handler {
     if ($env{'user.name'} ne '' && $env{'user.domain'} ne '') {      if ($env{'user.name'} ne '' && $env{'user.domain'} ne '') {
 # -------------------------------------------------------------- Resource State  # -------------------------------------------------------------- Resource State
   
           my ($cdom,$cnum);
           if ($env{'request.course.id'}) {
               $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
               $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           }
  if ($requrl=~/^\/+(res|uploaded)\//) {   if ($requrl=~/^\/+(res|uploaded)\//) {
     $env{'request.state'} = "published";      $env{'request.state'} = "published";
  } else {   } else {
Line 411  sub handler { Line 445  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;
         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 420  sub handler { Line 455  sub handler {
                     unless ($name eq 'symb') {                      unless ($name eq 'symb') {
                         $preserved .= $pair.'&';                          $preserved .= $pair.'&';
                     }                      }
                       if (($env{'request.course.id'}) && ($name eq 'folderpath')) {
                           if ($value =~ /^supplemental/) {
                               $suppext = 1;
                           }
                       }
                 }                  }
                 $preserved =~ s/\&$//;                  $preserved =~ s/\&$//;
                 if ($preserved) {                  if ($preserved) {
                     $env{'request.external.querystring'} = $preserved;                      $env{'request.external.querystring'} = $preserved;
                 }                  }
             }              }
           } elsif ($env{'request.course.id'} &&
                    (($requrl =~ m{^/adm/$match_domain/$match_username/aboutme$}) ||
                     ($requrl =~ m{^/public/$cdom/$cnum/syllabus$}))) {
               my $query = $r->args;
               if ($query) {
                   foreach my $pair (split(/&/,$query)) {
                       my ($name, $value) = split(/=/,$pair);
                       if ($name eq 'folderpath') {
                           if ($value =~ /^supplemental/) {
                               $suppext = 1;
                           }
                       }
                   }
               }
         }          }
 # -------------------------------------------------------- Load POST parameters  # -------------------------------------------------------- Load POST parameters
   
  &Apache::lonacc::get_posted_cgi($r);   &Apache::lonacc::get_posted_cgi($r);
   
   # ------------------------------------------------------ Check if load balancer 
   
           my $checkexempt;
           if ($env{'user.loadbalexempt'} eq $r->dir_config('lonHostID')) {
               if ($env{'user.loadbalcheck.time'} + 600 > time) {
                   $checkexempt = 1;    
               }
           }
           if ($env{'user.noloadbalance'} eq $r->dir_config('lonHostID')) {
               $checkexempt = 1;
           }
           unless ($checkexempt) {
               ($is_balancer,$otherserver) =
                   &Apache::lonnet::check_loadbalancing($env{'user.name'},
                                                        $env{'user.domain'});
           }
           if ($is_balancer) {
               $r->set_handlers('PerlResponseHandler'=>
                                [\&Apache::switchserver::handler]);
               if ($otherserver ne '') {
                   $env{'form.otherserver'} = $otherserver;
               }
           }
   
 # ---------------------------------------------------------------- Check access  # ---------------------------------------------------------------- Check access
  my $now = time;   my $now = time;
  if ($requrl !~ m{^/(?:adm|public|prtspool)/}   if ($requrl !~ m{^/(?:adm|public|prtspool)/}
Line 501  sub handler { Line 579  sub handler {
     $requrl=~/\.(\w+)$/;      $requrl=~/\.(\w+)$/;
             my $query=$r->args;              my $query=$r->args;
     if ((&Apache::loncommon::fileembstyle($1) eq 'ssi') ||      if ((&Apache::loncommon::fileembstyle($1) eq 'ssi') ||
  ($requrl=~/^\/adm\/.*\/(aboutme|navmaps|smppg|bulletinboard)(\?|$ )/x) ||   ($requrl=~/^\/adm\/.*\/(aboutme|smppg|bulletinboard)(\?|$ )/x) ||
  ($requrl=~/^\/adm\/wrapper\//) ||   ($requrl=~/^\/adm\/wrapper\//) ||
  ($requrl=~m|^/adm/coursedocs/showdoc/|) ||   ($requrl=~m|^/adm/coursedocs/showdoc/|) ||
  ($requrl=~m|\.problem/smpedit$|) ||   ($requrl=~m|\.problem/smpedit$|) ||
  ($requrl=~/^\/public\/.*\/syllabus$/)) {   ($requrl=~/^\/public\/.*\/syllabus$/) ||
                   ($requrl=~/^\/adm\/(viewclasslist|navmaps)$/) ||
                   ($requrl=~/^\/adm\/.*\/aboutme\/portfolio(\?|$)/)) {
 # ------------------------------------- This is serious stuff, get symb and log  # ------------------------------------- This is serious stuff, get symb and log
  my $symb;   my $symb;
  if ($query) {   if ($query) {
     &Apache::loncommon::get_unprocessed_cgi($query,['symb']);      &Apache::loncommon::get_unprocessed_cgi($query,['symb','folderpath']);
  }   }
  if ($env{'form.symb'}) {   if ($env{'form.symb'}) {
     $symb=&Apache::lonnet::symbclean($env{'form.symb'});      $symb=&Apache::lonnet::symbclean($env{'form.symb'});
Line 520  sub handler { Line 600  sub handler {
   'last_known' =>[$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)) ||
                                (($requrl=~m|(.*/aboutme)/portfolio$|) &&
                                 &Apache::lonnet::symbverify($symb,$1))) {
  my ($map,$mid,$murl)=&Apache::lonnet::decode_symb($symb);   my ($map,$mid,$murl)=&Apache::lonnet::decode_symb($symb);
  &Apache::lonnet::symblist($map,$murl => [$murl,$mid],   &Apache::lonnet::symblist($map,$murl => [$murl,$mid],
   'last_known' =>[$murl,$mid]);    'last_known' =>[$murl,$mid]);
Line 532  sub handler { Line 614  sub handler {
  return HTTP_NOT_ACCEPTABLE;    return HTTP_NOT_ACCEPTABLE; 
     }      }
  } else {   } else {
     $symb=&Apache::lonnet::symbread($requrl);                      if ($requrl=~m{^(/adm/.*/aboutme)/portfolio$}) {
     if (&Apache::lonnet::is_on_map($requrl) && $symb &&                          $requrl = $1;
  !&Apache::lonnet::symbverify($symb,$requrl)) {                      }
  $r->log_reason('Invalid symb for '.$requrl.': '.$symb);                      unless ($suppext) {
  $env{'user.error.msg'}=          $symb=&Apache::lonnet::symbread($requrl);
     "$requrl:bre:1:1:Invalid Access";          if (&Apache::lonnet::is_on_map($requrl) && $symb &&
  return HTTP_NOT_ACCEPTABLE;       !&Apache::lonnet::symbverify($symb,$requrl)) {
     }      $r->log_reason('Invalid symb for '.$requrl.': '.$symb);
     if ($symb) {      $env{'user.error.msg'}=
  my ($map,$mid,$murl)=          "$requrl:bre:1:1:Invalid Access";
     &Apache::lonnet::decode_symb($symb);      return HTTP_NOT_ACCEPTABLE; 
  &Apache::lonnet::symblist($map,$murl =>[$murl,$mid],          }
   'last_known' =>[$murl,$mid]);          if ($symb) {
       my ($map,$mid,$murl)=
           &Apache::lonnet::decode_symb($symb);
       &Apache::lonnet::symblist($map,$murl =>[$murl,$mid],
         'last_known' =>[$murl,$mid]);
           }
     }      }
  }   }
  $env{'request.symb'}=$symb;   $env{'request.symb'}=$symb;
Line 553  sub handler { Line 640  sub handler {
 # ------------------------------------------------------- This is other content  # ------------------------------------------------------- This is other content
  &Apache::lonnet::courseacclog($requrl);       &Apache::lonnet::courseacclog($requrl);    
     }      }
             my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};;              if ($requrl =~ m{^/+uploaded/\Q$cdom\E/\Q$cnum\E/(docs|supplemental)/.+\.html?$}) {
             my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};;  
             if ($requrl =~ m{^/+uploaded/\Q$cdom\E/\Q$cnum\E/docs/.+\.html?$}) {  
                 if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {                  if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {
                     if ($query) {                      if ($query) {
                         &Apache::loncommon::get_unprocessed_cgi($query,['forceedit']);                          &Apache::loncommon::get_unprocessed_cgi($query,['forceedit']);
Line 564  sub handler { Line 649  sub handler {
                         }                          }
                     }                      }
                 }                  }
               } elsif ($requrl =~ m{^/+uploaded/\Q$cdom\E/\Q$cnum\E/portfolio/syllabus/.+\.html?$}) {
                   if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {
                       if ($query) {
                           &Apache::loncommon::get_unprocessed_cgi($query,['forceedit','editmode']);
                           if (($env{'form.forceedit'}) || ($env{'form.editmode'})) {
                               $env{'request.state'} = 'edit';
                           }
                       }
                   }
             }              }
  }   }
  return OK;   return OK;
       } else {
           my $defdom=$r->dir_config('lonDefDomain');
           ($is_balancer,$otherserver) =
               &Apache::lonnet::check_loadbalancing(undef,$defdom);
           if ($is_balancer) {
               $r->set_handlers('PerlResponseHandler'=>
                                [\&Apache::switchserver::handler]);
               if ($otherserver ne '') {
                   $env{'form.otherserver'} = $otherserver;
               }
           }
     }      }
 # -------------------------------------------- See if this is a public resource  # -------------------------------------------- See if this is a public resource
     if ($requrl=~m|^/+adm/+help/+|) {      if ($requrl=~m|^/+adm/+help/+|) {

Removed from v.1.132  
changed lines
  Added in v.1.145


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