Diff for /loncom/auth/loncacc.pm between versions 1.22 and 1.51

version 1.22, 2002/09/10 14:26:13 version 1.51, 2010/09/30 16:42:30
Line 26 Line 26
 #  #
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
 # YEAR=2000  
 # 6/15,16/11,22/11,  
 # YEAR=2001  
 # 01/06,01/11,6/1,9/25,9/28,11/22,12/25,12/26,  
 # 01/06/01,05/04,05/05,05/09 Gerd Kortemeyer  
 # 12/21 Scott Harrison  
 # YEAR=2002  
 # 1/4 Gerd Kortemeyer  
 ###  
   
 package Apache::loncacc;  =pod
   
 use strict;  
 use Apache::Constants qw(:common :http :methods);  
 use Apache::File;  
 use CGI::Cookie();  
 use Fcntl qw(:flock);  
   
 sub constructaccess {  
     my ($url,$ownerdomain)=@_;  
     my ($ownername)=($url=~/\/(?:\~|priv\/|home\/)(\w+)/);  
     unless (($ownername) && ($ownerdomain)) { return ''; }  
   
     if (($ownername eq $ENV{'user.name'}) &&  
         ($ownerdomain eq $ENV{'user.domain'})) {  
  return ($ownername,$ownerdomain);  
     }  
   
     my $capriv='user.priv.ca./'.  
                $ownerdomain.'/'.$ownername.'./'.  
        $ownerdomain.'/'.$ownername;  
     foreach (keys %ENV) {  
         if ($_ eq $capriv) {  
            return ($ownername,$ownerdomain);  
         }  
     }  
   
     return '';  
 }  
   
 sub handler {  
     my $r = shift;  
     my $requrl=$r->uri;  
     $ENV{'request.editurl'}=$requrl;  
     my %cookies=CGI::Cookie->parse($r->header_in('Cookie'));  
     my $lonid=$cookies{'lonID'};  
     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 '')) {  
             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";  
             $ENV{'request.state'}    = "construct";  
             $ENV{'request.filename'} = $r->filename;  
   
             unless (&constructaccess($requrl,$r->dir_config('lonDefDomain'))) {  
                 $r->log_reason("Unauthorized $requrl", $r->filename);   
         return HTTP_NOT_ACCEPTABLE;  
             }  
   
 # -------------------------------------------------------- Load POST parameters  
   
   
         my $buffer;  
   
         $r->read($buffer,$r->header_in('Content-length'));  
   
  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";  
                 }  
             }  
  }  
             $ENV{'request.method'}=$ENV{'REQUEST_METHOD'};  
             $r->method_number(M_GET);  
     $r->method('GET');  
             $r->headers_in->unset('Content-length');  
   
             return OK;   
         } else {   
             $r->log_reason("Cookie $handle not valid", $r->filename)   
         };  
     }  
   
 # ----------------------------------------------- Store where they wanted to go  
   
     $ENV{'request.firsturl'}=$requrl;  
     return FORBIDDEN;  
 }  
   
 1;  
 __END__  
   
 =head1 NAME  =head1 NAME
   
Line 190  Apache::lonacc - Cookie Based Access Han Line 35  Apache::lonacc - Cookie Based Access Han
   
 =head1 SYNOPSIS  =head1 SYNOPSIS
   
 Invoked (for various locations) by /etc/httpd/conf/srm.conf:  Invoked (for various locations) by /etc/httpd/conf/loncapa_apache.conf:
   
  PerlAccessHandler       Apache::loncacc   PerlAccessHandler       Apache::loncacc
   
