--- loncom/auth/lonauth.pm 2003/02/20 06:49:23 1.41 +++ loncom/auth/lonauth.pm 2004/10/28 16:25:19 1.63 @@ -1,7 +1,7 @@ # The LearningOnline Network # User Authentication Module # -# $Id: lonauth.pm,v 1.41 2003/02/20 06:49:23 albertel Exp $ +# $Id: lonauth.pm,v 1.63 2004/10/28 16:25:19 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -42,9 +42,11 @@ use CGI qw(:standard); use CGI::Cookie(); use DynaLoader; # for Crypt::DES version use Crypt::DES; +use Apache::loncommon(); use Apache::lonnet(); use Apache::lonmenu(); use Fcntl qw(:flock); +use Apache::lonlocal; my %FORM; @@ -77,36 +79,8 @@ sub success { # ------------------------------------ Check browser type and MathML capability - my @browsertype=split(/\&/,$r->dir_config("lonBrowsDet")); - my %mathcap=split(/\&/,$r->dir_config("lonMathML")); - my $httpbrowser=$ENV{"HTTP_USER_AGENT"}; - my $i; - my $clientbrowser='unknown'; - my $clientversion='0'; - my $clientmathml=''; - my $clientunicode='0'; - for ($i=0;$i<=$#browsertype;$i++) { - my ($bname,$match,$notmatch,$vreg,$minv,$univ)=split(/\:/,$browsertype[$i]); - if (($httpbrowser=~/$match/i) && ($httpbrowser!~/$notmatch/i)) { - $clientbrowser=$bname; - $httpbrowser=~/$vreg/i; - $clientversion=$1; - $clientmathml=($clientversion>=$minv); - $clientunicode=($clientversion>=$univ); - } - } - my $clientos='unknown'; - if (($httpbrowser=~/linux/i) || - ($httpbrowser=~/unix/i) || - ($httpbrowser=~/ux/i) || - ($httpbrowser=~/solaris/i)) { $clientos='unix'; } - if (($httpbrowser=~/vax/i) || - ($httpbrowser=~/vms/i)) { $clientos='vms'; } - if ($httpbrowser=~/next/i) { $clientos='next'; } - if (($httpbrowser=~/mac/i) || - ($httpbrowser=~/powerpc/i)) { $clientos='mac'; } - if ($httpbrowser=~/win/i) { $clientos='win'; } - if ($httpbrowser=~/embed/i) { $clientos='pda'; } + my ($httpbrowser,$clientbrowser,$clientversion,$clientmathml, + $clientunicode,$clientos) = &Apache::loncommon::decode_user_agent($r); # -------------------------------------- Any accessibility options to remember? if (($FORM{'interface'}) && ($FORM{'remember'} eq 'true')) { @@ -133,6 +107,13 @@ sub success { if (($userenv{'interface'}) && (!$FORM{'interface'})) { $FORM{'interface'}=$userenv{'interface'}; } + $ENV{'environment.remote'}=$userenv{'remote'}; +# --------------- Do not trust query string to be put directly into environment + foreach ('imagesuppress','appletsuppress', + 'embedsuppress','fontenhance','blackwhite', + 'interface','localpath','localres') { + $FORM{$_}=~s/[\n\r\=]//gs; + } # --------------------------------------------------------- Write first profile { @@ -152,11 +133,16 @@ sub success { print $idf "browser.mathml=$clientmathml\n"; print $idf "browser.unicode=$clientunicode\n"; print $idf "browser.os=$clientos\n"; + if ($FORM{'localpath'}) { + print $idf "browser.localpath=$FORM{'localpath'}\n"; + print $idf "browser.localres=$FORM{'localres'}\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.host=$ENV{'HTTP_HOST'}\n"; + print $idf "request.role.adv=$ENV{'user.adv'}\n"; + print $idf "request.host=$ENV{'REMOTE_ADDR'}\n"; if ($FORM{'interface'}) { $FORM{'interface'}=~s/\W//gs; print $idf "browser.interface=$FORM{'interface'}\n"; @@ -173,6 +159,7 @@ sub success { $idf->close(); } $ENV{'request.role'}='cm'; + $ENV{'request.role.adv'}=$ENV{'user.adv'}; $ENV{'browser.type'}=$clientbrowser; # -------------------------------------------------------------------- Log this @@ -194,29 +181,37 @@ sub success { # -------------------------------------------------------- Menu script and info my $windowinfo=&Apache::lonmenu::open($clientos); my $startupremote=&Apache::lonmenu::startupremote($lowerurl); + 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(); # ------------------------------------------------- Output for successful login $r->send_cgi_header(< 'Welcome', + 'mes' => 'Welcome to the LearningOnline Network with CAPA. Please wait while your session is being set up', + 'pro' => 'Problems', + 'log' => 'loginproblems.html', + ); $r->print(< Successful Login to the LearningOnline Network with CAPA $startupremote - +$bodytag $setflags $windowinfo -

