Diff for /loncom/auth/lonacc.pm between versions 1.40 and 1.84

version 1.40, 2003/04/02 14:57:32 version 1.84, 2006/07/07 22:01:52
Line 25 Line 25
 #  #
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
 # YEAR=1999  
 # 5/21/99,5/22,5/29,5/31,6/15,16/11,22/11,  
 # YEAR=2000  
 # 01/06,01/13,05/31,06/01,09/06,09/25,09/28,10/30,11/6,  
 # 12/25,12/26,  
 # YEAR=2001  
 # 01/06/01,05/28,8/11,9/26,11/29 Gerd Kortemeyer  
 # YEAR=2002  
 # 1/4,2/25 Gerd Kortemeyer  
 #  
 ###  ###
   
 package Apache::lonacc;  package Apache::lonacc;
Line 44  use Apache::Constants qw(:common :http : Line 34  use Apache::Constants qw(:common :http :
 use Apache::File;  use Apache::File;
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::loncommon();  use Apache::loncommon();
   use Apache::lonlocal;
 use CGI::Cookie();  use CGI::Cookie();
 use Fcntl qw(:flock);  use Fcntl qw(:flock);
   
 sub handler {  sub cleanup {
     my $r = shift;      my ($r)=@_;
     my $requrl=$r->uri;      if (! $r->is_initial_req()) { return DECLINED; }
     my %cookies=CGI::Cookie->parse($r->header_in('Cookie'));      &Apache::lonnet::save_cache();
     my $lonid=$cookies{'lonID'};      return OK;
     my $cookie;  }
     if ($lonid) {  
  my $handle=$lonid->value;  
         $handle=~s/\W//g;  
         my $lonidsdir=$r->dir_config('lonIDsDir');  
         if ((-e "$lonidsdir/$handle.id") && ($handle ne '')) {  
   
 # ------------------------------------------- Transfer profile into environment  sub goodbye {
       my ($r)=@_;
       &Apache::lonnet::goodbye();
       return DONE;
   }
   
             my @profile;  ###############################################
     {  
              my $idf=Apache::File->new("$lonidsdir/$handle.id");  
              flock($idf,LOCK_SH);  
              @profile=<$idf>;  
              $idf->close();  
     }  
             my $envi;  
             for ($envi=0;$envi<=$#profile;$envi++) {  
  chomp($profile[$envi]);  
  my ($envname,$envvalue)=split(/=/,$profile[$envi]);  
                 $ENV{$envname} = $envvalue;  
             }  
             $ENV{'user.environment'} = "$lonidsdir/$handle.id";  
             if ($requrl=~/^\/res\//) {  
                $ENV{'request.state'} = "published";  
     } else {  
        $ENV{'request.state'} = 'unknown';  
             }  
             $ENV{'request.filename'} = $r->filename;  
   
 # -------------------------------------------------------- Load POST parameters  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');
         my $buffer;      $r->headers_in->unset('Content-length');
   }
   
         $r->read($buffer,$r->header_in('Content-length'));  sub portfolio_access {
  unless ($buffer=~/^(\-+\w+)\s+Content\-Disposition\:\s*form\-data/si) {      my ($udom,$unum,$file_name,$group) = @_;
             my @pairs=split(/&/,$buffer);      my $current_perms = &Apache::lonnet::get_portfile_permissions($udom,$unum);
             my $pair;      my %access_controls = &Apache::lonnet::get_access_controls(
             foreach $pair (@pairs) {                                               $current_perms,$group,$file_name);
                my ($name,$value) = split(/=/,$pair);      my ($public,$guest,@domains,@users,@courses,@groups);
                $value =~ tr/+/ /;      my $now = time;
                $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;      my $access_hash = $access_controls{$file_name};
                $name  =~ tr/+/ /;      if (ref($access_hash) eq 'HASH') {
                $name  =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;          foreach my $key (keys(%{$access_hash})) {
        &Apache::loncommon::add_to_env("form.$name",$value);              my ($num,$scope,$end,$start) = ($key =~ /^([^:]+):([a-z]+)_(\d*)_?(\d*)$/);
               if ($start > $now) {
                   next;
               }
               if ($end && $end<$now) {
                   next;
               }
               if ($scope eq 'public') {
                   $public = $key;
                   last;
               } elsif ($scope eq 'guest') {
                   $guest = $key;
               } elsif ($scope eq 'domains') {
                   push(@domains,$key);
               } elsif ($scope eq 'users') {
                   push(@users,$key);
               } elsif ($scope eq 'course') {
                   push(@courses,$key);
               } elsif ($scope eq 'group') {
                   push(@groups,$key);
               }
           }
           if ($public) {
               return 'ok';
           }
           if ($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public') {
               if ($guest) {
                   return 'guest:'.$guest;
             }              }
         } else {          } else {
     my $contentsep=$1;              if (@domains > 0) {
             my @lines = split (/\n/,$buffer);                  foreach my $domkey (@domains) {
             my $name='';                      my %content = &Apache::lonnet::parse_access_controls($$access_hash{$domkey});
             my $value='';                      if (ref($content{'dom'}) eq 'ARRAY') {
             my $fname='';                          if (grep(/^\Q$env{'user.domain'}\E$/,@{$content{'dom'}})) {
             my $fmime='';                              return 'ok';
             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]=~              if (@users > 0) {
  /Content\-Disposition\:\s*form\-data\;\s*name\=\"([^\"]+)\"/i;                  foreach my $userkey (@users) {
                         $name=$1;                      my %content = &Apache::lonnet::parse_access_controls($$access_hash{$userkey});
                         $value='';                      if (exists($content{'users'}{$env{'user.name'}.':'.$env{'user.domain'}})) {
                         if ($lines[$i]=~/filename\=\"([^\"]+)\"/i) {                          return 'ok';
    $fname=$1;                      }
                            if                   }
                             ($lines[$i+1]=~/Content\-Type\:\s*([\w\-\/]+)/i) {              }
       $fmime=$1;              my %roleshash;
                               $i++;              my @courses_and_groups = @courses;
    } else {              push(@courses_and_groups,@groups); 
                               $fmime='';              if (@courses_and_groups > 0) {
                            }                  my (%allgroups,%allroles); 
                   my ($start,$end,$role,$sec,$group);
                   foreach my $envkey (%env) {
                       if ($envkey =~ m-^user\.role\.(gr|cc|in|ta|ep|st)\./([^/]+)/([^/]+)/?([^/]*)$-) {
                           my $cid = $2.'_'.$3; 
                           if ($1 eq 'gr') {
                               $group = $4;
                               $allgroups{$cid}{$group} = $env{$envkey};
                           } else {
                               if ($4 eq '') {
                                   $sec = 'none';
                               } else {
                                   $sec = $4;
                               }
                               $allroles{$cid}{$1}{$sec} = $env{$envkey};
                           }
                       } elsif ($envkey =~ m-^user\.role\./cr/(\w+/\w+/\w*)./([^/]+)/([^/]+)/?([^/]*)$-) {
                           my $cid = $2.'_'.$3;
                           if ($4 eq '') {
                               $sec = 'none';
                         } else {                          } else {
     $fname='';                              $sec = $4;
                             $fmime='';                          }
                           $allroles{$cid}{$1}{$sec} = $env{$envkey};
                       }
                   }
                   if (keys(%allroles) == 0) {
                       return;
                   }
                   foreach my $key (@courses_and_groups) {
                       my %content = &Apache::lonnet::parse_access_controls($$access_hash{$key});
                       my $cnum = $content{'number'};
                       my $cdom = $content{'domain'};
                       my $cid = $cdom.'_'.$cnum;
                       if (!exists($allroles{$cid})) {
                           next;
                       }    
                       foreach my $role_id (keys(%{$content{'roles'}})) {
                           my @sections = @{$content{'roles'}{$role_id}{'section'}};
                           my @groups = @{$content{'roles'}{$role_id}{'group'}};
                           my @status = @{$content{'roles'}{$role_id}{'access'}};
                           my @roles = @{$content{'roles'}{$role_id}{'role'}};
                           foreach my $role (keys(%{$allroles{$cid}})) {
                               if ((grep/^all$/,@roles) || (grep/^\Q$role\E$/,@roles)) {
                                   foreach my $sec (keys(%{$allroles{$cid}{$role}})) {
                                       if (&course_group_datechecker($allroles{$cid}{$role}{$sec},$now,\@status) eq 'ok') {
                                           if (grep/^all$/,@sections) {
                                               return 'ok';
                                           } else {
                                               if (grep/^$sec$/,@sections) {
                                                   return 'ok' 
                                               }
                                           }
                                       }
                                   }
                                   if (keys(%{$allgroups{$cid}}) == 0) {
                                       if (grep/^none$/,@groups) {
                                           return 'ok';
                                       }
                                   } else {
                                       if (grep/^all$/,@groups) {
                                           return 'ok';
                                       } 
                                       foreach my $group (keys(%{$allgroups{$cid}})) {
                                           if (grep/^$group$/,@groups) {
                                               return 'ok';
                                           }
                                       }
                                   } 
                               }
                         }                          }
                         $i++;  
                     }                      }
                 } else {  
     $value.=$lines[$i]."\n";  
                 }                  }
             }              }
               if ($guest) {
                   return 'guest:'.$guest;
               }
           }
       }
       return;
   }
   
   sub course_group_datechecker {
       my ($dates,$now,$status) = @_;
       my ($start,$end) = split(/\./,$dates);
       if (!$start && !$end) {
           return 'ok';
       }
       if (grep/^active$/,@{$status}) {
           if (((!$start) || ($start && $start <= $now)) && ((!$end) || ($end && $end >= $now))) {
               return 'ok';
           }
       }
       if (grep/^previous$/,@{$status}) {
           if ($end > $now ) {
               return 'ok';
           }
       }
       if (grep/^future$/,@{$status}) {
           if ($start > $now) {
               return 'ok';
           }
       }
       return; 
   }
   
   sub handler {
       my $r = shift;
       my $requrl=$r->uri;
       my %cookies=CGI::Cookie->parse($r->header_in('Cookie'));
       my $lonid=$cookies{'lonID'};
       my $cookie;
       my $lonidsdir=$r->dir_config('lonIDsDir');
   
       my $handle;
       if ($lonid) {
    $handle=$lonid->value;
           $handle=~s/\W//g;
       }
         
       my ($sso_login);
       if ($r->user 
    && (!$lonid || !-e "$lonidsdir/$handle.id" || $handle eq '') ) {
    $sso_login = 1;
    my $domain = $r->dir_config('lonDefDomain');
    my $home=&Apache::lonnet::homeserver($r->user,$domain);
    if ($home !~ /(con_lost|no_such_host)/) {
       $handle=&Apache::lonauth::success($r,$r->user,$domain,
        $home,'noredirect');
       $r->header_out('Set-cookie',"lonID=$handle; path=/");
  }   }
     $ENV{'request.method'}=$ENV{'REQUEST_METHOD'};      }
             $r->method_number(M_GET);  
     $r->method('GET');  
             $r->headers_in->unset('Content-length');  
   
 # ---------------------------------------------------------------- Check access      if ($sso_login) {
    &Apache::lonnet::appenv('request.sso.login' => 1);
       }
   
       if ($r->dir_config("lonBalancer") eq 'yes') {
    $r->set_handlers('PerlResponseHandler'=>
    [\&Apache::switchserver::handler]);
       }
   
       if ($handle ne '') {
           if ((-e "$lonidsdir/$handle.id") && ($handle ne '')) {
   
   # ------------------------------------------------------ Initialize Environment
   
               &Apache::lonnet::transfer_profile_to_env($lonidsdir,$handle);
   
   # --------------------------------------------------------- Initialize Language
   
       &Apache::lonlocal::get_language_handle($r);
   
   # -------------------------------------------------------------- Resource State
   
               if ($requrl=~/^\/+(res|uploaded)\//) {
                  $env{'request.state'} = "published";
       } else {
          $env{'request.state'} = 'unknown';
               }
               $env{'request.filename'} = $r->filename;
               $env{'request.noversionuri'} = &Apache::lonnet::deversion($requrl);
   # -------------------------------------------------------- Load POST parameters
   
       &Apache::lonacc::get_posted_cgi($r);
   
   # ---------------------------------------------------------------- Check access
               my $now = time;
               if ($requrl =~ m|/+uploaded/([^/]+)/([^/]+)/portfolio(/.+)$|) {
                   my $result = &portfolio_access($1,$2,$3);
                   if ($result eq 'ok') {
                       return OK;
                   } elsif ($result =~ /^guest:(\w+)$/) {
                       my $guestkey = $1;
                       #FIXME need to cause generation of an intermediate page
                   }
               } elsif ($requrl =~ m|/+uploaded/([^/]+)/([^/]+)/groups/([^/]+)/portfolio/(.+)$|) {
                   my $result = &portfolio_access($1,$2,$3.'/'.$4,$3);
                   if ($result eq 'ok') {
                       return OK;
                   } elsif ($result =~ /^guest:(\w+)$/) {
                       my $guestkey = $1;
                       #FIXME need to cause generation of an intermediate page
   }
               }
             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')) {                  if (($access ne '2') && ($access ne 'F')) {
    $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; 
                 }                  }
             }              }
     if ($requrl =~ m|^/prtspool/|) {      if ($requrl =~ m|^/prtspool/|) {
  my $start='/prtspool/'.$ENV{'user.name'}.'_'.   my $start='/prtspool/'.$env{'user.name'}.'_'.
     $ENV{'user.domain'};      $env{'user.domain'};
  if ($requrl !~ /^\Q$start\E/) {   if ($requrl !~ /^\Q$start\E/) {
     $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;
  }   }
     }      }
       if ($env{'user.name'} eq 'public' && 
    $env{'user.domain'} eq 'public' &&
    $requrl !~ m{^/+(res|public)/} &&
    $requrl !~ m{^/+adm/(help|logout|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|wrapper)/) ||   ($requrl=~/^\/adm\/.*\/(aboutme|navmaps|smppg|bulletinboard)(\?|$)/) ||
    ($requrl=~/^\/adm\/wrapper\//) ||
    ($requrl=~m|^/adm/coursedocs/showdoc/|) ||
    ($requrl=~m|\.problem/smpedit$|) ||
  ($requrl=~/^\/public\/.*\/syllabus$/)) {   ($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;
Line 185  sub handler { Line 425  sub handler {
                 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 (&Apache::lonnet::symbverify($symb,$requrl)) {                      if ($requrl =~ m|^/adm/wrapper/|
                       my ($map,$mid,$murl)=split(/\_\_\_/,$symb);   || $requrl =~ m|^/adm/coursedocs/showdoc/|) {
                       &Apache::lonnet::symblist($map,$murl => $mid,                          my ($map,$mid,$murl)=&Apache::lonnet::decode_symb($symb);
                                                'last_known' => $murl);                          &Apache::lonnet::symblist($map,$murl => [$murl,$mid],
     'last_known' =>[$murl,$mid]);
                       } elsif ((&Apache::lonnet::symbverify($symb,$requrl)) ||
        (($requrl=~m|(.*)/smpedit$|) &&
         &Apache::lonnet::symbverify($symb,$1))) {
                         my ($map,$mid,$murl)=&Apache::lonnet::decode_symb($symb);
         &Apache::lonnet::symblist($map,$murl => [$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;              $symb=&Apache::lonnet::symbread($requrl);
       if (&Apache::lonnet::is_on_map($requrl) && $symb &&
    !&Apache::lonnet::symbverify($symb,$requrl)) {
    $r->log_reason('Invalid symb for '.$requrl.': '.$symb);
           $env{'user.error.msg'}=
                                   "$requrl:bre:1:1:Invalid Access";
                    return HTTP_NOT_ACCEPTABLE; 
       }
       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;
                 &Apache::lonnet::courseacclog($symb);                  &Apache::lonnet::courseacclog($symb);
             } else {              } else {
 # ------------------------------------------------------- This is other content  # ------------------------------------------------------- This is other content
Line 210  sub handler { Line 470  sub handler {
   }    }
             return OK;               return OK; 
         } else {           } else { 
             $r->log_reason("Cookie $handle not valid", $r->filename)               $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/|      if ($requrl=~m|^/public/|
  || (&Apache::lonnet::metadata($requrl,'copyright') eq 'public')) {   || (&Apache::lonnet::metadata($requrl,'copyright') eq 'public')) {
         &Apache::lonnet::logthis('Granting public access: '.$requrl);          &Apache::lonnet::logthis('Granting public access: '.$requrl);
  $ENV{'user.name'}='public';          &Apache::lonlocal::get_language_handle($r);
         $ENV{'user.domain'}='public';   my $cookie=
         $ENV{'request.state'} = "published";      &Apache::lonauth::success($r,'public','public','public');
         $ENV{'request.publicaccess'} = 1;          my $lonidsdir=$r->dir_config('lonIDsDir');
         $ENV{'request.filename'} = $r->filename;   &Apache::lonnet::transfer_profile_to_env($lonidsdir,$cookie);
    &Apache::lonacc::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;          return OK;
     }      }
       if ($requrl=~m|^/+adm/+help/+|) {
    return OK;
       }
   # ------------------------------------- See if this is a viewable portfolio file
       if ($requrl =~ m|/+uploaded/([^/]+)/([^/]+)/portfolio(/.+)$|) {
           my $result = &portfolio_access($1,$2,$3);
           if ($result eq 'ok') {
               return OK;
           } elsif ($result =~ /^guest:(\w+)$/) {
               my $guestkey = $1;
               #FIXME need to cause generation of an intermediate page
           }
       } elsif ($requrl =~ m|/+uploaded/([^/]+)/([^/]+)/groups/([^/]+)/portfolio/(.+)$|) {
           my $result = &portfolio_access($1,$2,$3.'/'.$4,$3);
           if ($result eq 'ok') {
               return OK;
           } elsif ($result =~ /^guest:(\w+)$/) {
               my $guestkey = $1;
               #FIXME need to cause generation of an intermediate page
           }
       }
 # -------------------------------------------------------------- Not authorized  # -------------------------------------------------------------- Not authorized
     $requrl=~/\.(\w+)$/;      $requrl=~/\.(\w+)$/;
     if ((&Apache::loncommon::fileembstyle($1) eq 'ssi') ||  #    if ((&Apache::loncommon::fileembstyle($1) eq 'ssi') ||
         ($requrl=~/^\/adm\/(roles|logout|email)/) ||  #        ($requrl=~/^\/adm\/(roles|logout|email|menu|remote)/) ||
         ($requrl=~m|^/prtspool/|)) {  #        ($requrl=~m|^/prtspool/|)) {
 # -------------------------- Store where they wanted to go and get login screen  # -------------------------- Store where they wanted to go and get login screen
  $ENV{'request.querystring'}=$r->args;   $env{'request.querystring'}=$r->args;
  $ENV{'request.firsturl'}=$requrl;   $env{'request.firsturl'}=$requrl;
        return FORBIDDEN;         return FORBIDDEN;
    } else {  #   } else {
 # --------------------------------------------------------------------- Goodbye  # --------------------------------------------------------------------- Goodbye
        return HTTP_BAD_REQUEST;  #       return HTTP_BAD_REQUEST;
    }  #   }
 }  }
   
 1;  1;

Removed from v.1.40  
changed lines
  Added in v.1.84


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.