--- loncom/auth/lonauth.pm 2005/11/10 19:19:08 1.71 +++ loncom/auth/lonauth.pm 2006/10/06 14:29:44 1.82.2.1 @@ -1,7 +1,7 @@ # The LearningOnline Network # User Authentication Module # -# $Id: lonauth.pm,v 1.71 2005/11/10 19:19:08 www Exp $ +# $Id: lonauth.pm,v 1.82.2.1 2006/10/06 14:29:44 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -29,8 +29,8 @@ package Apache::lonauth; use strict; +use LONCAPA; use Apache::Constants qw(:common); -use Apache::File; use CGI qw(:standard); use CGI::Cookie(); use DynaLoader; # for Crypt::DES version @@ -40,14 +40,13 @@ use Apache::lonnet; use Apache::lonmenu(); use Fcntl qw(:flock); use Apache::lonlocal; -use POSIX qw(mktime); my %FORM; # ------------------------------------------------------------ Successful login sub success { - my ($r, $username, $domain, $authhost,$lowerurl) = @_; + my ($r, $username, $domain, $authhost, $lowerurl, $extra_env) = @_; my $lonids=$r->dir_config('lonIDsDir'); my $public=($username eq 'public' && $domain eq 'public'); @@ -89,7 +88,7 @@ sub success { # Initialize roles - $userroles=Apache::lonnet::rolesinit($domain,$username,$authhost); + $userroles=&Apache::lonnet::rolesinit($domain,$username,$authhost); } # ------------------------------------ Check browser type and MathML capability @@ -110,13 +109,13 @@ sub success { } # ------------------------------------------------------------- Get environment - my $userenv; my %userenv=Apache::lonnet::dump('environment',$domain,$username); my ($tmp) = keys(%userenv); if ($tmp !~ /^(con_lost|error|no_such_host)/i) { - foreach my $key (keys(%userenv)) { - $userenv.="environment.$key=$userenv{$key}\n"; - } + # default remote control to off + if ($userenv{'remote'} ne 'on') { $userenv{'remote'} = 'off'; } + } else { + undef(%userenv); } if (($userenv{'interface'}) && (!$FORM{'interface'})) { $FORM{'interface'}=$userenv{'interface'}; @@ -133,62 +132,58 @@ sub success { # --------------------------------------------------------- Write first profile { - my $idf=Apache::File->new(">$lonids/$cookie.id"); - unless (flock($idf,LOCK_EX)) { - &Apache::lonnet::logthis("WARNING: ". - 'Could not obtain exclusive lock in lonauth: '.$!); - $idf->close(); - return 'error: '.$!; - } - if ($userenv ne '') { print $idf "$userenv\n"; } - print $idf "user.name=$username\n"; - print $idf "user.domain=$domain\n"; - print $idf "user.home=$authhost\n"; - print $idf "browser.type=$clientbrowser\n"; - print $idf "browser.version=$clientversion\n"; - print $idf "browser.mathml=$clientmathml\n"; - print $idf "browser.unicode=$clientunicode\n"; - print $idf "browser.os=$clientos\n"; + my %initial_env = + ("user.name" => $username, + "user.domain" => $domain, + "user.home" => $authhost, + "browser.type" => $clientbrowser, + "browser.version" => $clientversion, + "browser.mathml" => $clientmathml, + "browser.unicode" => $clientunicode, + "browser.os" => $clientos, + "server.domain" => $r->dir_config('lonDefDomain'), + "request.course.fn" => '', + "request.course.uri" => '', + "request.course.sec" => '', + "request.role" => 'cm', + "request.role.adv" => $env{'user.adv'}, + "request.host" => $ENV{'REMOTE_ADDR'},); + if ($FORM{'localpath'}) { - print $idf "browser.localpath=$FORM{'localpath'}\n"; - print $idf "browser.localres=$FORM{'localres'}\n"; + $initial_env{"browser.localpath"} = $FORM{'localpath'}; + $initial_env{"browser.localres"} = $FORM{'localres'}; } - print $idf "server.domain=".$r->dir_config('lonDefDomain')."\n"; - my $timezone='UTC'; - my $timediff=POSIX::mktime(localtime())-POSIX::mktime(gmtime()); - if ($timediff) { - my $hours=int($timediff/3600); - my $minutes=abs(int(($timediff-$hours*3600)/60)); - my $sign="+"; - if ($timediff<0) { - $sign="-"; - } - $timezone.=$sign.abs($hours).':'.substr("0$minutes",-2); - } - print $idf "server.timezone=$timezone\n"; - print $idf "request.course.fn=\n"; - print $idf "request.course.uri=\n"; - print $idf "request.course.sec=\n"; - print $idf "request.role=cm\n"; - print $idf "request.role.adv=$env{'user.adv'}\n"; - print $idf "request.host=$ENV{'REMOTE_ADDR'}\n"; + if ($public) { - print $idf "environment.remote=off\n"; + $initial_env{"environment.remote"} = "off"; } if ($FORM{'interface'}) { $FORM{'interface'}=~s/\W//gs; - print $idf "browser.interface=$FORM{'interface'}\n"; + $initial_env{"browser.interface"} = $FORM{'interface'}; $env{'browser.interface'}=$FORM{'interface'}; - foreach ('imagesuppress','appletsuppress', - 'embedsuppress','fontenhance','blackwhite') { - if (($FORM{$_} eq 'true') || - ($userenv{$_} eq 'on')) { - print $idf "browser.$_=on\n"; + foreach my $option ('imagesuppress','appletsuppress', + 'embedsuppress','fontenhance','blackwhite') { + if (($FORM{$option} eq 'true') || + ($userenv{$option} eq 'on')) { + $initial_env{"browser.$option"} = "on"; } } } - if ($userroles ne '') { print $idf "$userroles"; } - $idf->close(); + + $env{'user.environment'} = "$lonids/$cookie.id"; + open(my $idf,">$lonids/$cookie.id"); + unless (flock($idf,LOCK_EX)) { + &Apache::lonnet::logthis("WARNING: ". + 'Could not obtain exclusive lock in lonauth: '.$!); + close($idf); + return 'error: '.$!; + } + + &add_to_env($idf,\%initial_env); + &add_to_env($idf,\%userenv,'environment.'); + &add_to_env($idf,$userroles); + &add_to_env($idf,$extra_env); + close($idf); } $env{'request.role'}='cm'; $env{'request.role.adv'}=$env{'user.adv'}; @@ -218,8 +213,11 @@ sub success { my $remoteinfo=&Apache::lonmenu::load_remote_msg($lowerurl); my $setflags=&Apache::lonmenu::setflags(); my $maincall=&Apache::lonmenu::maincall(); - my $bodytag=&Apache::loncommon::bodytag('Successful Login'); - my $add=&addcontent(); + my $start_page=&Apache::loncommon::start_page('Successful Login', + $startupremote, + {'no_inline_link' => 1,}); + my $end_page =&Apache::loncommon::end_page(); + my $continuelink; if (($env{'browser.interface'} eq 'textual') || ($env{'environment.remote'} eq 'off')) { @@ -227,11 +225,10 @@ sub success { } # ------------------------------------------------- Output for successful login - $r->send_cgi_header(<header_out('Set-cookie' => $cookie); + $r->send_http_header; -ENDHEADER my %lt=&Apache::lonlocal::texthash( 'wel' => 'Welcome', 'mes' => 'Welcome to the LearningOnline Network with CAPA. Please wait while your session is being set up', @@ -239,12 +236,7 @@ ENDHEADER 'log' => 'loginproblems.html', ); $r->print(< - -Successful Login to the LearningOnline Network with CAPA -$startupremote - -$bodytag +$start_page $setflags $windowinfo