Line 228  store where they wanted to go (first url Line 73  store where they wanted to go (first url
   
 =head1 OTHERSUBROUTINES  =head1 OTHERSUBROUTINES
   
 =over 4  =over
   
 =item *  =item constructaccess($url,$ownerdomain)
   
 constructaccess($url,$ownerdomain) : See if the owner domain and name  See if the owner domain and name
 in the URL match those in the expected environment.  If so, return   in the URL match those in the expected environment.  If so, return 
 two element list ($ownername,$ownerdomain).  Else, return null string.  two element list ($ownername,$ownerdomain).  Else, return null string.
   
Line 241  two element list ($ownername,$ownerdomai Line 86  two element list ($ownername,$ownerdomai
 =cut  =cut
   
   
   package Apache::loncacc;
   
   use strict;
   use Apache::Constants qw(:common :http :methods REDIRECT);
   use Fcntl qw(:flock);
   use Apache::lonlocal;
   use Apache::lonnet;
   use Apache::lonacc;
   use LONCAPA qw(:DEFAULT :match);
   
   sub constructaccess {
       my ($url,$ownerdomain,$setpriv)=@_;
       my ($ownername)=($url=~/\/(?:\~|priv\/|home\/)($match_username)\//);
       unless (($ownername) && ($ownerdomain)) { return ''; }
       # We do not allow editing of previous versions of files.
       if ($url=~/\.(\d+)\.(\w+)$/) { return ''; }
       my @possibledomains = &Apache::lonnet::current_machine_domains();
       if ($ownername eq $env{'user.name'}) {
    foreach my $domain (@possibledomains) {
       if ($domain eq $env{'user.domain'}) {
    return ($ownername,$domain);
       }
    }
       }
       
       foreach my $domain (@possibledomains) {
    if (exists($env{'user.priv.ca./'.$domain.'/'.$ownername.'./'}) ||
       exists($env{'user.priv.aa./'.$domain.'/'.$ownername.'./'}) ) {
       return ($ownername,$domain);
    }
       }
   
       my $then=$env{'user.login.time'};
       my %dcroles = ();
       if (&is_active_dc($ownerdomain,$then)) {
           my %blocked=&Apache::lonnet::get('environment',['domcoord.author'],
                                            $ownerdomain,$ownername);
           unless ($blocked{'domcoord.author'} eq 'blocked') {
               if (grep(/^$ownerdomain$/,@possibledomains)) {
                   if ($setpriv) {
                       my $refresh=$env{'user.refresh.time'};
                       if (!$refresh) {
                           $refresh = $then;
                       }
                       my $now = time;
                       &Apache::lonnet::check_adhoc_privs($ownerdomain,$ownername,
                                                          $then,$refresh,$now,'ca',
                                                          'constructaccess');
                   }
                   return($ownername,$ownerdomain);
               }
           }
       }
       return '';
   }
   
   sub is_active_dc {
       my ($ownerdomain,$then) = @_;
       my $livedc;
       if ($env{'user.adv'}) {
           my $domrole = $env{'user.role.dc./'.$ownerdomain.'/'};
           if ($domrole) {
               my ($tstart,$tend)=split(/\./,$domrole);
               $livedc = 1;
               if ($tstart && $tstart>$then) { undef($livedc); }
               if ($tend   && $tend  <$then) { undef($livedc); }
           }
       }
       return $livedc;
   }
   
   
   sub handler {
       my $r = shift;
       my $requrl=$r->uri;
       $env{'request.editurl'}=$requrl;
   
       my $handle =  &Apache::lonnet::check_for_valid_session($r);
       if ($handle ne '') {
   
   # ------------------------------------------------------ Initialize Environment
           my $lonidsdir=$r->dir_config('lonIDsDir');
    &Apache::lonnet::transfer_profile_to_env($lonidsdir,$handle);
   
   # --------------------------------------------------------- Initialize Language
    
    &Apache::lonlocal::get_language_handle($r);
   
   # -------------------------------------------------------------- Resource State
   
    $env{'request.state'}    = "construct";
    $env{'request.filename'} = $r->filename;
   
    unless (&constructaccess($requrl,$r->dir_config('lonDefDomain'),'setpriv')) {
       $r->log_reason("Unauthorized $requrl", $r->filename); 
       return HTTP_NOT_ACCEPTABLE;
    }
   
   # -------------------------------------------------------- Load POST parameters
   
    &Apache::lonacc::get_posted_cgi($r);
   
    return OK; 
       } else { 
    $r->log_reason("Cookie $handle not valid", $r->filename) 
       }
   
   # ----------------------------------------------- Store where they wanted to go
   
       $env{'request.firsturl'}=$requrl;
       return FORBIDDEN;
   }
   
   1;
   __END__
   
   
   
   
   
   

Removed from v.1.22  
changed lines
  Added in v.1.51


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