Annotation of loncom/auth/lonroles.pm, revision 1.46.2.2

1.1       harris41    1: # The LearningOnline Network with CAPA
                      2: # User Roles Screen
1.31      www         3: #
1.46.2.2! albertel    4: # $Id: lonroles.pm,v 1.46.2.1 2003/03/19 21:54:32 albertel Exp $
1.31      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.1       harris41   28: # (Directory Indexer
                     29: # (Login Screen
1.32      harris41   30: # YEAR=1999
1.1       harris41   31: # 5/21/99,5/22,5/25,5/26,5/31,6/2,6/10,7/12,7/14 Gerd Kortemeyer)
                     32: # 11/23 Gerd Kortemeyer)
1.32      harris41   33: # YEAR=2000
1.7       www        34: # 1/14,03/06,06/01,07/22,07/24,07/25,
1.19      www        35: # 09/04,09/06,09/28,09/29,09/30,10/2,10/5,10/26,10/28,
1.20      www        36: # 12/08,12/28,
1.32      harris41   37: # YEAR=2001
1.20      www        38: # 01/15/01 Gerd Kortemeyer
1.22      harris41   39: # 02/27/01 Scott Harrison
1.28      www        40: # 03/02,05/03,05/25,05/30,06/01,07/06,08/06 Gerd Kortemeyer
1.32      harris41   41: # 12/21 Scott Harrison
1.33      www        42: # 12/29 Gerd Kortemeyer
1.32      harris41   43: #
                     44: ###
1.22      harris41   45: 
1.1       harris41   46: package Apache::lonroles;
                     47: 
                     48: use strict;
                     49: use Apache::lonnet();