$lt{'wel'}

@@ -253,68 +245,57 @@ $lt{'mes'}.

$remoteinfo $maincall $continuelink - - +$end_page ENDSUCCESS } +sub add_to_env { + my ($idf,$env_data,$prefix) = @_; + while (my ($key,$value) = each(%$env_data)) { + print $idf (&escape($prefix.$key).'='.&escape($value)."\n"); + $env{$prefix.$key} = $value; + } +} + # --------------------------------------------------------------- Failed login! sub failed { my ($r,$message) = @_; - my $bodytag=&Apache::loncommon::bodytag('Unsuccessful Login'); - my $add=&addcontent(); - $r->send_cgi_header(< 1,}); + my $end_page = &Apache::loncommon::end_page(); + + my %lt=('sorry' => &mt('Sorry ...'), + 'please' => + &mt('Please [_1]log in again[_2].', + "", + ''), + 'problemspage' => &mt('loginproblems.html'), + 'problems' => 'Problems', + ); + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; -ENDFHEADER $r->print(< - -Unsuccessful Login to the LearningOnline Network with CAPA - -$bodytag -

Sorry ...

+$start_page +

$lt{'sorry'}

$message

-

Please log in again.

+

$lt{'please'}

-Problems?

- - +$lt{'problems'}

+$end_page ENDFAILED } -# --------------------------------------------------------------------- Charset - -sub addcontent { - my $encoding=&Apache::lonlocal::current_encoding; - if ($encoding) { - return '; charset='.$encoding; - } else { - return ''; - } -} - # ------------------------------------------------------------------ Rerouting! sub reroute { - my $r=shift; - my $bodytag=&Apache::loncommon::bodytag('Rerouting'); - $r->send_cgi_header(<print(< - -Rerouting Login to the LearningOnline Network with CAPA - -$bodytag -

