Diff for /loncom/auth/lonacc.pm between versions 1.70 and 1.92

version 1.70, 2005/11/29 21:12:03 version 1.92, 2006/08/08 17:20:15
Line 35  use Apache::File; Line 35  use Apache::File;
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonlocal;  use Apache::lonlocal;
   use Apache::restrictedaccess();
 use CGI::Cookie();  use CGI::Cookie();
 use Fcntl qw(:flock);  use Fcntl qw(:flock);
   use LONCAPA;
   
   sub cleanup {
       my ($r)=@_;
       if (! $r->is_initial_req()) { return DECLINED; }
       &Apache::lonnet::save_cache();
       return OK;
   }
   
   sub goodbye {
       my ($r)=@_;
       &Apache::lonnet::goodbye();
       return DONE;
   }
   
   ###############################################
   
   sub get_posted_cgi {
       my ($r) = @_;
   
       my $buffer;
       if ($r->header_in('Content-length')) {
    $r->read($buffer,$r->header_in('Content-length'),0);
       }
       unless ($buffer=~/^(\-+\w+)\s+Content\-Disposition\:\s*form\-data/si) {
    my @pairs=split(/&/,$buffer);
    my $pair;
    foreach $pair (@pairs) {
       my ($name,$value) = split(/=/,$pair);
       $value =~ tr/+/ /;
       $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
       $name  =~ tr/+/ /;
       $name  =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
       &Apache::loncommon::add_to_env("form.$name",$value);
    }
       } else {
    my $contentsep=$1;
    my @lines = split (/\n/,$buffer);
    my $name='';
    my $value='';
    my $fname='';
    my $fmime='';
    my $i;
    for ($i=0;$i<=$#lines;$i++) {
       if ($lines[$i]=~/^$contentsep/) {
    if ($name) {
       chomp($value);
       if ($fname) {
    $env{"form.$name.filename"}=$fname;
    $env{"form.$name.mimetype"}=$fmime;
       } else {
    $value=~s/\s+$//s;
       }
       &Apache::loncommon::add_to_env("form.$name",$value);
    }
    if ($i<$#lines) {
       $i++;
       $lines[$i]=~
    /Content\-Disposition\:\s*form\-data\;\s*name\=\"([^\"]+)\"/i;
       $name=$1;
       $value='';
       if ($lines[$i]=~/filename\=\"([^\"]+)\"/i) {
    $fname=$1;
    if 
                               ($lines[$i+1]=~/Content\-Type\:\s*([\w\-\/]+)/i) {
    $fmime=$1;
    $i++;
       } else {
    $fmime='';
       }
       } else {
    $fname='';
    $fmime='';
       }
       $i++;
    }
       } else {
    $value.=$lines[$i]."\n";
       }
    }
       }
   #
   # Digested POSTed values
   #
   # Remember the way this was originally done (GET or POST)
   #
       $env{'request.method'}=$ENV{'REQUEST_METHOD'};
   #
   # There may also be stuff in the query string
   # Tell subsequent handlers that this was GET, not POST, so they can access query string.
   # Also, unset POSTed content length to cover all tracks.
   #
   
       $r->method_number(M_GET);
   
       $r->method('GET');
       $r->headers_in->unset('Content-length');
   }
   
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
Line 52  sub handler { Line 151  sub handler {
         $handle=~s/\W//g;          $handle=~s/\W//g;
     }      }
               
       my ($sso_login);
     if ($r->user       if ($r->user 
  && (!$lonid || !-e "$lonidsdir/$handle.id" || $handle eq '') ) {   && (!$lonid || !-e "$lonidsdir/$handle.id" || $handle eq '') ) {
    $sso_login = 1;
  my $domain = $r->dir_config('lonDefDomain');   my $domain = $r->dir_config('lonDefDomain');
  my $home=&Apache::lonnet::homeserver($r->user,$domain);   my $home=&Apache::lonnet::homeserver($r->user,$domain);
  if ($home !~ /(con_lost|no_such_host)/) {   if ($home !~ /(con_lost|no_such_host)/) {
Line 63  sub handler { Line 164  sub handler {
  }   }
     }      }
   
       if ($sso_login) {
    &Apache::lonnet::appenv('request.sso.login' => 1);
       }
   
     if ($r->dir_config("lonBalancer") eq 'yes') {      if ($r->dir_config("lonBalancer") eq 'yes') {
  $r->set_handlers('PerlResponseHandler'=>   $r->set_handlers('PerlResponseHandler'=>
  [\&Apache::switchserver::handler]);   [\&Apache::switchserver::handler]);
     }      }
       
     if ($handle ne '') {      if ($handle eq '') {
         if ((-e "$lonidsdir/$handle.id") && ($handle ne '')) {   $r->log_reason("Cookie $handle not valid", $r->filename); 
       } elsif ((-e "$lonidsdir/$handle.id") && ($handle ne '')) {
   
 # ------------------------------------------------------ Initialize Environment  # ------------------------------------------------------ Initialize Environment
   
             &Apache::lonnet::transfer_profile_to_env($lonidsdir,$handle);   &Apache::lonnet::transfer_profile_to_env($lonidsdir,$handle);
   
 # --------------------------------------------------------- Initialize Language  # --------------------------------------------------------- Initialize Language
   
     &Apache::lonlocal::get_language_handle($r);   &Apache::lonlocal::get_language_handle($r);
   
       }
   
   # -------------------------------------------------- Should be a valid user now
       if ($env{'user.name'} ne '' && $env{'user.domain'} ne '') {
 # -------------------------------------------------------------- Resource State  # -------------------------------------------------------------- Resource State
   
             if ($requrl=~/^\/+(res|uploaded)\//) {   if ($requrl=~/^\/+(res|uploaded)\//) {
                $env{'request.state'} = "published";      $env{'request.state'} = "published";
     } else {   } else {
        $env{'request.state'} = 'unknown';      $env{'request.state'} = 'unknown';
             }   }
             $env{'request.filename'} = $r->filename;   $env{'request.filename'} = $r->filename;
             $env{'request.noversionuri'} = &Apache::lonnet::deversion($requrl);   $env{'request.noversionuri'} = &Apache::lonnet::deversion($requrl);
 # -------------------------------------------------------- Load POST parameters  # -------------------------------------------------------- Load POST parameters
   
     &Apache::loncommon::get_posted_cgi($r);   &Apache::lonacc::get_posted_cgi($r);
   
 # ---------------------------------------------------------------- Check access  # ---------------------------------------------------------------- Check access
    my $now = time;
             if ($requrl!~/^\/adm|public|prtspool\//) {   if ($requrl!~/^\/adm|public|prtspool\//) {
  my $access=&Apache::lonnet::allowed('bre',$requrl);      my $access=&Apache::lonnet::allowed('bre',$requrl);
                 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; 
                 }  
                 if (($access ne '2') && ($access ne 'F')) {  
    $env{'user.error.msg'}="$requrl:bre:1:1:Access Denied";  
            return HTTP_NOT_ACCEPTABLE;   
                 }  
             }  
     if ($requrl =~ m|^/prtspool/|) {  
  my $start='/prtspool/'.$env{'user.name'}.'_'.  
     $env{'user.domain'};  
  if ($requrl !~ /^\Q$start\E/) {  
     $env{'user.error.msg'}="$requrl:bre:1:1:Access Denied";  
     return HTTP_NOT_ACCEPTABLE;  
  }  
     }      }
     if ($env{'user.name'} eq 'public' &&       if ($access eq 'A') {
  $env{'user.domain'} eq 'public' &&   &Apache::restrictedaccess::setup_handler($r);
  $requrl !~ m{^/+(res|public)/} &&   return OK;
  $requrl !~ m{^/+adm/(help|logout|randomlabel\.png)}) {  
  $env{'request.querystring'}=$r->args;  
  $env{'request.firsturl'}=$requrl;  
  return FORBIDDEN;  
     }      }
       if (($access ne '2') && ($access ne 'F')) {
    $env{'user.error.msg'}="$requrl:bre:1:1:Access Denied";
    return HTTP_NOT_ACCEPTABLE; 
       }
    }
    if ($requrl =~ m|^/prtspool/|) {
       my $start='/prtspool/'.$env{'user.name'}.'_'.
    $env{'user.domain'};
       if ($requrl !~ /^\Q$start\E/) {
    $env{'user.error.msg'}="$requrl:bre:1:1:Access Denied";
    return HTTP_NOT_ACCEPTABLE;
       }
    }
    if ($env{'user.name'} eq 'public' && 
       $env{'user.domain'} eq 'public' &&
       $requrl !~ m{^/+(res|public|uploaded)/} &&
       $requrl !~ m{^/adm/[^/]+/[^/]+/aboutme/portfolio$ }x &&
       $requrl !~ m{^/+adm/(help|logout|restrictedaccess|randomlabel\.png)}) {
       $env{'request.querystring'}=$r->args;
       $env{'request.firsturl'}=$requrl;
       return FORBIDDEN;
    }
 # ------------------------------------------------------------- This is allowed  # ------------------------------------------------------------- This is allowed
           if ($env{'request.course.id'}) {   if ($env{'request.course.id'}) {
     &Apache::lonnet::countacc($requrl);      &Apache::lonnet::countacc($requrl);
             $requrl=~/\.(\w+)$/;      $requrl=~/\.(\w+)$/;
             if ((&Apache::loncommon::fileembstyle($1) eq 'ssi') ||      if ((&Apache::loncommon::fileembstyle($1) eq 'ssi') ||
  ($requrl=~/^\/adm\/.*\/(aboutme|navmaps|smppg|bulletinboard)(\?|$)/) ||   ($requrl=~/^\/adm\/.*\/(aboutme|navmaps|smppg|bulletinboard)(\?|$ )/x) ||
  ($requrl=~/^\/adm\/wrapper\//) ||   ($requrl=~/^\/adm\/wrapper\//) ||
  ($requrl=~m|\.problem/smpedit$|) ||   ($requrl=~m|^/adm/coursedocs/showdoc/|) ||
  ($requrl=~/^\/public\/.*\/syllabus$/)) {   ($requrl=~m|\.problem/smpedit$|) ||
    ($requrl=~/^\/public\/.*\/syllabus$/)) {
 # ------------------------------------- This is serious stuff, get symb and log  # ------------------------------------- This is serious stuff, get symb and log
  my $query=$r->args;   my $query=$r->args;
                 my $symb;   my $symb;
                 if ($query) {   if ($query) {
     &Apache::loncommon::get_unprocessed_cgi($query,['symb']);      &Apache::loncommon::get_unprocessed_cgi($query,['symb']);
                 }   }
                 if ($env{'form.symb'}) {   if ($env{'form.symb'}) {
     $symb=&Apache::lonnet::symbclean($env{'form.symb'});      $symb=&Apache::lonnet::symbclean($env{'form.symb'});
                     if ($requrl =~ m|^/adm/wrapper/|) {      if ($requrl =~ m|^/adm/wrapper/|
                         my ($map,$mid,$murl)=&Apache::lonnet::decode_symb($symb);   || $requrl =~ m|^/adm/coursedocs/showdoc/|) {
                         &Apache::lonnet::symblist($map,$murl => [$murl,$mid],   my ($map,$mid,$murl)=&Apache::lonnet::decode_symb($symb);
    &Apache::lonnet::symblist($map,$murl => [$murl,$mid],
   '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))) {
                       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]);
     } else {      } else {
  $r->log_reason('Invalid symb for '.$requrl.': '.   $r->log_reason('Invalid symb for '.$requrl.': '.
                                        $symb);         $symb);
         $env{'user.error.msg'}=   $env{'user.error.msg'}=
                                 "$requrl:bre:1:1:Invalid Access";      "$requrl:bre:1:1:Invalid Access";
                  return HTTP_NOT_ACCEPTABLE;    return HTTP_NOT_ACCEPTABLE; 
                     }      }
                 } else {   } else {
             $symb=&Apache::lonnet::symbread($requrl);      $symb=&Apache::lonnet::symbread($requrl);
     if (&Apache::lonnet::is_on_map($requrl) && $symb &&      if (&Apache::lonnet::is_on_map($requrl) && $symb &&
  !&Apache::lonnet::symbverify($symb,$requrl)) {   !&Apache::lonnet::symbverify($symb,$requrl)) {
  $r->log_reason('Invalid symb for '.$requrl.': '.$symb);   $r->log_reason('Invalid symb for '.$requrl.': '.$symb);
         $env{'user.error.msg'}=   $env{'user.error.msg'}=
                                 "$requrl:bre:1:1:Invalid Access";      "$requrl:bre:1:1:Invalid Access";
                  return HTTP_NOT_ACCEPTABLE;    return HTTP_NOT_ACCEPTABLE; 
     }      }
     if ($symb) {      if ($symb) {
  my ($map,$mid,$murl)=   my ($map,$mid,$murl)=
     &Apache::lonnet::decode_symb($symb);      &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]);
     }      }
                 }   }
                 $env{'request.symb'}=$symb;   $env{'request.symb'}=$symb;
                 &Apache::lonnet::courseacclog($symb);   &Apache::lonnet::courseacclog($symb);
             } else {      } else {
 # ------------------------------------------------------- This is other content  # ------------------------------------------------------- This is other content
                 &Apache::lonnet::courseacclog($requrl);       &Apache::lonnet::courseacclog($requrl);    
             }      }
   }   }
             return OK;    return OK;
         } else {   
             $r->log_reason("Cookie $handle not valid", $r->filename)   
         };  
     }      }
   
 # -------------------------------------------- See if this is a public resource  # -------------------------------------------- See if this is a public resource
     if ($requrl=~m|^/public/|  
  || (&Apache::lonnet::metadata($requrl,'copyright') eq 'public')) {  
         &Apache::lonnet::logthis('Granting public access: '.$requrl);  
  my $cookie=  
     &Apache::lonauth::success($r,'public','public','public');  
         my $lonidsdir=$r->dir_config('lonIDsDir');  
  &Apache::lonnet::transfer_profile_to_env($lonidsdir,$cookie);  
  &Apache::loncommon::get_posted_cgi($r);  
         $env{'request.state'} = "published";  
         $env{'request.publicaccess'} = 1;  
         $env{'request.filename'} = $r->filename;  
   
  $r->header_out('Set-cookie',"lonID=$cookie; path=/");  
         return OK;  
     }  
     if ($requrl=~m|^/+adm/+help/+|) {      if ($requrl=~m|^/+adm/+help/+|) {
  return OK;    return OK;
     }      }
   # ------------------------------------ See if this is a viewable portfolio file
       if (&Apache::lonnet::is_portfolio_url($requrl)) {
    my $access=&Apache::lonnet::allowed('bre',$requrl);
    if ($access eq 'A') {
       &Apache::restrictedaccess::setup_handler($r);
       return OK;
    }
    if (($access ne '2') && ($access ne 'F')) {
       $env{'user.error.msg'}="$requrl:bre:1:1:Access Denied";
       return HTTP_NOT_ACCEPTABLE;
    }
       }
   
 # -------------------------------------------------------------- Not authorized  # -------------------------------------------------------------- Not authorized
     $requrl=~/\.(\w+)$/;      $requrl=~/\.(\w+)$/;
 #    if ((&Apache::loncommon::fileembstyle($1) eq 'ssi') ||  #    if ((&Apache::loncommon::fileembstyle($1) eq 'ssi') ||

Removed from v.1.70  
changed lines
  Added in v.1.92


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.