--- loncom/auth/lonlogin.pm 2003/08/26 19:47:33 1.44.2.1 +++ loncom/auth/lonlogin.pm 2011/03/03 06:37:30 1.147 @@ -1,7 +1,7 @@ # The LearningOnline Network # Login Screen # -# $Id: lonlogin.pm,v 1.44.2.1 2003/08/26 19:47:33 albertel Exp $ +# $Id: lonlogin.pm,v 1.147 2011/03/03 06:37:30 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -25,72 +25,124 @@ # # http://www.lon-capa.org/ # -# 5/21/99,5/22,5/25,5/26,5/31,6/2,6/10,7/12,7/14, -# 1/14/00,5/29,5/30,6/1,6/29,7/1,11/9, -# 1/17/01 Gerd Kortemeyer -# -# 2/7/02,2/8,2/12,2/14,2/15,2/19 Josh Brunskole -# -# 7/10/02 Jeremy Bowers package Apache::lonlogin; use strict; use Apache::Constants qw(:common); use Apache::File (); -use Apache::lonnet(); +use Apache::lonnet; use Apache::loncommon(); - +use Apache::lonauth(); +use Apache::lonlocal; +use Apache::migrateuser(); +use lib '/home/httpd/lib/perl/'; +use LONCAPA; + sub handler { my $r = shift; - $r->content_type('text/html'); + + &Apache::loncommon::get_unprocessed_cgi + (join('&',$ENV{'QUERY_STRING'},$env{'request.querystring'}, + $ENV{'REDIRECT_QUERY_STRING'}), + ['interface','username','domain','firsturl','localpath','localres', + 'token','role','symb']); + if (!defined($env{'form.firsturl'})) { + &Apache::lonacc::get_posted_cgi($r,['firsturl']); + } + +# -- check if they are a migrating user + if (defined($env{'form.token'})) { + return &Apache::migrateuser::handler($r); + } + &Apache::loncommon::no_cache($r); + &Apache::lonlocal::get_language_handle($r); + &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; return OK if $r->header_only; - &Apache::loncommon::get_unprocessed_cgi - ($ENV{'QUERY_STRING'}.'&'.$ENV{'request.querystring'}, - ['interface','username','domain','firsturl','localpath','localres']); - +# Are we re-routing? + if (-e '/home/httpd/html/lon-status/reroute.txt') { + &Apache::lonauth::reroute($r); + return OK; + } + + $env{'form.firsturl'} =~ s/(`)/'/g; + +# -------------------------------- Prevent users from attempting to login twice + my $handle = &Apache::lonnet::check_for_valid_session($r); + if ($handle ne '') { + my $lonidsdir=$r->dir_config('lonIDsDir'); + if ($handle=~/^publicuser\_/) { +# For "public user" - remove it, we apparently really want to login + unlink($r->dir_config('lonIDsDir')."/$handle.id"); + } else { +# Indeed, a valid token is found + &Apache::lonnet::transfer_profile_to_env($lonidsdir,$handle); + my $start_page = + &Apache::loncommon::start_page('Already logged in'); + my $end_page = + &Apache::loncommon::end_page(); + my $dest = '/adm/roles'; + if ($env{'form.firsturl'} ne '') { + $dest = $env{'form.firsturl'}; + } + $r->print( + $start_page + .'
'.&mt('Please either [_1]continue the current session[_2] or [_3]log out[_4].', + '','','','').'
' + .$end_page + ); + return OK; + } + } + +# ---------------------------------------------------- No valid token, continue + + # ---------------------------- Not possible to really login to domain "public" + if ($env{'form.domain'} eq 'public') { + $env{'form.domain'}=''; + $env{'form.username'}=''; + } # ----------------------------------------------------------- Process Interface - $ENV{'form.interface'}=~s/\W//g; + $env{'form.interface'}=~s/\W//g; - my $textbrowsers=$r->dir_config('lonTextBrowsers'); my $httpbrowser=$ENV{"HTTP_USER_AGENT"}; - - foreach (split(/\:/,$textbrowsers)) { - if ($httpbrowser=~/$_/i) { - $ENV{'form.interface'}='textual'; - } + + my $iconpath= + &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL')); + + my $lonhost = $r->dir_config('lonHostID'); + my $domain = &Apache::lonnet::default_login_domain(); + if ($lonhost ne '') { + my $redirect = &check_loginvia($domain,$lonhost); + if ($redirect) { + $r->print($redirect); + return OK; + } } - my $fullgraph=($ENV{'form.interface'} ne 'textual'); - my $port_to_use=$r->dir_config('lonhttpdPort'); - if (!defined($port_to_use)) { - $port_to_use='8080'; - } - my $iconpath= 'http://'.$ENV{'HTTP_HOST'}.':'.$port_to_use. - $r->dir_config('lonIconsURL'); - my $domain = $r->dir_config('lonDefDomain'); - if (($ENV{'form.domain'}) && - ($Apache::lonnet::domaindescription{$ENV{'form.domain'}})) { - $domain=$ENV{'form.domain'}; + if (($env{'form.domain'}) && + (&Apache::lonnet::domain($env{'form.domain'},'description'))) { + $domain=$env{'form.domain'}; } my $role = $r->dir_config('lonRole'); my $loadlim = $r->dir_config('lonLoadLim'); + my $uloadlim= $r->dir_config('lonUserLoadLim'); my $servadm = $r->dir_config('lonAdmEMail'); - my $sysadm = $r->dir_config('lonSysEMail'); - my $lonhost = $r->dir_config('lonHostID'); my $tabdir = $r->dir_config('lonTabDir'); my $include = $r->dir_config('lonIncludes'); my $expire = $r->dir_config('lonExpire'); my $version = $r->dir_config('lonVersion'); + my $host_name = &Apache::lonnet::hostname($lonhost); # --------------------------------------------- Default values for login fields - my $authusername=($ENV{'form.username'}?$ENV{'form.username'}:''); - my $authdomain=($ENV{'form.domain'}?$ENV{'form.domain'}:$domain); + my $authusername=($env{'form.username'}?$env{'form.username'}:''); + my $authdomain=($env{'form.domain'}?$env{'form.domain'}:$domain); # ---------------------------------------------------------- Determine own load my $loadavg; @@ -99,19 +151,20 @@ sub handler { $loadavg=<$loadfile>; } $loadavg =~ s/\s.*//g; - my $loadpercent=100*$loadavg/$loadlim; - my $userloadpercent=&Apache::lonnet::userload(); -# ------------------------------------------------------- Do the load balancing - my $otherserver='http://'.$ENV{'SERVER_NAME'}; - my $firsturl= - ($ENV{'request.firsturl'}?$ENV{'request.firsturl'}:$ENV{'form.firsturl'}); -# ---------------------------------------- Are we access server and overloaded? - if (($role eq 'access') && - (($userloadpercent>100.0)||($loadpercent>100.0))) { - $otherserver=Apache::lonnet::spareserver($loadpercent,$userloadpercent); + my ($loadpercent,$userloadpercent); + if ($loadlim) { + $loadpercent=sprintf("%.1f",100*$loadavg/$loadlim); } + if ($uloadlim) { + $userloadpercent=&Apache::lonnet::userload(); + } + + my $firsturl= + ($env{'request.firsturl'}?$env{'request.firsturl'}:$env{'form.firsturl'}); +# ----------------------------------------------------------- Get announcements + my $announcements=&Apache::lonnet::getannounce(); # -------------------------------------------------------- Set login parameters my @hexstr=('0','1','2','3','4','5','6','7', @@ -133,352 +186,502 @@ sub handler { if ($uextkey>2147483647) { $uextkey-=4294967296; } # -------------------------------------------------------- Store away log token + my $tokenextras; + if ($env{'form.role'}) { + $tokenextras = '&role='.&escape($env{'form.role'}); + } + if ($env{'form.symb'}) { + if (!$tokenextras) { + $tokenextras = '&'; + } + $tokenextras .= '&symb='.&escape($env{'form.symb'}); + } my $logtoken=Apache::lonnet::reply( - 'tmpput:'.$ukey.$lkey.'&'.$firsturl, + 'tmpput:'.$ukey.$lkey.'&'.$firsturl.$tokenextras, $lonhost); # ------------------- If we cannot talk to ourselves, we are in serious trouble if ($logtoken eq 'con_lost') { my $spares=''; - foreach (keys %Apache::lonnet::hostname) { - if ($_ ne $lonhost) { - $spares.='Please attempt to login to one of the following servers:
$spares -If the problem persists, please contact $servadm.
- -