Sorry ...

-Please log in again. - - -ENDRFAILED + my ($r) = @_; + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; + my $msg='

Sorry ...

+ Please log in again.'; + &Apache::loncommon::simple_error_page($r,'Rerouting',$msg); } # ---------------------------------------------------------------- Main handler @@ -340,24 +321,20 @@ sub handler { my $lonidsdir=$r->dir_config('lonIDsDir'); if ((-e "$lonidsdir/$handle.id") && ($handle ne '')) { # Indeed, a valid token is found - $r->send_cgi_header(<send_http_header; + my $start_page = + &Apache::loncommon::start_page('Already logged in'); + my $end_page = + &Apache::loncommon::end_page(); $r->print(< - -Already logged in - -$bodytag +$start_page

You are already logged in

Please either continue the current session or logout.

Problems?

- - +$end_page ENDFAILED return OK; } @@ -367,7 +344,9 @@ ENDFAILED my $buffer; - $r->read($buffer,$r->header_in('Content-length'),0); + if ($r->header_in('Content-length') > 0) { + $r->read($buffer,$r->header_in('Content-length'),0); + } my @pairs=split(/&/,$buffer); my $pair; my $name; my $value; undef %FORM; @@ -404,9 +383,12 @@ ENDFAILED failed($r,'Information needed to verify your login information is missing, inaccessible or expired.'); return OK; } else { - unless (&Apache::lonnet::reply('tmpdel:'.$FORM{'logtoken'}, - $FORM{'serverid'}) eq 'ok') { + my $reply = &Apache::lonnet::reply('tmpdel:'.$FORM{'logtoken'}, + $FORM{'serverid'}); + if ( $reply ne 'ok' ) { &failed($r,'Session could not be opened.'); + &Apache::lonnet::logthis("ERROR got a reply of $reply when trying to contact ". $FORM{'serverid'}." to get login token"); + return OK; } } my ($key,$firsturl)=split(/&/,$tmpinfo); @@ -470,7 +452,12 @@ ENDFAILED &Apache::lonnet::logthis('Non-privileged user attempting switch user'); } } - &success($r,$FORM{'uname'},$FORM{'udom'},$authhost,$firsturl); + if ($r->dir_config("lonBalancer") eq 'yes') { + &success($r,$FORM{'uname'},$FORM{'udom'},$authhost,'noredirect'); + $r->internal_redirect('/adm/switchserver'); + } else { + &success($r,$FORM{'uname'},$FORM{'udom'},$authhost,$firsturl); + } return OK; }