Welcome!

-Welcome to the LearningOnline Network with CAPA. -Please wait while your session -is being set up.

-Problems?

+

$lt{'wel'}

+$lt{'mes'}.

+$lt{'pro'}?

+$remoteinfo $maincall @@ -227,8 +222,10 @@ ENDSUCCESS sub failed { my ($r,$message) = @_; + my $bodytag=&Apache::loncommon::bodytag('Unsuccessful Login'); + my $add=&addcontent(); $r->send_cgi_header(<print(< Unsuccessful Login to the LearningOnline Network with CAPA - - +$bodytag

Sorry ...

-

$message to use the LearningOnline Network with CAPA

+

$message

+

Please log in again.

+

+Problems?

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 +} + # ---------------------------------------------------------------- Main handler sub handler { my $r = shift; +# Are we re-routing? + if (-e '/home/httpd/html/lon-status/reroute.txt') { + &reroute($r); + return OK; + } + + &Apache::lonlocal::get_language_handle($r); + +# -------------------------------- Prevent users from attempting to login twice + my %cookies=CGI::Cookie->parse($r->header_in('Cookie')); + my $lonid=$cookies{'lonID'}; + my $cookie; + if ($lonid) { + my $handle=$lonid->value; + $handle=~s/\W//g; + my $lonidsdir=$r->dir_config('lonIDsDir'); + if ((-e "$lonidsdir/$handle.id") && ($handle ne '')) { +# Indeed, a valid token is found + $r->send_cgi_header(<print(< + +Already logged in + +$bodytag +

You are already logged in

+

Please either continue the current session or +logout.

+

+Problems?

+ + +ENDFAILED + return OK; + } + } + +# ---------------------------------------------------- No valid token, continue + + my $buffer; - $r->read($buffer,$r->header_in('Content-length')); + $r->read($buffer,$r->header_in('Content-length'),0); my @pairs=split(/&/,$buffer); my $pair; my $name; my $value; undef %FORM; @@ -264,10 +340,15 @@ sub handler { } if ((!$FORM{'uname'}) || (!$FORM{'upass'}) || (!$FORM{'udom'})) { - failed($r,'Username, password and domain need to be specified'); + failed($r,'Username, password and domain need to be specified.'); return OK; } + +# split user logging in and "su"-user + + ($FORM{'uname'},$FORM{'suname'})=split(/\:/,$FORM{'uname'}); $FORM{'uname'} =~ s/\W//g; + $FORM{'suname'} =~ s/\W//g; $FORM{'udom'} =~ s/\W//g; my $role = $r->dir_config('lonRole'); @@ -280,10 +361,14 @@ sub handler { $FORM{'serverid'}); if (($tmpinfo=~/^error/) || ($tmpinfo eq 'con_lost')) { - failed($r,'Login token missing, inaccessible or expired'); + 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') { + &failed($r,'Session could not be opened.'); + } } - my ($key,$firsturl)=split(/&/,$tmpinfo); my $keybin=pack("H16",$key); @@ -312,15 +397,37 @@ sub handler { # --------------------------------------------------------------------- Failed? if ($authhost eq 'no_host') { - failed($r,'Username and/or password could not be authenticated'); + failed($r,'Username and/or password could not be authenticated.'); return OK; } - if (($firsturl eq '') || ($firsturl eq '/adm/logout')) { + if (($firsturl eq '') || + ($firsturl=~/^\/adm\/(logout|remote)/)) { $firsturl='/adm/roles'; } - - success($r,$FORM{'uname'},$FORM{'udom'},$authhost,$firsturl); +# --------------------------------- Are we attempting to login as somebody else? + if ($FORM{'suname'}) { +# ------------ see if the original user has enough privileges to pull this stunt + if (&Apache::lonnet::privileged($FORM{'uname'},$FORM{'udom'})) { +# ---------------------------------------------------- see if the su-user exists + unless (&Apache::lonnet::homeserver($FORM{'suname'},$FORM{'udom'}) + eq 'no_host') { + &Apache::lonnet::logthis(&Apache::lonnet::homeserver($FORM{'suname'},$FORM{'udom'})); +# ------------------------------ see if the su-user is not too highly privileged + unless (&Apache::lonnet::privileged($FORM{'suname'},$FORM{'udom'})) { +# -------------------------------------------------------- actually switch users + &Apache::lonnet::logperm('User '.$FORM{'uname'}.' at '.$FORM{'udom'}. + ' logging in as '.$FORM{'suname'}); + $FORM{'uname'}=$FORM{'suname'}; + } else { + &Apache::lonnet::logthis('Attempted switch user to privileged user'); + } + } + } else { + &Apache::lonnet::logthis('Non-privileged user attempting switch user'); + } + } + &success($r,$FORM{'uname'},$FORM{'udom'},$authhost,$firsturl); return OK; }