--- loncom/auth/lonauth.pm 2006/04/05 22:39:55 1.74 +++ loncom/auth/lonauth.pm 2006/06/02 21:23:49 1.79 @@ -1,7 +1,7 @@ # The LearningOnline Network # User Authentication Module # -# $Id: lonauth.pm,v 1.74 2006/04/05 22:39:55 albertel Exp $ +# $Id: lonauth.pm,v 1.79 2006/06/02 21:23:49 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,7 +40,6 @@ use Apache::lonnet; use Apache::lonmenu(); use Fcntl qw(:flock); use Apache::lonlocal; -use POSIX qw(strftime); my %FORM; @@ -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,15 +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) { # default remote control to off if ($userenv{'remote'} ne 'on') { $userenv{'remote'} = 'off'; } - foreach my $key (keys(%userenv)) { - $userenv.="environment.$key=$userenv{$key}\n"; - } + } else { + undef(%userenv); } if (($userenv{'interface'}) && (!$FORM{'interface'})) { $FORM{'interface'}=$userenv{'interface'}; @@ -135,52 +132,62 @@ 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=POSIX::strftime("%Z",localtime(time)); - 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(); + + 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: '.$!; + } + + while (my ($key,$value) = each(%initial_env)) { + print $idf (&escape($key).'='.&escape($value)."\n"); + } + while (my ($key,$value) = each(%userenv)) { + print $idf (&escape('environment.'.$key).'='.&escape($value)."\n"); + } + while (my ($key,$value) = each(%{$userroles})) { + print $idf (&escape($key).'='.&escape($value)."\n"); + } + close($idf); } $env{'request.role'}='cm'; $env{'request.role.adv'}=$env{'user.adv'}; @@ -211,7 +218,8 @@ sub success { my $setflags=&Apache::lonmenu::setflags(); my $maincall=&Apache::lonmenu::maincall(); my $start_page=&Apache::loncommon::start_page('Successful Login', - $startupremote); + $startupremote, + {'no_inline_link' => 1,}); my $end_page =&Apache::loncommon::end_page(); my $continuelink; @@ -249,7 +257,8 @@ ENDSUCCESS sub failed { my ($r,$message) = @_; - my $start_page = &Apache::loncommon::start_page('Unsuccessful Login'); + my $start_page = &Apache::loncommon::start_page('Unsuccessful Login',undef, + {'no_inline_link' => 1,}); my $end_page = &Apache::loncommon::end_page(); my %lt=('sorry' => &mt('Sorry ...'), @@ -368,9 +377,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);