Diff for /loncom/auth/loncacc.pm between versions 1.46 and 1.56

version 1.46, 2007/10/02 01:09:59 version 1.56, 2011/10/25 18:37:11
Line 27 Line 27
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
   
   =pod
   
   =head1 NAME
   
   Apache::lonacc - Cookie Based Access Handler for Construction Area
   
   =head1 SYNOPSIS
   
   Invoked (for various locations) by /etc/httpd/conf/loncapa_apache.conf:
   
    PerlAccessHandler       Apache::loncacc
   
   =head1 INTRODUCTION
   
   This module enables cookie based authentication for construction area
   and is used to control access for three (essentially equivalent) URIs.
   
    <LocationMatch "^/priv.*">
    <LocationMatch "^/\~.*">
    <LocationMatch "^/\~.*/$">
   
   Whenever the client sends the cookie back to the server, 
   if the cookie is missing or invalid, the user is re-challenged
   for login information.
   
   This is part of the LearningOnline Network with CAPA project
   described at http://www.lon-capa.org.
   
   =head1 HANDLER SUBROUTINE
   
   This routine is called by Apache and mod_perl.
   
   =over 4
   
   =item *
   
   load POST parameters
   
   =item *
   
   store where they wanted to go (first url entered)
   
   =back
   
   =head1 OTHERSUBROUTINES
   
   =over
   
   =item constructaccess($url,$setpriv)
   
   See if the owner domain and name
   in the URL match those in the expected environment.  If so, return 
   two element list ($ownername,$ownerdomain).  Else, return null string.
   If 'setpriv' is set to 'setpriv', it actually assigns the privileges.
   =back
   
   =cut
   
   
 package Apache::loncacc;  package Apache::loncacc;
   
 use strict;  use strict;
Line 38  use Apache::lonacc; Line 97  use Apache::lonacc;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   
 sub constructaccess {  sub constructaccess {
     my ($url,$ownerdomain)=@_;      my ($url,$setpriv)=@_;
     my ($ownername)=($url=~/\/(?:\~|priv\/|home\/)($match_username)\//);  
     unless (($ownername) && ($ownerdomain)) { return ''; }  # We do not allow editing of previous versions of files
     # We do not allow editing of previous versions of files.  
     if ($url=~/\.(\d+)\.(\w+)$/) { return ''; }      if ($url=~/\.(\d+)\.(\w+)$/) { return ''; }
     my @possibledomains = &Apache::lonnet::current_machine_domains();  
     if ($ownername eq $env{'user.name'}) {  # Get username and domain from URL
  foreach my $domain (@possibledomains) {      my ($ownerdomain,$ownername)=($url=~/^(?:\/home\/httpd\/html\/|\/)priv\/($match_domain)\/($match_username)\//);
     if ($domain eq $env{'user.domain'}) {  
  return ($ownername,$domain);  # The URL does not really point to any authorspace, forget it
     }      unless (($ownername) && ($ownerdomain)) { return ''; }
     
   # Now we need to see if the user has access to the authorspace of
   # $ownername at $ownerdomain
   
       if (($ownername eq $env{'user.name'}) && ($ownerdomain eq $env{'user.domain'})) {
   # Real author for this?
          if (exists($env{'user.priv.au./'.$ownerdomain.'/./'})) {
             return ($ownername,$ownerdomain);
          }
       } else {
   # Co-author for this?
    if (exists($env{'user.priv.ca./'.$ownerdomain.'/'.$ownername.'./'}) ||
       exists($env{'user.priv.aa./'.$ownerdomain.'/'.$ownername.'./'}) ) {
       return ($ownername,$ownerdomain);
  }   }
     }      }
       # We don't have any access right now. If we are not possibly going to do anything about this,
     foreach my $domain (@possibledomains) {  # we might as well leave
  if (exists($env{'user.priv.ca./'.$domain.'/'.$ownername.'./'}) ||     unless ($setpriv) { return ''; }
     exists($env{'user.priv.aa./'.$domain.'/'.$ownername.'./'}) ) {  
     return ($ownername,$domain);  # Backdoor access?
  }      my $allowed=&Apache::lonnet::allowed('eco',$ownerdomain);
   # Nope
       unless ($allowed) { return ''; }
   # Looks like we may have access, but could be locked by the owner of the construction space
       if ($allowed eq 'U') {
           my %blocked=&Apache::lonnet::get('environment',['domcoord.author'],
                                            $ownerdomain,$ownername);
   # Is blocked by owner
           if ($blocked{'domcoord.author'} eq 'blocked') { return ''; }
     }      }
       if (($allowed eq 'F') || ($allowed eq 'U')) {
   # Grant temporary access
           my $then=$env{'user.login.time'};
           my $update==$env{'user.update.time'};
           if (!$update) { $update = $then; }
           my $refresh=$env{'user.refresh.time'};
           if (!$refresh) { $refresh = $update; }
           my $now = time;
           &Apache::lonnet::check_adhoc_privs($ownerdomain,$ownername,
                                              $update,$refresh,$now,'ca',
                                              'constructaccess');
           return($ownername,$ownerdomain);
       }
   # No business here
     return '';      return '';
 }  }
   
Line 82  sub handler { Line 176  sub handler {
  $env{'request.state'}    = "construct";   $env{'request.state'}    = "construct";
  $env{'request.filename'} = $r->filename;   $env{'request.filename'} = $r->filename;
   
  unless (&constructaccess($requrl,$r->dir_config('lonDefDomain'))) {   unless (&constructaccess($requrl,'setpriv')) {
     $r->log_reason("Unauthorized $requrl", $r->filename);       $r->log_reason("Unauthorized $requrl", $r->filename); 
     return HTTP_NOT_ACCEPTABLE;      return HTTP_NOT_ACCEPTABLE;
  }   }
Line 105  sub handler { Line 199  sub handler {
 1;  1;
 __END__  __END__
   
 =head1 NAME  
   
 Apache::lonacc - Cookie Based Access Handler for Construction Area  
   
 =head1 SYNOPSIS  
   
 Invoked (for various locations) by /etc/httpd/conf/loncapa_apache.conf:  
   
  PerlAccessHandler       Apache::loncacc  
   
 =head1 INTRODUCTION  
   
 This module enables cookie based authentication for construction area  
 and is used to control access for three (essentially equivalent) URIs.  
   
  <LocationMatch "^/priv.*">  
  <LocationMatch "^/\~.*">  
  <LocationMatch "^/\~.*/$">  
   
 Whenever the client sends the cookie back to the server,   
 if the cookie is missing or invalid, the user is re-challenged  
 for login information.  
   
 This is part of the LearningOnline Network with CAPA project  
 described at http://www.lon-capa.org.  
   
 =head1 HANDLER SUBROUTINE  
   
 This routine is called by Apache and mod_perl.  
   
 =over 4  
   
 =item *  
   
 load POST parameters  
   
 =item *  
   
 store where they wanted to go (first url entered)  
   
 =back  
   
 =head1 OTHERSUBROUTINES  
   
 =over 4  
   
 =item *  
   
 constructaccess($url,$ownerdomain) : See if the owner domain and name  
 in the URL match those in the expected environment.  If so, return   
 two element list ($ownername,$ownerdomain).  Else, return null string.  
   
 =back  
   
 =cut  
   
   
   

Removed from v.1.46  
changed lines
  Added in v.1.56


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