Annotation of loncom/auth/lonacc.pm, revision 1.65

1.1       albertel    1: # The LearningOnline Network
                      2: # Cookie Based Access Handler
1.22      www         3: #
1.65    ! albertel    4: # $Id: lonacc.pm,v 1.64 2005/04/07 06:56:20 albertel Exp $
1.22      www         5: #
                      6: # Copyright Michigan State University Board of Trustees
                      7: #
                      8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
                      9: #
                     10: # LON-CAPA is free software; you can redistribute it and/or modify
                     11: # it under the terms of the GNU General Public License as published by
                     12: # the Free Software Foundation; either version 2 of the License, or
                     13: # (at your option) any later version.
                     14: #
                     15: # LON-CAPA is distributed in the hope that it will be useful,
                     16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
                     17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     18: # GNU General Public License for more details.
                     19: #
                     20: # You should have received a copy of the GNU General Public License
                     21: # along with LON-CAPA; if not, write to the Free Software
                     22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     23: #
                     24: # /home/httpd/html/adm/gpl.txt
                     25: #
                     26: # http://www.lon-capa.org/
                     27: #
1.25      harris41   28: ###
1.1       albertel   29: 
                     30: package Apache::lonacc;
                     31: 
                     32: use strict;
1.8       www        33: use Apache::Constants qw(:common :http :methods);
1.2       www        34: use Apache::File;
1.6       www        35: use Apache::lonnet;
1.25      harris41   36: use Apache::loncommon();
1.47      www        37: use Apache::lonlocal;
1.1       albertel   38: use CGI::Cookie();
1.16      www        39: use Fcntl qw(:flock);
1.1       albertel   40: 
                     41: sub handler {
                     42:     my $r = shift;
                     43:     my $requrl=$r->uri;
                     44:     my %cookies=CGI::Cookie->parse($r->header_in('Cookie'));
                     45:     my $lonid=$cookies{'lonID'};
                     46:     my $cookie;
                     47:     if ($lonid) {
                     48: 	my $handle=$lonid->value;
                     49:         $handle=~s/\W//g;
                     50:         my $lonidsdir=$r->dir_config('lonIDsDir');
                     51:         if ((-e "$lonidsdir/$handle.id") && ($handle ne '')) {
1.6       www        52: 
1.46      www        53: # ------------------------------------------------------ Initialize Environment
                     54: 
                     55:             &Apache::lonnet::transfer_profile_to_env($lonidsdir,$handle);
1.47      www        56: 
                     57: # --------------------------------------------------------- Initialize Language
                     58: 
1.48      www        59: 	    &Apache::lonlocal::get_language_handle($r);
1.46      www        60: 
                     61: # -------------------------------------------------------------- Resource State
1.6       www        62: 
1.51      albertel   63:             if ($requrl=~/^\/+(res|uploaded)\//) {
1.64      albertel   64:                $env{'request.state'} = "published";
1.17      www        65: 	    } else {
1.64      albertel   66: 	       $env{'request.state'} = 'unknown';
1.17      www        67:             }
1.64      albertel   68:             $env{'request.filename'} = $r->filename;
                     69:             $env{'request.noversionuri'} = &Apache::lonnet::deversion($requrl);
1.6       www        70: # -------------------------------------------------------- Load POST parameters
                     71: 
1.46      www        72: 	    &Apache::loncommon::get_posted_cgi($r);
1.6       www        73: 
                     74: # ---------------------------------------------------------------- Check access
                     75: 
1.37      albertel   76:             if ($requrl!~/^\/adm|public|prtspool\//) {
1.7       www        77: 		my $access=&Apache::lonnet::allowed('bre',$requrl);
                     78:                 if ($access eq '1') {
1.64      albertel   79: 		   $env{'user.error.msg'}="$requrl:bre:0:0:Choose Course";
1.7       www        80: 	           return HTTP_NOT_ACCEPTABLE; 
                     81:                 }
                     82:                 if (($access ne '2') && ($access ne 'F')) {
1.64      albertel   83: 		   $env{'user.error.msg'}="$requrl:bre:1:1:Access Denied";
1.7       www        84: 	           return HTTP_NOT_ACCEPTABLE; 
                     85:                 }
1.23      www        86:             }
1.37      albertel   87: 	    if ($requrl =~ m|^/prtspool/|) {
1.64      albertel   88: 		my $start='/prtspool/'.$env{'user.name'}.'_'.
                     89: 		    $env{'user.domain'};
1.37      albertel   90: 		if ($requrl !~ /^\Q$start\E/) {
1.64      albertel   91: 		    $env{'user.error.msg'}="$requrl:bre:1:1:Access Denied";
1.37      albertel   92: 		    return HTTP_NOT_ACCEPTABLE;
                     93: 		}
                     94: 	    }
1.23      www        95: # ------------------------------------------------------------- This is allowed
1.64      albertel   96:           if ($env{'request.course.id'}) {
1.24      www        97: 	    &Apache::lonnet::countacc($requrl);
1.23      www        98:             $requrl=~/\.(\w+)$/;
1.39      www        99:             if ((&Apache::loncommon::fileembstyle($1) eq 'ssi') ||
1.44      www       100:  ($requrl=~/^\/adm\/.*\/(aboutme|navmaps|smppg|bulletinboard)(\?|$)/) ||
                    101:  ($requrl=~/^\/adm\/wrapper\//) ||
1.53      albertel  102:  ($requrl=~m|\.problem/smpedit$|) ||
1.39      www       103:  ($requrl=~/^\/public\/.*\/syllabus$/)) {
1.23      www       104: # ------------------------------------- This is serious stuff, get symb and log
1.29      www       105: 		my $query=$r->args;
                    106:                 my $symb;
                    107:                 if ($query) {
                    108: 		    &Apache::loncommon::get_unprocessed_cgi($query,['symb']);
                    109:                 }
1.64      albertel  110:                 if ($env{'form.symb'}) {
                    111: 		    $symb=&Apache::lonnet::symbclean($env{'form.symb'});
1.52      raeburn   112:                     if ($requrl =~ m|^/adm/wrapper/|) {
                    113:                         my ($map,$mid,$murl)=&Apache::lonnet::decode_symb($symb);
1.63      albertel  114:                         &Apache::lonnet::symblist($map,$murl => [$murl,$mid],
                    115: 						  'last_known' =>[$murl,$mid]);
1.53      albertel  116:                     } elsif ((&Apache::lonnet::symbverify($symb,$requrl)) ||
                    117: 			     (($requrl=~m|(.*)/smpedit$|) &&
                    118: 			      &Apache::lonnet::symbverify($symb,$1))) {
1.50      albertel  119:                       my ($map,$mid,$murl)=&Apache::lonnet::decode_symb($symb);
1.63      albertel  120:                       &Apache::lonnet::symblist($map,$murl => [$murl,$mid],
                    121: 						'last_known' =>[$murl,$mid]);
1.31      www       122: 		    } else {
                    123: 			$r->log_reason('Invalid symb for '.$requrl.': '.
                    124:                                        $symb);
1.64      albertel  125: 		        $env{'user.error.msg'}=
1.31      www       126:                                 "$requrl:bre:1:1:Invalid Access";
                    127:   	                return HTTP_NOT_ACCEPTABLE; 
                    128:                     }
1.29      www       129:                 } else {
1.44      www       130: 	            $symb=&Apache::lonnet::symbread($requrl);
1.58      albertel  131: 		    if (&Apache::lonnet::is_on_map($requrl) && $symb &&
1.56      albertel  132: 			!&Apache::lonnet::symbverify($symb,$requrl)) {
1.58      albertel  133: 			$r->log_reason('Invalid symb for '.$requrl.': '.$symb);
1.64      albertel  134: 		        $env{'user.error.msg'}=
1.55      albertel  135:                                 "$requrl:bre:1:1:Invalid Access";
                    136:   	                return HTTP_NOT_ACCEPTABLE; 
                    137: 		    }
1.61      albertel  138: 		    if ($symb) {
1.65    ! albertel  139: 			my ($map,$mid,$murl)=
        !           140: 			    &Apache::lonnet::decode_symb($symb);
1.63      albertel  141: 			&Apache::lonnet::symblist($map,$murl =>[$murl,$mid],
                    142: 						'last_known' =>[$murl,$mid]);
1.61      albertel  143: 		    }
1.29      www       144:                 }
1.64      albertel  145:                 $env{'request.symb'}=$symb;
1.23      www       146:                 &Apache::lonnet::courseacclog($symb);
                    147:             } else {
                    148: # ------------------------------------------------------- This is other content
                    149:                 &Apache::lonnet::courseacclog($requrl);    
                    150:             }
                    151: 	  }
1.2       www       152:             return OK; 
1.1       albertel  153:         } else { 
1.5       www       154:             $r->log_reason("Cookie $handle not valid", $r->filename) 
1.1       albertel  155:         };
                    156:     }
1.6       www       157: 
1.21      www       158: # -------------------------------------------- See if this is a public resource
1.37      albertel  159:     if ($requrl=~m|^/public/|
                    160: 	|| (&Apache::lonnet::metadata($requrl,'copyright') eq 'public')) {
1.21      www       161:         &Apache::lonnet::logthis('Granting public access: '.$requrl);
1.60      albertel  162: 	&Apache::loncommon::get_posted_cgi($r);
1.64      albertel  163: 	$env{'user.name'}='public';
                    164:         $env{'user.domain'}='public';
                    165:         $env{'request.state'} = "published";
                    166:         $env{'request.publicaccess'} = 1;
                    167:         $env{'request.filename'} = $r->filename;
1.59      albertel  168: 	my ($httpbrowser,  $clientbrowser, $clientversion,
                    169: 	    $clientmathml, $clientunicode, $clientos) =
                    170: 		&Apache::loncommon::decode_user_agent($r);
1.64      albertel  171: 	$env{'browser.type'}=$clientbrowser;
                    172:         $env{'browser.version'}=$clientversion;
                    173:         $env{'browser.mathml'}=$clientmathml;
                    174:         $env{'browser.unicode'}=$clientunicode;
                    175:         $env{'browser.os'}=$clientos;
1.59      albertel  176: 
1.21      www       177:         return OK;
                    178:     }
1.34      www       179: # -------------------------------------------------------------- Not authorized
                    180:     $requrl=~/\.(\w+)$/;
1.62      albertel  181: #    if ((&Apache::loncommon::fileembstyle($1) eq 'ssi') ||
                    182: #        ($requrl=~/^\/adm\/(roles|logout|email|menu|remote)/) ||
                    183: #        ($requrl=~m|^/prtspool/|)) {
1.34      www       184: # -------------------------- Store where they wanted to go and get login screen
1.64      albertel  185: 	$env{'request.querystring'}=$r->args;
                    186: 	$env{'request.firsturl'}=$requrl;
1.34      www       187:        return FORBIDDEN;
1.62      albertel  188: #   } else {
1.34      www       189: # --------------------------------------------------------------------- Goodbye
1.62      albertel  190: #       return HTTP_BAD_REQUEST;
                    191: #   }
1.1       albertel  192: }
                    193: 
                    194: 1;
                    195: __END__
1.25      harris41  196: 
                    197: =head1 NAME
                    198: 
                    199: Apache::lonacc - Cookie Based Access Handler
                    200: 
                    201: =head1 SYNOPSIS
                    202: 
                    203: Invoked (for various locations) by /etc/httpd/conf/srm.conf:
                    204: 
                    205:  PerlAccessHandler       Apache::lonacc
                    206: 
                    207: =head1 INTRODUCTION
                    208: 
                    209: This module enables cookie based authentication and is used
                    210: to control access for many different LON-CAPA URIs.
                    211: 
                    212: Whenever the client sends the cookie back to the server, 
                    213: this cookie is handled by either lonacc.pm or loncacc.pm
                    214: (see srm.conf for what is invoked when).  If
                    215: the cookie is missing or invalid, the user is re-challenged
                    216: for login information.
                    217: 
                    218: This is part of the LearningOnline Network with CAPA project
                    219: described at http://www.lon-capa.org.
                    220: 
                    221: =head1 HANDLER SUBROUTINE
                    222: 
                    223: This routine is called by Apache and mod_perl.
                    224: 
                    225: =over 4
                    226: 
                    227: =item *
                    228: 
                    229: transfer profile into environment
                    230: 
                    231: =item *
                    232: 
                    233: load POST parameters
                    234: 
                    235: =item *
                    236: 
                    237: check access
                    238: 
                    239: =item *
                    240: 
                    241: if allowed, get symb, log, generate course statistics if applicable
                    242: 
                    243: =item *
                    244: 
                    245: otherwise return error
                    246: 
                    247: =item *
                    248: 
                    249: see if public resource
                    250: 
                    251: =item *
                    252: 
                    253: store attempted access
                    254: 
                    255: =back
                    256: 
                    257: =cut

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.