1.7       www        50: use Apache::lonuserstate();
1.1       harris41   51: use Apache::Constants qw(:common);
1.2       www        52: use Apache::File();
1.26      www        53: use Apache::lonmenu;
1.29      albertel   54: use Apache::loncommon;
1.1       harris41   55: 
                     56: sub handler {
1.10      www        57: 
1.1       harris41   58:     my $r = shift;
                     59: 
1.6       www        60:     my $now=time;
                     61:     my $then=$ENV{'user.login.time'};
                     62:     my $envkey;
                     63: 
1.10      www        64: 
1.6       www        65: # ================================================================== Roles Init
                     66: 
                     67:     if ($ENV{'form.selectrole'}) {
1.33      www        68: 	if ($ENV{'request.course.id'}) {
                     69: 	    my %temp=('logout_'.$ENV{'request.course.id'} => time);
                     70: 	    &Apache::lonnet::put('email_status',\%temp);
                     71:         }
1.40      matthew    72:        &Apache::lonnet::appenv("request.course.id"   => '',
                     73:                                "request.course.fn"   => '',
                     74:                                "request.course.uri"  => '',
                     75:                                "request.course.sec"  => '',
                     76:                                "request.role"        => 'cm',
                     77:                                "request.role.domain" => $ENV{'user.domain'}); 
1.13      www        78:         foreach $envkey (keys %ENV) {
1.40      matthew    79:             next if ($envkey!~/^user\.role\./);
                     80: 	    my (undef,undef,$role,@pwhere)=split(/\./,$envkey);
1.6       www        81:             my $where=join('.',@pwhere);
                     82:             my $trolecode=$role.'.'.$where;
                     83:             if ($ENV{'form.'.$trolecode}) {
                     84:                my ($tstart,$tend)=split(/\./,$ENV{$envkey});
                     85:                my $tstatus='is';
                     86:                if ($tstart) {
                     87:       		  if ($tstart>$then) { 
                     88:                      $tstatus='future';
                     89:                   }
                     90:                }
                     91:                if ($tend) {
                     92:                   if ($tend<$then) { $tstatus='expired'; }
1.19      www        93:                   if ($tend<$now) { $tstatus='will_not'; }
1.6       www        94:                }
                     95:                if ($tstatus eq 'is') {
1.13      www        96:                    $where=~s/^\///;
                     97:                    my ($cdom,$cnum,$csec)=split(/\//,$where);
1.40      matthew    98:                    &Apache::lonnet::appenv('request.role'        => $trolecode,
                     99:                                            'request.role.domain' => $cdom,
                    100:                                            'request.course.sec'  => $csec);
1.27      www       101:                    my $msg='Entering course ...';
1.25      www       102:                    if (($cnum) && ($role ne 'ca')) {
1.19      www       103: 		      my ($furl,$ferr)=
                    104: 			  &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
1.20      www       105:                       if (($ENV{'form.orgurl'}) && 
                    106:                           ($ENV{'form.orgurl'}!~/^\/adm\/flip/)) {
1.11      www       107:                          $r->internal_redirect($ENV{'form.orgurl'});
                    108:                          return OK;
1.19      www       109: 		     } else {
1.27      www       110:                          unless ($ENV{'request.course.id'}) {
                    111:                              &Apache::lonnet::appenv(
                    112: 				 "request.course.id"  => $cdom.'_'.$cnum);
                    113:                              $furl='/adm/notfound.html';
                    114:                              $msg=
                    115: 	 '<h1><font color=red>Could not initialize top-level map.</font></h1>';
                    116:                           }
1.20      www       117: 	                 $r->content_type('text/html');
1.30      albertel  118:                          &Apache::loncommon::no_cache($r);
1.20      www       119:                          $r->send_http_header;
1.36      matthew   120:                          my $swinfo=&Apache::lonmenu::rawconfig($r);
1.43      www       121:                          my $bodytag=&Apache::loncommon::bodytag('Switching Role');
1.20      www       122:                          print (<<ENDREDIR);
                    123: <head><title>Entering Course</title>
                    124: <meta HTTP-EQUIV="Refresh" CONTENT="1; url=$furl">
                    125: </head>
                    126: <html>
1.43      www       127: $bodytag
1.26      www       128: <script>
                    129: $swinfo
                    130: </script>
1.43      www       131: <h1>$msg</h1>
1.20      www       132: </body>
                    133: </html>
                    134: ENDREDIR
                    135:                             return OK;
1.19      www       136:                      }
1.7       www       137:                    }
1.6       www       138:                }
                    139:             } 
                    140:         }
1.40      matthew   141:     }
1.44      www       142: 
1.10      www       143: 
1.6       www       144: # =============================================================== No Roles Init
1.10      www       145: 
                    146:     $r->content_type('text/html');
1.30      albertel  147:     &Apache::loncommon::no_cache($r);
1.10      www       148:     $r->send_http_header;
                    149:     return OK if $r->header_only;
                    150: 
1.36      matthew   151:     my $swinfo=&Apache::lonmenu::rawconfig($r);
1.41      www       152:     my $bodytag=&Apache::loncommon::bodytag('User Roles');
1.44      www       153:     my $helptag=&Apache::loncommon::help_open_topic("General_Intro","HELP");
1.10      www       154:     $r->print(<<ENDHEADER);
                    155: <html>
                    156: <head>
                    157: <title>LON-CAPA User Roles</title>
1.41      www       158: </head>
                    159: $bodytag
1.45      www       160: $helptag<br />
1.26      www       161: <script>
                    162: $swinfo
                    163: window.focus();
                    164: </script>
1.10      www       165: ENDHEADER
1.6       www       166: 
1.2       www       167: # ------------------------------------------ Get Error Message from Environment
                    168: 
                    169:     my ($fn,$priv,$nochoose,$error,$msg)=split(/:/,$ENV{'user.error.msg'});
1.12      www       170:     if ($ENV{'user.error.msg'}) {
                    171:        $r->log_reason(
                    172:      "$msg for $ENV{'user.name'} domain $ENV{'user.domain'} access $priv",$fn);
                    173:     }
1.1       harris41  174: 
1.6       www       175: # ---------------------------------------------------------------- Who is this?
                    176: 
                    177:     my $advanced=0;
                    178:     foreach $envkey (keys %ENV) {
                    179:         if ($envkey=~/^user\.role\./) {
1.40      matthew   180: 	    my (undef,undef,$role,@pwhere)=split(/\./,$envkey);
1.6       www       181:             if ($role ne 'st') { $advanced=1; }
                    182:         }
                    183:     }
                    184: 
1.2       www       185: # -------------------------------------------------------- Generate Page Output
1.6       www       186: # --------------------------------------------------------------- Error Header?
1.2       www       187:     if ($error) {
                    188: 	$r->print("<h1>LON-CAPA Access Control</h1>");
1.4       www       189:         $r->print("<hr><pre>Access  : ".
                    190:                   Apache::lonnet::plaintext($priv)."\n");
                    191:         $r->print("Resource: $fn\n");
                    192:         $r->print("Action  : $msg\n</pre><hr>");
1.2       www       193:     } else {
1.25      www       194:         if ($ENV{'user.error.msg'}) {
                    195: 	    $r->print(
                    196:  '<h3><font color=red>You need to choose another user role or '.
                    197:  'enter a specific course for this function</font></h3>');
                    198: 	}
1.2       www       199:     }
1.6       www       200: # -------------------------------------------------------- Choice or no choice?
1.2       www       201:     if ($nochoose) {
1.6       www       202:         if ($advanced) {
                    203: 	   $r->print("<h2>Assigned User Roles</h2>\n");
                    204:         } else {
                    205:            $r->print("<h2>Sorry ...</h2>\nThis resource might be part of");
                    206:            if ($ENV{'request.course.id'}) {
                    207: 	       $r->print(' another');
                    208:            } else {
                    209:                $r->print(' a certain');
                    210:            } 
                    211:            $r->print(' course.</body></html>');
                    212:            return OK;
                    213:         } 
                    214:     } else {
                    215:         if ($advanced) {
1.35      matthew   216:            $r->print("Your home server is ".
                    217:                      $Apache::lonnet::hostname{&Apache::lonnet::homeserver
1.39      stredwic  218:                      ($ENV{'user.name'},$ENV{'user.domain'})}.
1.38      stredwic  219: 		     "<br />\n");
1.35      matthew   220:            $r->print("Author and Co-Author roles may not be available on ".
                    221:                      "servers other than your home server.");
1.6       www       222:         } else {
                    223: 	   $r->print("<h2>Enter a Course</h2>\n");
1.17      www       224:         }
1.18      www       225:         if (($ENV{'REDIRECT_QUERY_STRING'}) && ($fn)) {
                    226:     	    $fn.='?'.$ENV{'REDIRECT_QUERY_STRING'};
1.6       www       227:         }
1.11      www       228:         $r->print('<form method=post action="'.(($fn)?$fn:$r->uri).'">');
1.6       www       229:         $r->print('<input type=hidden name=orgurl value="'.$fn.'">');
                    230:         $r->print('<input type=hidden name=selectrole value=1>');
                    231:     }
1.27      www       232:     $r->print('<br>Show all roles: <input type=checkbox name=showall');
                    233:     if ($ENV{'form.showall'}) { $r->print(' checked'); }
                    234:     $r->print('><input type=submit value="Display"><br>');
1.6       www       235: # ----------------------------------------------------------------------- Table
                    236:     $r->print('<table><tr>');
                    237:     unless ($nochoose) { $r->print('<th>&nbsp;</th>'); }
                    238:        $r->print('<th>User Role</th><th colspan=2>Extent</th>'.
                    239:                  '<th>Start</th><th>End</th><th>Remark</th></tr>'."\n");
1.4       www       240: 
1.3       albertel  241:     foreach $envkey (sort keys %ENV) {
1.35      matthew   242:         my $button = 1;
1.2       www       243:         if ($envkey=~/^user\.role\./) {
1.40      matthew   244: 	    my (undef,undef,$role,@pwhere)=split(/\./,$envkey);
1.46      matthew   245:             next if (!defined($role) || $role eq '');
1.4       www       246:             my $where=join('.',@pwhere);
1.6       www       247:             my $trolecode=$role.'.'.$where;
1.4       www       248:             my ($tstart,$tend)=split(/\./,$ENV{$envkey});
                    249:             my $tremark='';
                    250:             my $tstatus='is';
                    251:             my $tpstart='&nbsp;';
                    252:             my $tpend='&nbsp;';
                    253:             if ($tstart) {
                    254: 		if ($tstart>$then) { 
1.35      matthew   255:                     $tstatus='future';
                    256:                     if ($tstart<$now) { $tstatus='will'; }
1.4       www       257:                 }
                    258:                 $tpstart=localtime($tstart);
                    259:             }
                    260:             if ($tend) {
1.23      www       261:                 if ($tend<$then) { 
1.35      matthew   262:                     $tstatus='expired'; 
1.23      www       263:                 } elsif ($tend<$now) { 
1.35      matthew   264:                     $tstatus='will_not'; 
1.23      www       265:                 }
1.4       www       266:                 $tpend=localtime($tend);
                    267:             }
1.6       www       268:             if ($ENV{'request.role'} eq $trolecode) {
                    269: 		$tstatus='selected';
                    270:             }
1.4       www       271:             my $tbg;
1.35      matthew   272:             if (($tstatus eq 'is') || ($tstatus eq 'selected') ||
                    273:                 ($ENV{'form.showall'})) {
                    274:                 if ($tstatus eq 'is') {
                    275:                     $tbg='#77FF77';
                    276:                 } elsif ($tstatus eq 'future') {
                    277:                     $tbg='#FFFF77';
                    278:                 } elsif ($tstatus eq 'will') {
                    279:                     $tbg='#FFAA77';
                    280:                     $tremark.='Active at next login. ';
                    281:                 } elsif ($tstatus eq 'expired') {
                    282:                     $tbg='#FF7777';
                    283:                 } elsif ($tstatus eq 'will_not') {
                    284:                     $tbg='#AAFF77';
                    285:                     $tremark.='Expired after logout. ';
                    286:                 } elsif ($tstatus eq 'selected') {
                    287:                     $tbg='#11CC55';
                    288:                     $tremark.='Currently selected. ';
                    289:                 }
                    290:                 my $trole;
                    291:                 if ($role =~ /^cr\//) {
                    292:                     my ($rdummy,$rdomain,$rauthor,$rrole)=split(/\//,$role);
                    293:                     $tremark.='<br>Defined by '.$rauthor.' at '.$rdomain.'.';
                    294:                     $trole=$rrole;
1.8       www       295:                 } else {
1.35      matthew   296:                     $trole=Apache::lonnet::plaintext($role);
                    297:                 }
                    298:                 my $ttype;
                    299:                 my $twhere;
                    300:                 my ($tdom,$trest,$tsection)=
                    301:                     split(/\//,Apache::lonnet::declutter($where));
                    302:                 # First, Co-Authorship roles
                    303:                 if ($role eq 'ca') {
1.39      stredwic  304:                     my $home = &Apache::lonnet::homeserver($trest,$tdom);
1.35      matthew   305:                     $button = 0 if ($home ne $r->dir_config('lonHostID'));
                    306:                     #next if ($home eq 'no_host');
                    307:                     $home = $Apache::lonnet::hostname{$home};
                    308:                     $ttype='Construction Space';
                    309:                     $twhere='User: '.$trest.'<br />Domain: '.$tdom.'<br />'.
                    310:                         ' Server:&nbsp;'.$home;
                    311:                     $ENV{'course.'.$tdom.'_'.$trest.'.description'}='ca';
                    312:                 } elsif ($role eq 'au') {
                    313:                     # Authors
                    314:                     my $home = &Apache::lonnet::homeserver
1.39      stredwic  315:                         ($ENV{'user.name'},$ENV{'user.domain'});
1.35      matthew   316:                     $button = 0 if ($home ne $r->dir_config('lonHostID'));
                    317:                     #next if ($home eq 'no_host');
                    318:                     $home = $Apache::lonnet::hostname{$home};
                    319:                     $ttype='Construction Space';
                    320:                     $twhere='Domain: '.$tdom.'<br />Server:&nbsp;'.$home;
                    321:                     $ENV{'course.'.$tdom.'_'.$trest.'.description'}='ca';
                    322:                 } elsif ($trest) {
                    323:                     $ttype='Course';
                    324:                     if ($tsection) {
                    325:                         $ttype.='<br>Section/Group: '.$tsection;
1.37      albertel  326: 		    }
1.35      matthew   327:                     my $tcourseid=$tdom.'_'.$trest;
                    328:                     if ($ENV{'course.'.$tcourseid.'.description'}) {
1.46.2.1  albertel  329:                         $twhere=$ENV{'course.'.$tcourseid.'.description'};
                    330:                         unless ($twhere eq 'Currently not available') {
                    331:                            $twhere.=' <font size="-2">'.
1.46.2.2! albertel  332:         &Apache::loncommon::syllabuswrapper('Syllabus',$trest,$tdom).
1.46.2.1  albertel  333:                                     '</font>';
                    334: 		       }
1.8       www       335:                     } else {
1.35      matthew   336:                         my %newhash=Apache::lonnet::coursedescription
                    337:                             ($tcourseid);
                    338:                         if (%newhash) {
1.46.2.1  albertel  339:                             $twhere=$newhash{'description'}.
                    340:                               ' <font size="-2">'.
1.46.2.2! albertel  341:         &Apache::loncommon::syllabuswrapper('Syllabus',$trest,$tdom).
1.46.2.1  albertel  342:                               '</font>';
1.35      matthew   343:                         } else {
                    344:                             $twhere='Currently not available';
                    345:                             $ENV{'course.'.$tcourseid.'.description'}=$twhere;
                    346:                         }
1.8       www       347:                     }
1.37      albertel  348: 		    if ($role ne 'st') { $twhere.="<br />Domain:".$tdom; }
1.35      matthew   349:                 } elsif ($tdom) {
                    350:                     $ttype='Domain';
                    351:                     $twhere=$tdom;
                    352:                 } else {
                    353:                     $ttype='System';
                    354:                     $twhere='system wide';
1.13      www       355:                 }
1.35      matthew   356:  
                    357: # ----- do not trust the indention below here -----              
                    358:                 $r->print('<tr bgcolor='.$tbg.'>');
                    359:                 unless ($nochoose) {
                    360:                     if (!$button) {
                    361:                         $r->print('<td>&nbsp;</td>');
                    362:                     } elsif ($tstatus eq 'is') {
                    363:                         $r->print('<td><input type=submit value=Select name="'.
                    364:                                   $trolecode.'"></td>');
                    365:                     } elsif ($ENV{'user.adv'}) {
                    366:                         $r->print
                    367:                             ('<td><input type=submit value="Re-Initialize"'.
                    368:                              ' name="'.$trolecode.'"></td>');
                    369:                     } else {
                    370:                         $r->print('<td>&nbsp;</td>');
                    371:                     }
1.6       www       372:                 }
                    373:             $r->print('<td>'.$trole.'</td><td>'.
1.4       www       374: 		      $ttype.'</td><td>'.$twhere.'</td><td>'.$tpstart.
                    375:                       '</td><td>'.$tpend.
                    376:                       '</td><td>'.$tremark.'&nbsp;</td></tr>'."\n");
1.27      www       377: 	}
1.4       www       378:         }
                    379:     }
1.14      www       380:     my $tremark='';
                    381:     if ($ENV{'request.role'} eq 'cm') {
1.19      www       382: 	$r->print('<tr bgcolor="#11CC55">');
1.14      www       383:         $tremark='Currently selected.';
                    384:     } else {
                    385:         $r->print('<tr bgcolor="#77FF77">');
                    386:     }
                    387:     unless ($nochoose) {
                    388:        if ($ENV{'request.role'} ne 'cm') {
                    389:           $r->print('<td><input type=submit value=Select name="cm"></td>');
                    390:        } else {
                    391:           $r->print('<td>&nbsp;</td>');
                    392:        }
                    393:     }
                    394:     $r->print('<td colspan=5>No role specified'.
                    395:                       '</td><td>'.$tremark.'&nbsp;</td></tr>'."\n");
1.4       www       396: 
                    397:     $r->print('</table>');
                    398:     unless ($nochoose) {
                    399: 	$r->print("</form>\n");
                    400:     }
1.22      harris41  401: # ------------------------------------------------------------ Privileges Info
1.43      www       402:   if (($advanced) && (($ENV{'user.error.msg'}) || ($error))) {
1.22      harris41  403:     $r->print('<hr><h2>Current Privileges</h2>');
1.4       www       404: 
                    405:     foreach $envkey (sort keys %ENV) {
1.15      www       406:         if ($envkey=~/^user\.priv\.$ENV{'request.role'}\./) {
                    407:             my $where=$envkey;
                    408:             $where=~s/^user\.priv\.$ENV{'request.role'}\.//;
1.4       www       409:             my $ttype;
                    410:             my $twhere;
1.15      www       411:             my ($tdom,$trest,$tsec)=
1.8       www       412:                split(/\//,Apache::lonnet::declutter($where));
1.6       www       413:             if ($trest) {
1.24      www       414: 	      if ($ENV{'course.'.$tdom.'_'.$trest.'.description'} eq 'ca') {
                    415: 	        $ttype='Construction Space';
                    416:                 $twhere='User: '.$trest.', Domain: '.$tdom;
                    417:               } else {
1.4       www       418: 		$ttype='Course';
1.16      www       419:                 $twhere=$ENV{'course.'.$tdom.'_'.$trest.'.description'};
1.15      www       420:                 if ($tsec) {
                    421: 		    $twhere.=' (Section/Group: '.$tsec.')';
                    422:                 }
1.24      www       423: 	      }
1.4       www       424:             } elsif ($tdom) {
                    425:                 $ttype='Domain';
                    426:                 $twhere=$tdom;
                    427:             } else {
                    428:                 $ttype='System';
                    429:                 $twhere='/';
                    430:             }
                    431:             $r->print("\n<h3>".$ttype.': '.$twhere.'</h3><ul>');
1.32      harris41  432:             foreach (sort split(/:/,$ENV{$envkey})) {
1.4       www       433:               if ($_) {
                    434: 		  my ($prv,$restr)=split(/\&/,$_);
                    435:                   my $trestr='';
                    436:                   if ($restr ne 'F') {
                    437:                       my $i;
1.5       www       438:                       $trestr.=' (';
1.4       www       439:                       for ($i=0;$i<length($restr);$i++) {
1.5       www       440: 		         $trestr.=
                    441:                            Apache::lonnet::plaintext(substr($restr,$i,1));
                    442:                          if ($i<length($restr)-1) { $trestr.=', '; }
                    443: 		      }
                    444:                       $trestr.=')';
1.4       www       445:                   }
                    446:                   $r->print('<li>'.Apache::lonnet::plaintext($prv).$trestr.
                    447:                             '</li>');
                    448: 	      }
1.32      harris41  449:             }
1.4       www       450:             $r->print('</ul>');
1.2       www       451:         }
1.4       www       452:     }
1.6       www       453:   }
1.2       www       454: 
1.1       harris41  455:     $r->print("</body></html>\n");
                    456:     return OK;
                    457: } 
                    458: 
                    459: 1;
                    460: __END__
1.32      harris41  461: 
                    462: =head1 NAME
                    463: 
                    464: Apache::lonroles - User Roles Screen
                    465: 
                    466: =head1 SYNOPSIS
                    467: 
                    468: Invoked by /etc/httpd/conf/srm.conf:
                    469: 
                    470:  <Location /adm/roles>
                    471:  PerlAccessHandler       Apache::lonacc
                    472:  SetHandler perl-script
                    473:  PerlHandler Apache::lonroles
                    474:  ErrorDocument     403 /adm/login
                    475:  ErrorDocument	  500 /adm/errorhandler
                    476:  </Location>
                    477: 
                    478: =head1 INTRODUCTION
                    479: 
                    480: This module enables a user to select what role he wishes to
                    481: operate under (instructor, student, teaching assistant, course
                    482: coordinator, etc).  These roles are pre-established by the actions
                    483: of upper-level users.
                    484: 
                    485: This is part of the LearningOnline Network with CAPA project
                    486: described at http://www.lon-capa.org.
                    487: 
                    488: =head1 HANDLER SUBROUTINE
                    489: 
                    490: This routine is called by Apache and mod_perl.
                    491: 
                    492: =over 4
                    493: 
                    494: =item *
                    495: 
                    496: Roles Initialization (yes/no)
                    497: 
                    498: =item *
                    499: 
                    500: Get Error Message from Environment
                    501: 
                    502: =item *
                    503: 
                    504: Who is this?
                    505: 
                    506: =item *
                    507: 
                    508: Generate Page Output
                    509: 
                    510: =item *
                    511: 
                    512: Choice or no choice
                    513: 
                    514: =item *
                    515: 
                    516: Table
                    517: 
                    518: =item *
                    519: 
                    520: Privileges
                    521: 
                    522: =back
                    523: 
                    524: =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.