[LON-CAPA-cvs] cvs: loncom /auth lonauth.pm lonlogin.pm

kruse kruse at source.lon-capa.org
Fri Dec 5 07:03:21 EST 2014


kruse		Fri Dec  5 12:03:21 2014 EDT

  Modified files:              
    /loncom/auth	lonlogin.pm lonauth.pm 
  Log:
  Disabled encryption and decryption of user's password for login, if the
  login server uses https. Otherwise encryption and decryption stay enabled.
  
  
-------------- next part --------------
Index: loncom/auth/lonlogin.pm
diff -u loncom/auth/lonlogin.pm:1.159 loncom/auth/lonlogin.pm:1.160
--- loncom/auth/lonlogin.pm:1.159	Sat Oct  4 02:59:32 2014
+++ loncom/auth/lonlogin.pm	Fri Dec  5 12:03:20 2014
@@ -1,733 +1,731 @@
-# The LearningOnline Network
-# Login Screen
-#
-# $Id: lonlogin.pm,v 1.159 2014/10/04 02:59:32 raeburn Exp $
-#
-# Copyright Michigan State University Board of Trustees
-#
-# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
-#
-# LON-CAPA is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# LON-CAPA is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with LON-CAPA; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-#
-# /home/httpd/html/adm/gpl.txt
-#
-# http://www.lon-capa.org/
-#
-
-package Apache::lonlogin;
-
-use strict;
-use Apache::Constants qw(:common);
-use Apache::File ();
-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;
-
-    &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','iptoken']);
-    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;
-
-
-# Are we re-routing?
-    my $londocroot = $r->dir_config('lonDocRoot'); 
-    if (-e "$londocroot/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
-                 .'<p class="LC_warning">'.&mt('You are already logged in!').'</p>'
-                 .'<p>'.&mt('Please either [_1]continue the current session[_2] or [_3]log out[_4].',
-                  '<a href="'.$dest.'">','</a>','<a href="/adm/logout">','</a>').'</p>'
-                 .$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'}='';
-    }
-
-# ------ Is this page requested because /adm/migrateuser detected an IP change?
-    my %sessiondata;
-    if ($env{'form.iptoken'}) {
-        %sessiondata = &Apache::lonnet::tmpget($env{'form.iptoken'});
-        unless ($sessiondata{'sessionserver'}) {
-            my $delete = &Apache::lonnet::tmpdel($env{'form.iptoken'});
-            delete($env{'form.iptoken'});
-        }
-    }
-# ----------------------------------------------------------- Process Interface
-    $env{'form.interface'}=~s/\W//g;
-
-    (undef,undef,undef,undef,undef,undef,my $clientmobile) =
-        &Apache::loncommon::decode_user_agent();
-
-    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 '') {
-        unless ($sessiondata{'sessionserver'}) {
-            my $redirect = &check_loginvia($domain,$lonhost);
-            if ($redirect) {
-                $r->print($redirect);
-                return OK;
-            }
-        }
-    }
-
-    if (($sessiondata{'domain'}) &&
-        (&Apache::lonnet::domain($env{'form.domain'},'description'))) {
-        $domain=$sessiondata{'domain'};
-    } elsif (($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 $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,$authdomain);
-    if ($sessiondata{'username'}) {
-        $authusername=$sessiondata{'username'};
-    } else {
-        $env{'form.username'} = &Apache::loncommon::cleanup_html($env{'form.username'});
-        $authusername=($env{'form.username'}?$env{'form.username'}:'');
-    }
-    if ($sessiondata{'domain'}) {
-        $authdomain=$sessiondata{'domain'};
-    } else {
-        $env{'form.domain'} = &Apache::loncommon::cleanup_html($env{'form.domain'});
-        $authdomain=($env{'form.domain'}?$env{'form.domain'}:$domain);
-    }
-
-# ---------------------------------------------------------- Determine own load
-    my $loadavg;
-    {
-	my $loadfile=Apache::File->new('/proc/loadavg');
-	$loadavg=<$loadfile>;
-    }
-    $loadavg =~ s/\s.*//g;
-
-    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',
-                '8','9','a','b','c','d','e','f');
-    my $lkey='';
-    for (0..7) {
-        $lkey.=$hexstr[rand(15)];
-    }
-
-    my $ukey='';
-    for (0..7) {
-        $ukey.=$hexstr[rand(15)];
-    }
-
-    my $lextkey=hex($lkey);
-    if ($lextkey>2147483647) { $lextkey-=4294967296; }
-
-    my $uextkey=hex($ukey);
-    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'});
-    }
-    if ($env{'form.iptoken'}) {
-        if (!$tokenextras) {
-            $tokenextras = '&&';
-        }
-        $tokenextras .= '&iptoken='.&escape($env{'form.iptoken'});
-    }
-    my $logtoken=Apache::lonnet::reply(
-       'tmpput:'.$ukey.$lkey.'&'.$firsturl.$tokenextras,
-       $lonhost);
-
-# -- If we cannot talk to ourselves, or hostID does not map to a hostname
-#    we are in serious trouble
-
-    if (($logtoken eq 'con_lost') || ($logtoken eq 'no_such_host')) {
-        if ($logtoken eq 'no_such_host') {
-            &Apache::lonnet::logthis('No valid logtoken for log-in page -- unable to determine hostname for hostID: '.$lonhost.'. Check entry in hosts.tab');
-        }
-        my $spares='';
-	my $last;
-        foreach my $hostid (sort
-			    {
-				&Apache::lonnet::hostname($a) cmp
-				    &Apache::lonnet::hostname($b);
-			    }
-			    keys(%Apache::lonnet::spareid)) {
-            next if ($hostid eq $lonhost);
-	    my $hostname = &Apache::lonnet::hostname($hostid);
-	    next if (($last eq $hostname) || ($hostname eq ''));
-            $spares.='<br /><font size="+1"><a href="http://'.
-                $hostname.
-                '/adm/login?domain='.$authdomain.'">'.
-                $hostname.'</a>'.
-                ' '.&mt('(preferred)').'</font>'.$/;
-	    $last=$hostname;
-        }
-        if ($spares) {
-            $spares.= '<br />';
-        }
-        my %all_hostnames = &Apache::lonnet::all_hostnames();
-        foreach my $hostid (sort
-		    {
-			&Apache::lonnet::hostname($a) cmp
-			    &Apache::lonnet::hostname($b);
-		    }
-		    keys(%all_hostnames)) {
-            next if ($hostid eq $lonhost || $Apache::lonnet::spareid{$hostid});
-            my $hostname = &Apache::lonnet::hostname($hostid);
-            next if (($last eq $hostname) || ($hostname eq ''));
-            $spares.='<br /><a href="http://'.
-	             $hostname.
-	             '/adm/login?domain='.$authdomain.'">'.
-	             $hostname.'</a>';
-            $last=$hostname;
-         }
-         $r->print(
-   '<html>'
-  .'<head><title>'
-  .&mt('The LearningOnline Network with CAPA')
-  .'</title></head>'
-  .'<body bgcolor="#FFFFFF">'
-  .'<h1>'.&mt('The LearningOnline Network with CAPA').'</h1>'
-  .'<img src="/adm/lonKaputt/lonlogo_broken.gif" align="right" />'
-  .'<h3>'.&mt('This LON-CAPA server is temporarily not available for login.').'</h3>');
-        if ($spares) {
-            $r->print('<p>'.&mt('Please attempt to login to one of the following servers:')
-                     .'</p>'
-                     .$spares);
-        }
-        $r->print('</body>'
-                 .'</html>'
-        );
-        return OK;
-    }
-
-# ----------------------------------------------- Apparently we are in business
-    $servadm=~s/\,/\<br \/\>/g;
-
-# ----------------------------------------------------------- Front page design
-    my $pgbg=&Apache::loncommon::designparm('login.pgbg',$domain);
-    my $font=&Apache::loncommon::designparm('login.font',$domain);
-    my $link=&Apache::loncommon::designparm('login.link',$domain);
-    my $vlink=&Apache::loncommon::designparm('login.vlink',$domain);
-    my $alink=&Apache::loncommon::designparm('login.alink',$domain);
-    my $mainbg=&Apache::loncommon::designparm('login.mainbg',$domain);
-    my $loginbox_bg=&Apache::loncommon::designparm('login.sidebg',$domain);
-    my $loginbox_header_bgcol=&Apache::loncommon::designparm('login.bgcol',$domain);
-    my $loginbox_header_textcol=&Apache::loncommon::designparm('login.textcol',$domain);
-    my $logo=&Apache::loncommon::designparm('login.logo',$domain);
-    my $img=&Apache::loncommon::designparm('login.img',$domain);
-    my $domainlogo=&Apache::loncommon::domainlogo($domain);
-    my $showbanner = 1;
-    my $showmainlogo = 1;
-    if (defined(&Apache::loncommon::designparm('login.showlogo_img',$domain))) {
-        $showbanner = &Apache::loncommon::designparm('login.showlogo_img',$domain);
-    }
-    if (defined(&Apache::loncommon::designparm('login.showlogo_logo',$domain))) {
-        $showmainlogo = &Apache::loncommon::designparm('login.showlogo_logo',$domain);
-    }
-    my $showadminmail;
-    my @possdoms = &Apache::lonnet::current_machine_domains();
-    if (grep(/^\Q$domain\E$/, at possdoms)) {
-        $showadminmail=&Apache::loncommon::designparm('login.adminmail',$domain);
-    }
-    my $showcoursecat =
-        &Apache::loncommon::designparm('login.coursecatalog',$domain);
-    my $shownewuserlink = 
-        &Apache::loncommon::designparm('login.newuser',$domain);
-    my $showhelpdesk =
-        &Apache::loncommon::designparm('login.helpdesk',$domain);
-    my $now=time;
-    my $js = (<<ENDSCRIPT);
-
-<script type="text/javascript" language="JavaScript">
-// <![CDATA[
-function send()
-{
-this.document.server.elements.uname.value
-=this.document.client.elements.uname.value;
-
-this.document.server.elements.udom.value
-=this.document.client.elements.udom.value;
-
-uextkey=this.document.client.elements.uextkey.value;
-lextkey=this.document.client.elements.lextkey.value;
-initkeys();
-
-this.document.server.elements.upass0.value
-    =crypted(this.document.client.elements.upass$now.value.substr(0,15));
-this.document.server.elements.upass1.value
-    =crypted(this.document.client.elements.upass$now.value.substr(15,15));
-this.document.server.elements.upass2.value
-    =crypted(this.document.client.elements.upass$now.value.substr(30,15));
-
-this.document.client.elements.uname.value='';
-this.document.client.elements.upass$now.value='';
-
-this.document.server.submit();
-return false;
-}
-
-function enableInput() {
-    this.document.client.elements.upass$now.removeAttribute("readOnly");
-    this.document.client.elements.uname.removeAttribute("readOnly");
-    this.document.client.elements.udom.removeAttribute("readOnly");
-    return;
-}
-
-// ]]>
-</script>
-
-ENDSCRIPT
-
-# --------------------------------------------------- Print login screen header
-
-    my %add_entries = (
-	       bgcolor      => "$mainbg",
-	       text         => "$font",
-	       link         => "$link",
-	       vlink        => "$vlink",
-	       alink        => "$alink",
-               onload       => 'javascript:enableInput();',);
-
-    $r->print(&Apache::loncommon::start_page('The LearningOnline Network with CAPA Login',$js,
-			       { 'redirect'       => [$expire,'/adm/roles'], 
-				 'add_entries' => \%add_entries,
-				 'only_body'   => 1,}));
-
-# ----------------------------------------------------------------------- Texts
-
-    my %lt=&Apache::lonlocal::texthash(
-          'un'       => 'Username',
-          'pw'       => 'Password',
-          'dom'      => 'Domain',
-          'perc'     => 'percent',
-          'load'     => 'Server Load',
-          'userload' => 'User Load',
-          'catalog'  => 'Course/Community Catalog',
-          'log'      => 'Log in',
-          'help'     => 'Log-in Help',
-          'serv'     => 'Server',
-          'servadm'  => 'Server Administration',
-          'helpdesk' => 'Contact Helpdesk',
-          'forgotpw' => 'Forgot password?',
-          'newuser'  => 'New User?',
-       );
-# -------------------------------------------------- Change password field name
-
-    my $forgotpw = &forgotpwdisplay(%lt);
-    $forgotpw .= '<br />' if $forgotpw;
-    my $loginhelp = &Apache::lonauth::loginhelpdisplay($authdomain);
-    if ($loginhelp) {
-        $loginhelp = '<a href="'.$loginhelp.'">'.$lt{'help'}.'</a><br />';
-    }
-
-# ---------------------------------------------------- Serve out DES JavaScript
-    {
-    my $jsh=Apache::File->new($include."/londes.js");
-    $r->print(<$jsh>);
-    }
-# ---------------------------------------------------------- Serve rest of page
-
-    $r->print(
-    '<div class="LC_Box"'
-   .' style="margin:0 auto; padding:10px; width:90%; height: auto; background-color:#FFFFFF;">'
-);
-
-    $r->print(<<ENDSERVERFORM);
-<form name="server" action="/adm/authenticate" method="post" target="_top">
-   <input type="hidden" name="logtoken" value="$logtoken" />
-   <input type="hidden" name="serverid" value="$lonhost" />
-   <input type="hidden" name="uname" value="" />
-   <input type="hidden" name="upass0" value="" />
-   <input type="hidden" name="upass1" value="" />
-   <input type="hidden" name="upass2" value="" />
-   <input type="hidden" name="udom" value="" />
-   <input type="hidden" name="localpath" value="$env{'form.localpath'}" />
-   <input type="hidden" name="localres" value="$env{'form.localres'}" />
-  </form>
-ENDSERVERFORM
-    my $coursecatalog;
-    if (($showcoursecat eq '') || ($showcoursecat)) {
-        $coursecatalog = &coursecatalog_link($lt{'catalog'}).'<br />';
-    }
-    my $newuserlink;
-    if ($shownewuserlink) {
-        $newuserlink = &newuser_link($lt{'newuser'}).'<br />';
-    }
-    my $logintitle =
-        '<h2 class="LC_hcell"'
-       .' style="background:'.$loginbox_header_bgcol.';'
-       .' color:'.$loginbox_header_textcol.'">'
-       .$lt{'log'}
-       .'</h2>';
-
-    my $noscript_warning='<noscript><span class="LC_warning"><b>'
-                        .&mt('Use of LON-CAPA requires Javascript to be enabled in your web browser.')
-                        .'</b></span></noscript>';
-    my $helpdeskscript;
-    my $contactblock = &contactdisplay(\%lt,$servadm,$showadminmail,
-                                       $authdomain,\$helpdeskscript,
-                                       $showhelpdesk,\@possdoms);
-
-    my $mobileargs;
-    if ($clientmobile) {
-        $mobileargs = 'autocapitalize="off" autocorrect="off"'; 
-    }
-    my $loginform=(<<LFORM);
-<form name="client" action="" onsubmit="return(send())">
-  <input type="hidden" name="lextkey" value="$lextkey" />
-  <input type="hidden" name="uextkey" value="$uextkey" />
-  <b><label for="uname">$lt{'un'}</label>:</b><br />
-  <input type="text" name="uname" id="uname" size="15" value="$authusername" readonly="readonly" $mobileargs /><br />
-  <b><label for="upass$now">$lt{'pw'}</label>:</b><br />
-  <input type="password" name="upass$now" id="upass$now" size="15" readonly="readonly" /><br />
-  <b><label for="udom">$lt{'dom'}</label>:</b><br />
-  <input type="text" name="udom" id="udom" size="15" value="$authdomain" readonly="readonly" $mobileargs /><br />
-  <input type="submit" value="$lt{'log'}" />
-</form>
-LFORM
-
-    if ($showbanner) {
-        $r->print(<<HEADER);
-<!-- The LON-CAPA Header -->
-<div style="background:$pgbg;margin:0;width:100%;">
-  <img src="$img" border="0" alt="The Learning Online Network with CAPA" />
-</div>
-HEADER
-    }
-    $r->print(<<ENDTOP);
-<div style="float:left;margin-top:0;">
-<div class="LC_Box" style="background:$loginbox_bg;">
-  $logintitle
-  $loginform
-  $noscript_warning
-</div>
-  
-<div class="LC_Box" style="padding-top: 10px;">
-  $loginhelp
-  $forgotpw
-  $contactblock
-  $newuserlink
-  $coursecatalog
-</div>
-</div>
-
-<div>
-ENDTOP
-    if ($showmainlogo) {
-        $r->print(' <img src="'.$logo.'" alt="" />'."\n");
-    }
-$r->print(<<ENDTOP);
-$announcements
-</div>
-<hr style="clear:both;" />
-ENDTOP
-    my ($domainrow,$serverrow,$loadrow,$userloadrow,$versionrow);
-    $domainrow = <<"END";
-      <tr>
-       <td  align="left" valign="top">
-        <small><b>$lt{'dom'}: </b></small>
-       </td>
-       <td  align="left" valign="top">
-        <small><tt> $domain</tt></small>
-       </td>
-      </tr>
-END
-    $serverrow = <<"END";
-      <tr>
-       <td  align="left" valign="top">
-        <small><b>$lt{'serv'}: </b></small>
-       </td>
-       <td align="left" valign="top">
-        <small><tt> $lonhost ($role)</tt></small>
-       </td>
-      </tr>
-END
-    if ($loadlim) {
-        $loadrow = <<"END";
-      <tr>
-       <td align="left" valign="top">
-        <small><b>$lt{'load'}: </b></small>
-       </td>
-       <td align="left" valign="top">
-        <small><tt> $loadpercent $lt{'perc'}</tt></small>
-       </td>
-      </tr>
-END
-    }
-    if ($uloadlim) {
-        $userloadrow = <<"END";
-      <tr>
-       <td align="left" valign="top">
-        <small><b>$lt{'userload'}: </b></small>
-       </td>
-       <td align="left" valign="top">
-        <small><tt> $userloadpercent $lt{'perc'}</tt></small>
-       </td>
-      </tr>
-END
-    }
-    if (($version ne '') && ($version ne '<!-- VERSION -->')) {
-        $versionrow = <<"END";
-      <tr>
-       <td colspan="2" align="left">
-        <small>$version</small>
-       </td>
-      </tr>
-END
-    }
-
-    $r->print(<<ENDDOCUMENT);
-    <div style="float: left;">
-     <table border="0" cellspacing="0" cellpadding="0">
-$domainrow
-$serverrow
-$loadrow    
-$userloadrow
-$versionrow
-     </table>
-    </div>
-    <div style="float: right;">
-    $domainlogo
-    </div>
-    <br style="clear:both;" />
- </div>
-
-<script type="text/javascript">
-// <![CDATA[
-// the if prevents the script error if the browser can not handle this
-if ( document.client.uname ) { document.client.uname.focus(); }
-// ]]>
-</script>
-$helpdeskscript
-
-ENDDOCUMENT
-    my %endargs = ( 'noredirectlink' => 1, );
-    $r->print(&Apache::loncommon::end_page(\%endargs));
-    return OK;
-}
-
-sub check_loginvia {
-    my ($domain,$lonhost) = @_;
-    if ($domain eq '' || $lonhost eq '') {
-        return;
-    }
-    my %domconfhash = &Apache::loncommon::get_domainconf($domain);
-    my $loginvia = $domconfhash{$domain.'.login.loginvia_'.$lonhost};
-    my $loginvia_exempt = $domconfhash{$domain.'.login.loginvia_exempt_'.$lonhost};
-    my $output;
-    if ($loginvia ne '') {
-        my $noredirect;
-        my $ip = $ENV{'REMOTE_ADDR'};
-        if ($ip eq '127.0.0.1') {
-            $noredirect = 1;
-        } else {
-            if ($loginvia_exempt ne '') {
-                my @exempt = split(',',$loginvia_exempt);
-                if (grep(/^\Q$ip\E$/, at exempt)) {
-                    $noredirect = 1;
-                }
-            }
-        }
-        unless ($noredirect) {
-            my ($newhost,$path);
-            if ($loginvia =~ /:/) {
-                ($newhost,$path) = split(':',$loginvia);
-            } else {
-                $newhost = $loginvia;
-            }
-            if ($newhost ne $lonhost) {
-                if (&Apache::lonnet::hostname($newhost) ne '') {
-                    $output = &redirect_page($newhost,$path);
-                }
-            }
-        }
-    }
-    return $output;
-}
-
-sub redirect_page {
-    my ($desthost,$path) = @_;
-    my $protocol = $Apache::lonnet::protocol{$desthost};
-    $protocol = 'http' if ($protocol ne 'https');
-    unless ($path =~ m{^/}) {
-        $path = '/'.$path;
-    }
-    my $url = $protocol.'://'.&Apache::lonnet::hostname($desthost).$path;
-    if ($env{'form.firsturl'} ne '') {
-        $url .='?firsturl='.$env{'form.firsturl'};
-    }
-    my $start_page = &Apache::loncommon::start_page('Switching Server ...',undef,
-                                                    {'redirect' => [0,$url],});
-    my $end_page   = &Apache::loncommon::end_page();
-    return $start_page.$end_page;
-}
-
-sub contactdisplay {
-    my ($lt,$servadm,$showadminmail,$authdomain,$helpdeskscript,$showhelpdesk,
-        $possdoms) = @_;
-    my $contactblock;
-    my $origmail;
-    if (ref($possdoms) eq 'ARRAY') {
-        if (grep(/^\Q$authdomain\E$/,@{$possdoms})) { 
-            $origmail = $Apache::lonnet::perlvar{'lonSupportEMail'};
-        }
-    }
-    my $requestmail = 
-        &Apache::loncommon::build_recipient_list(undef,'helpdeskmail',
-                                                 $authdomain,$origmail);
-    unless ($showhelpdesk eq '0') {
-        if ($requestmail =~ m/[^\@]+\@[^\@]+/) {
-            $showhelpdesk = 1;
-        } else {
-            $showhelpdesk = 0;
-        }
-    }
-    if ($servadm && $showadminmail) {
-        $contactblock .= $$lt{'servadm'}.':<br />'.
-                         '<tt>'.$servadm.'</tt><br />';
-    }
-    if ($showhelpdesk) {
-        $contactblock .= '<a href="javascript:helpdesk()">'.$lt->{'helpdesk'}.'</a><br />';
-        my $thisurl = &escape('/adm/login');
-        $$helpdeskscript = <<"ENDSCRIPT";
-<script type="text/javascript">
-// <![CDATA[
-function helpdesk() {
-    var possdom = document.client.udom.value;
-    var codedom = possdom.replace( new RegExp("[^A-Za-z0-9.\\-]","g"),'');
-    if (codedom == '') {
-        codedom = "$authdomain";
-    }
-    var querystr = "origurl=$thisurl&codedom="+codedom;
-    document.location.href = "/adm/helpdesk?"+querystr;
-    return;
-}
-// ]]>
-</script>
-ENDSCRIPT
-    }
-    return $contactblock;
-}
-
-sub forgotpwdisplay {
-    my (%lt) = @_;
-    my $prompt_for_resetpw = 1; 
-    if ($prompt_for_resetpw) {
-        return '<a href="/adm/resetpw">'.$lt{'forgotpw'}.'</a>';
-    }
-    return;
-}
-
-sub coursecatalog_link {
-    my ($linkname) = @_;
-    return <<"END";
-      <a href="/adm/coursecatalog">$linkname</a>
-END
-}
-
-sub newuser_link {
-    my ($linkname) = @_;
-    return '<a href="/adm/createaccount">'.$linkname.'</a>';
-}
-
-1;
-__END__
+# The LearningOnline Network
+# Login Screen
+#
+# $Id: lonlogin.pm,v 1.160 2014/12/05 12:03:20 kruse Exp $
+#
+# Copyright Michigan State University Board of Trustees
+#
+# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
+#
+# LON-CAPA is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# LON-CAPA is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with LON-CAPA; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+# /home/httpd/html/adm/gpl.txt
+#
+# http://www.lon-capa.org/
+#
+
+package Apache::lonlogin;
+
+use strict;
+use Apache::Constants qw(:common);
+use Apache::File ();
+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;
+
+    &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','iptoken']);
+    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;
+
+
+# Are we re-routing?
+    my $londocroot = $r->dir_config('lonDocRoot'); 
+    if (-e "$londocroot/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
+                 .'<p class="LC_warning">'.&mt('You are already logged in!').'</p>'
+                 .'<p>'.&mt('Please either [_1]continue the current session[_2] or [_3]log out[_4].',
+                  '<a href="'.$dest.'">','</a>','<a href="/adm/logout">','</a>').'</p>'
+                 .$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'}='';
+    }
+
+# ------ Is this page requested because /adm/migrateuser detected an IP change?
+    my %sessiondata;
+    if ($env{'form.iptoken'}) {
+        %sessiondata = &Apache::lonnet::tmpget($env{'form.iptoken'});
+        my $delete = &Apache::lonnet::tmpdel($env{'form.token'});
+    }
+# ----------------------------------------------------------- Process Interface
+    $env{'form.interface'}=~s/\W//g;
+
+    (undef,undef,undef,undef,undef,undef,my $clientmobile) =
+        &Apache::loncommon::decode_user_agent();
+
+    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 '') {
+        unless ($sessiondata{'sessionserver'}) {
+            my $redirect = &check_loginvia($domain,$lonhost);
+            if ($redirect) {
+                $r->print($redirect);
+                return OK;
+            }
+        }
+    }
+
+    if (($sessiondata{'domain'}) &&
+        (&Apache::lonnet::domain($env{'form.domain'},'description'))) {
+        $domain=$sessiondata{'domain'};
+    } elsif (($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 $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,$authdomain);
+    if ($sessiondata{'username'}) {
+        $authusername=$sessiondata{'username'};
+    } else {
+        $env{'form.username'} = &Apache::loncommon::cleanup_html($env{'form.username'});
+        $authusername=($env{'form.username'}?$env{'form.username'}:'');
+    }
+    if ($sessiondata{'domain'}) {
+        $authdomain=$sessiondata{'domain'};
+    } else {
+        $env{'form.domain'} = &Apache::loncommon::cleanup_html($env{'form.domain'});
+        $authdomain=($env{'form.domain'}?$env{'form.domain'}:$domain);
+    }
+
+# ---------------------------------------------------------- Determine own load
+    my $loadavg;
+    {
+	my $loadfile=Apache::File->new('/proc/loadavg');
+	$loadavg=<$loadfile>;
+    }
+    $loadavg =~ s/\s.*//g;
+
+    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',
+                '8','9','a','b','c','d','e','f');
+    my $lkey='';
+    for (0..7) {
+        $lkey.=$hexstr[rand(15)];
+    }
+
+    my $ukey='';
+    for (0..7) {
+        $ukey.=$hexstr[rand(15)];
+    }
+
+    my $lextkey=hex($lkey);
+    if ($lextkey>2147483647) { $lextkey-=4294967296; }
+
+    my $uextkey=hex($ukey);
+    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.$tokenextras,
+       $lonhost);
+
+# -- If we cannot talk to ourselves, or hostID does not map to a hostname
+#    we are in serious trouble
+
+    if (($logtoken eq 'con_lost') || ($logtoken eq 'no_such_host')) {
+        if ($logtoken eq 'no_such_host') {
+            &Apache::lonnet::logthis('No valid logtoken for log-in page -- unable to determine hostname for hostID: '.$lonhost.'. Check entry in hosts.tab');
+        }
+        my $spares='';
+	my $last;
+        foreach my $hostid (sort
+			    {
+				&Apache::lonnet::hostname($a) cmp
+				    &Apache::lonnet::hostname($b);
+			    }
+			    keys(%Apache::lonnet::spareid)) {
+            next if ($hostid eq $lonhost);
+	    my $hostname = &Apache::lonnet::hostname($hostid);
+	    next if (($last eq $hostname) || ($hostname eq ''));
+            $spares.='<br /><font size="+1"><a href="http://'.
+                $hostname.
+                '/adm/login?domain='.$authdomain.'">'.
+                $hostname.'</a>'.
+                ' '.&mt('(preferred)').'</font>'.$/;
+	    $last=$hostname;
+        }
+        if ($spares) {
+            $spares.= '<br />';
+        }
+        my %all_hostnames = &Apache::lonnet::all_hostnames();
+        foreach my $hostid (sort
+		    {
+			&Apache::lonnet::hostname($a) cmp
+			    &Apache::lonnet::hostname($b);
+		    }
+		    keys(%all_hostnames)) {
+            next if ($hostid eq $lonhost || $Apache::lonnet::spareid{$hostid});
+            my $hostname = &Apache::lonnet::hostname($hostid);
+            next if (($last eq $hostname) || ($hostname eq ''));
+            $spares.='<br /><a href="http://'.
+	             $hostname.
+	             '/adm/login?domain='.$authdomain.'">'.
+	             $hostname.'</a>';
+            $last=$hostname;
+         }
+         $r->print(
+   '<html>'
+  .'<head><title>'
+  .&mt('The LearningOnline Network with CAPA')
+  .'</title></head>'
+  .'<body bgcolor="#FFFFFF">'
+  .'<h1>'.&mt('The LearningOnline Network with CAPA').'</h1>'
+  .'<img src="/adm/lonKaputt/lonlogo_broken.gif" align="right" />'
+  .'<h3>'.&mt('This LON-CAPA server is temporarily not available for login.').'</h3>');
+        if ($spares) {
+            $r->print('<p>'.&mt('Please attempt to login to one of the following servers:')
+                     .'</p>'
+                     .$spares);
+        }
+        $r->print('</body>'
+                 .'</html>'
+        );
+        return OK;
+    }
+
+# ----------------------------------------------- Apparently we are in business
+    $servadm=~s/\,/\<br \/\>/g;
+
+# ----------------------------------------------------------- Front page design
+    my $pgbg=&Apache::loncommon::designparm('login.pgbg',$domain);
+    my $font=&Apache::loncommon::designparm('login.font',$domain);
+    my $link=&Apache::loncommon::designparm('login.link',$domain);
+    my $vlink=&Apache::loncommon::designparm('login.vlink',$domain);
+    my $alink=&Apache::loncommon::designparm('login.alink',$domain);
+    my $mainbg=&Apache::loncommon::designparm('login.mainbg',$domain);
+    my $loginbox_bg=&Apache::loncommon::designparm('login.sidebg',$domain);
+    my $loginbox_header_bgcol=&Apache::loncommon::designparm('login.bgcol',$domain);
+    my $loginbox_header_textcol=&Apache::loncommon::designparm('login.textcol',$domain);
+    my $logo=&Apache::loncommon::designparm('login.logo',$domain);
+    my $img=&Apache::loncommon::designparm('login.img',$domain);
+    my $domainlogo=&Apache::loncommon::domainlogo($domain);
+    my $showbanner = 1;
+    my $showmainlogo = 1;
+    if (defined(&Apache::loncommon::designparm('login.showlogo_img',$domain))) {
+        $showbanner = &Apache::loncommon::designparm('login.showlogo_img',$domain);
+    }
+    if (defined(&Apache::loncommon::designparm('login.showlogo_logo',$domain))) {
+        $showmainlogo = &Apache::loncommon::designparm('login.showlogo_logo',$domain);
+    }
+    my $showadminmail;
+    my @possdoms = &Apache::lonnet::current_machine_domains();
+    if (grep(/^\Q$domain\E$/, at possdoms)) {
+        $showadminmail=&Apache::loncommon::designparm('login.adminmail',$domain);
+    }
+    my $showcoursecat =
+        &Apache::loncommon::designparm('login.coursecatalog',$domain);
+    my $shownewuserlink = 
+        &Apache::loncommon::designparm('login.newuser',$domain);
+    my $showhelpdesk =
+        &Apache::loncommon::designparm('login.helpdesk',$domain);
+    my $now=time;
+    my $js = (<<ENDSCRIPT);
+
+<script type="text/javascript" language="JavaScript">
+// <![CDATA[
+function send()
+{
+this.document.server.elements.uname.value
+=this.document.client.elements.uname.value;
+
+this.document.server.elements.udom.value
+=this.document.client.elements.udom.value;
+
+uextkey=this.document.client.elements.uextkey.value;
+lextkey=this.document.client.elements.lextkey.value;
+initkeys();
+
+this.document.server.elements.upass0.value
+    =this.document.client.elements.upass$now.value.substr(0,15);
+this.document.server.elements.upass1.value
+    =this.document.client.elements.upass$now.value.substr(15,15);
+this.document.server.elements.upass2.value
+    =this.document.client.elements.upass$now.value.substr(30,15);
+
+if(this.document.server.action.substr(0,5) === 'http:'){
+    for (var idx in [1,2,3]){
+        this.document.server.elements['upass' + idx].value = 
+            crypted(this.document.server.elements['upass' + idx].value);
+    }
+}
+
+this.document.client.elements.uname.value='';
+this.document.client.elements.upass$now.value='';
+
+this.document.server.submit();
+return false;
+}
+
+function enableInput() {
+    this.document.client.elements.upass$now.removeAttribute("readOnly");
+    this.document.client.elements.uname.removeAttribute("readOnly");
+    this.document.client.elements.udom.removeAttribute("readOnly");
+    return;
+}
+
+// ]]>
+</script>
+
+ENDSCRIPT
+
+# --------------------------------------------------- Print login screen header
+
+    my %add_entries = (
+	       bgcolor      => "$mainbg",
+	       text         => "$font",
+	       link         => "$link",
+	       vlink        => "$vlink",
+	       alink        => "$alink",
+               onload       => 'javascript:enableInput();',);
+
+    $r->print(&Apache::loncommon::start_page('The LearningOnline Network with CAPA Login',$js,
+			       { 'redirect'       => [$expire,'/adm/roles'], 
+				 'add_entries' => \%add_entries,
+				 'only_body'   => 1,}));
+
+# ----------------------------------------------------------------------- Texts
+
+    my %lt=&Apache::lonlocal::texthash(
+          'un'       => 'Username',
+          'pw'       => 'Password',
+          'dom'      => 'Domain',
+          'perc'     => 'percent',
+          'load'     => 'Server Load',
+          'userload' => 'User Load',
+          'catalog'  => 'Course/Community Catalog',
+          'log'      => 'Log in',
+          'help'     => 'Log-in Help',
+          'serv'     => 'Server',
+          'servadm'  => 'Server Administration',
+          'helpdesk' => 'Contact Helpdesk',
+          'forgotpw' => 'Forgot password?',
+          'newuser'  => 'New User?',
+       );
+# -------------------------------------------------- Change password field name
+
+    my $forgotpw = &forgotpwdisplay(%lt);
+    $forgotpw .= '<br />' if $forgotpw;
+    my $loginhelp = &Apache::lonauth::loginhelpdisplay($authdomain);
+    if ($loginhelp) {
+        $loginhelp = '<a href="'.$loginhelp.'">'.$lt{'help'}.'</a><br />';
+    }
+
+# ---------------------------------------------------- Serve out DES JavaScript
+    {
+    my $jsh=Apache::File->new($include."/londes.js");
+    $r->print(<$jsh>);
+    }
+# ---------------------------------------------------------- Serve rest of page
+
+    $r->print(
+    '<div class="LC_Box"'
+   .' style="margin:0 auto; padding:10px; width:90%; height: auto; background-color:#FFFFFF;">'
+);
+
+    $r->print(<<ENDSERVERFORM);
+<form name="server" action="/adm/authenticate" method="post" target="_top">
+   <input type="hidden" name="logtoken" value="$logtoken" />
+   <input type="hidden" name="serverid" value="$lonhost" />
+   <input type="hidden" name="uname" value="" />
+   <input type="hidden" name="upass0" value="" />
+   <input type="hidden" name="upass1" value="" />
+   <input type="hidden" name="upass2" value="" />
+   <input type="hidden" name="udom" value="" />
+   <input type="hidden" name="localpath" value="$env{'form.localpath'}" />
+   <input type="hidden" name="localres" value="$env{'form.localres'}" />
+  </form>
+ENDSERVERFORM
+    my $coursecatalog;
+    if (($showcoursecat eq '') || ($showcoursecat)) {
+        $coursecatalog = &coursecatalog_link($lt{'catalog'}).'<br />';
+    }
+    my $newuserlink;
+    if ($shownewuserlink) {
+        $newuserlink = &newuser_link($lt{'newuser'}).'<br />';
+    }
+    my $logintitle =
+        '<h2 class="LC_hcell"'
+       .' style="background:'.$loginbox_header_bgcol.';'
+       .' color:'.$loginbox_header_textcol.'">'
+       .$lt{'log'}
+       .'</h2>';
+
+    my $noscript_warning='<noscript><span class="LC_warning"><b>'
+                        .&mt('Use of LON-CAPA requires Javascript to be enabled in your web browser.')
+                        .'</b></span></noscript>';
+    my $helpdeskscript;
+    my $contactblock = &contactdisplay(\%lt,$servadm,$showadminmail,
+                                       $authdomain,\$helpdeskscript,
+                                       $showhelpdesk,\@possdoms);
+
+    my $mobileargs;
+    if ($clientmobile) {
+        $mobileargs = 'autocapitalize="off" autocorrect="off"'; 
+    }
+    my $loginform=(<<LFORM);
+<form name="client" action="" onsubmit="return(send())">
+  <input type="hidden" name="lextkey" value="$lextkey" />
+  <input type="hidden" name="uextkey" value="$uextkey" />
+  <b><label for="uname">$lt{'un'}</label>:</b><br />
+  <input type="text" name="uname" id="uname" size="15" value="$authusername" readonly="readonly" $mobileargs /><br />
+  <b><label for="upass$now">$lt{'pw'}</label>:</b><br />
+  <input type="password" name="upass$now" id="upass$now" size="15" readonly="readonly" /><br />
+  <b><label for="udom">$lt{'dom'}</label>:</b><br />
+  <input type="text" name="udom" id="udom" size="15" value="$authdomain" readonly="readonly" $mobileargs /><br />
+  <input type="submit" value="$lt{'log'}" />
+</form>
+LFORM
+
+    if ($showbanner) {
+        $r->print(<<HEADER);
+<!-- The LON-CAPA Header -->
+<div style="background:$pgbg;margin:0;width:100%;">
+  <img src="$img" border="0" alt="The Learning Online Network with CAPA" />
+</div>
+HEADER
+    }
+    $r->print(<<ENDTOP);
+<div style="float:left;margin-top:0;">
+<div class="LC_Box" style="background:$loginbox_bg;">
+  $logintitle
+  $loginform
+  $noscript_warning
+</div>
+  
+<div class="LC_Box" style="padding-top: 10px;">
+  $loginhelp
+  $forgotpw
+  $contactblock
+  $newuserlink
+  $coursecatalog
+</div>
+</div>
+
+<div>
+ENDTOP
+    if ($showmainlogo) {
+        $r->print(' <img src="'.$logo.'" alt="" />'."\n");
+    }
+$r->print(<<ENDTOP);
+$announcements
+</div>
+<hr style="clear:both;" />
+ENDTOP
+    my ($domainrow,$serverrow,$loadrow,$userloadrow,$versionrow);
+    $domainrow = <<"END";
+      <tr>
+       <td  align="left" valign="top">
+        <small><b>$lt{'dom'}: </b></small>
+       </td>
+       <td  align="left" valign="top">
+        <small><tt> $domain</tt></small>
+       </td>
+      </tr>
+END
+    $serverrow = <<"END";
+      <tr>
+       <td  align="left" valign="top">
+        <small><b>$lt{'serv'}: </b></small>
+       </td>
+       <td align="left" valign="top">
+        <small><tt> $lonhost ($role)</tt></small>
+       </td>
+      </tr>
+END
+    if ($loadlim) {
+        $loadrow = <<"END";
+      <tr>
+       <td align="left" valign="top">
+        <small><b>$lt{'load'}: </b></small>
+       </td>
+       <td align="left" valign="top">
+        <small><tt> $loadpercent $lt{'perc'}</tt></small>
+       </td>
+      </tr>
+END
+    }
+    if ($uloadlim) {
+        $userloadrow = <<"END";
+      <tr>
+       <td align="left" valign="top">
+        <small><b>$lt{'userload'}: </b></small>
+       </td>
+       <td align="left" valign="top">
+        <small><tt> $userloadpercent $lt{'perc'}</tt></small>
+       </td>
+      </tr>
+END
+    }
+    if (($version ne '') && ($version ne '<!-- VERSION -->')) {
+        $versionrow = <<"END";
+      <tr>
+       <td colspan="2" align="left">
+        <small>$version</small>
+       </td>
+      </tr>
+END
+    }
+
+    $r->print(<<ENDDOCUMENT);
+    <div style="float: left;">
+     <table border="0" cellspacing="0" cellpadding="0">
+$domainrow
+$serverrow
+$loadrow    
+$userloadrow
+$versionrow
+     </table>
+    </div>
+    <div style="float: right;">
+    $domainlogo
+    </div>
+    <br style="clear:both;" />
+ </div>
+
+<script type="text/javascript">
+// <![CDATA[
+// the if prevents the script error if the browser can not handle this
+if ( document.client.uname ) { document.client.uname.focus(); }
+// ]]>
+</script>
+$helpdeskscript
+
+ENDDOCUMENT
+    my %endargs = ( 'noredirectlink' => 1, );
+    $r->print(&Apache::loncommon::end_page(\%endargs));
+    return OK;
+}
+
+sub check_loginvia {
+    my ($domain,$lonhost) = @_;
+    if ($domain eq '' || $lonhost eq '') {
+        return;
+    }
+    my %domconfhash = &Apache::loncommon::get_domainconf($domain);
+    my $loginvia = $domconfhash{$domain.'.login.loginvia_'.$lonhost};
+    my $loginvia_exempt = $domconfhash{$domain.'.login.loginvia_exempt_'.$lonhost};
+    my $output;
+    if ($loginvia ne '') {
+        my $noredirect;
+        my $ip = $ENV{'REMOTE_ADDR'};
+        if ($ip eq '127.0.0.1') {
+            $noredirect = 1;
+        } else {
+            if ($loginvia_exempt ne '') {
+                my @exempt = split(',',$loginvia_exempt);
+                if (grep(/^\Q$ip\E$/, at exempt)) {
+                    $noredirect = 1;
+                }
+            }
+        }
+        unless ($noredirect) {
+            my ($newhost,$path);
+            if ($loginvia =~ /:/) {
+                ($newhost,$path) = split(':',$loginvia);
+            } else {
+                $newhost = $loginvia;
+            }
+            if ($newhost ne $lonhost) {
+                if (&Apache::lonnet::hostname($newhost) ne '') {
+                    $output = &redirect_page($newhost,$path);
+                }
+            }
+        }
+    }
+    return $output;
+}
+
+sub redirect_page {
+    my ($desthost,$path) = @_;
+    my $protocol = $Apache::lonnet::protocol{$desthost};
+    $protocol = 'http' if ($protocol ne 'https');
+    unless ($path =~ m{^/}) {
+        $path = '/'.$path;
+    }
+    my $url = $protocol.'://'.&Apache::lonnet::hostname($desthost).$path;
+    if ($env{'form.firsturl'} ne '') {
+        $url .='?firsturl='.$env{'form.firsturl'};
+    }
+    my $start_page = &Apache::loncommon::start_page('Switching Server ...',undef,
+                                                    {'redirect' => [0,$url],});
+    my $end_page   = &Apache::loncommon::end_page();
+    return $start_page.$end_page;
+}
+
+sub contactdisplay {
+    my ($lt,$servadm,$showadminmail,$authdomain,$helpdeskscript,$showhelpdesk,
+        $possdoms) = @_;
+    my $contactblock;
+    my $origmail;
+    if (ref($possdoms) eq 'ARRAY') {
+        if (grep(/^\Q$authdomain\E$/,@{$possdoms})) { 
+            $origmail = $Apache::lonnet::perlvar{'lonSupportEMail'};
+        }
+    }
+    my $requestmail = 
+        &Apache::loncommon::build_recipient_list(undef,'helpdeskmail',
+                                                 $authdomain,$origmail);
+    unless ($showhelpdesk eq '0') {
+        if ($requestmail =~ m/[^\@]+\@[^\@]+/) {
+            $showhelpdesk = 1;
+        } else {
+            $showhelpdesk = 0;
+        }
+    }
+    if ($servadm && $showadminmail) {
+        $contactblock .= $$lt{'servadm'}.':<br />'.
+                         '<tt>'.$servadm.'</tt><br />';
+    }
+    if ($showhelpdesk) {
+        $contactblock .= '<a href="javascript:helpdesk()">'.$lt->{'helpdesk'}.'</a><br />';
+        my $thisurl = &escape('/adm/login');
+        $$helpdeskscript = <<"ENDSCRIPT";
+<script type="text/javascript">
+// <![CDATA[
+function helpdesk() {
+    var possdom = document.client.udom.value;
+    var codedom = possdom.replace( new RegExp("[^A-Za-z0-9.\\-]","g"),'');
+    if (codedom == '') {
+        codedom = "$authdomain";
+    }
+    var querystr = "origurl=$thisurl&codedom="+codedom;
+    document.location.href = "/adm/helpdesk?"+querystr;
+    return;
+}
+// ]]>
+</script>
+ENDSCRIPT
+    }
+    return $contactblock;
+}
+
+sub forgotpwdisplay {
+    my (%lt) = @_;
+    my $prompt_for_resetpw = 1; 
+    if ($prompt_for_resetpw) {
+        return '<a href="/adm/resetpw">'.$lt{'forgotpw'}.'</a>';
+    }
+    return;
+}
+
+sub coursecatalog_link {
+    my ($linkname) = @_;
+    return <<"END";
+      <a href="/adm/coursecatalog">$linkname</a>
+END
+}
+
+sub newuser_link {
+    my ($linkname) = @_;
+    return '<a href="/adm/createaccount">'.$linkname.'</a>';
+}
+
+1;
+__END__
Index: loncom/auth/lonauth.pm
diff -u loncom/auth/lonauth.pm:1.135 loncom/auth/lonauth.pm:1.136
--- loncom/auth/lonauth.pm:1.135	Sat Oct  4 02:59:32 2014
+++ loncom/auth/lonauth.pm	Fri Dec  5 12:03:20 2014
@@ -1,651 +1,659 @@
-# The LearningOnline Network
-# User Authentication Module
-#
-# $Id: lonauth.pm,v 1.135 2014/10/04 02:59:32 raeburn Exp $
-#
-# Copyright Michigan State University Board of Trustees
-#
-# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
-#
-# LON-CAPA is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# LON-CAPA is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with LON-CAPA; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-#
-# /home/httpd/html/adm/gpl.txt
-#
-# http://www.lon-capa.org/
-#
-
-package Apache::lonauth;
-
-use strict;
-use LONCAPA;
-use Apache::Constants qw(:common);
-use CGI qw(:standard);
-use DynaLoader; # for Crypt::DES version
-use Crypt::DES;
-use Apache::loncommon();
-use Apache::lonnet;
-use Apache::lonmenu();
-use Apache::createaccount;
-use Fcntl qw(:flock);
-use Apache::lonlocal;
-use Apache::File();
-use HTML::Entities;
- 
-# ------------------------------------------------------------ Successful login
-sub success {
-    my ($r, $username, $domain, $authhost, $lowerurl, $extra_env,
-	$form) = @_;
-
-# ------------------------------------------------------------ Get cookie ready
-    my $cookie =
-	&Apache::loncommon::init_user_environment($r, $username, $domain,
-						  $authhost, $form,
-						  {'extra_env' => $extra_env,});
-
-    my $public=($username eq 'public' && $domain eq 'public');
-
-    if ($public or $lowerurl eq 'noredirect') { return $cookie; }
-
-# -------------------------------------------------------------------- Log this
-
-    &Apache::lonnet::log($domain,$username,$authhost,
-                         "Login $ENV{'REMOTE_ADDR'}");
-
-# ------------------------------------------------- Check for critical messages
-
-    my @what=&Apache::lonnet::dump('critical',$domain,$username);
-    if ($what[0]) {
-	if (($what[0] ne 'con_lost') && ($what[0]!~/^error\:/)) {
-	    $lowerurl='/adm/email?critical=display';
-        }
-    }
-
-# ------------------------------------------------------------ Get cookie ready
-    $cookie="lonID=$cookie; path=/";
-# -------------------------------------------------------- Menu script and info
-    my $destination = $lowerurl;
-
-    if (defined($form->{role})) {
-        my $envkey = 'user.role.'.$form->{role};
-        my $now=time;
-        my $then=$env{'user.login.time'};
-        my $refresh=$env{'user.refresh.time'};
-        my $update=$env{'user.update.time'};
-        if (!$update) {
-            $update = $then;
-        }
-        if (exists($env{$envkey})) {
-            my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus);
-            &Apache::lonnet::role_status($envkey,$update,$refresh,$now,\$role,\$where,
-                                         \$trolecode,\$tstatus,\$tstart,\$tend);
-            if ($tstatus eq 'is') {
-                $destination  .= ($destination =~ /\?/) ? '&' : '?';
-                my $newrole = &HTML::Entities::encode($form->{role},'"<>&');
-                $destination .= 'selectrole=1&'.$newrole.'=1';
-            }
-        }
-    }
-    if (defined($form->{symb})) {
-        my $destsymb = $form->{symb};
-        $destination  .= ($destination =~ /\?/) ? '&' : '?';
-        if ($destsymb =~ /___/) {
-            # FIXME Need to deal with encrypted symbs and urls as needed.
-            my ($map,$resid,$desturl)=split(/___/,$destsymb);
-            unless ($desturl=~/^(adm|editupload|public)/) {
-                $desturl = &Apache::lonnet::clutter($desturl);
-            }
-            $desturl = &HTML::Entities::encode($desturl,'"<>&');
-            $destsymb = &HTML::Entities::encode($destsymb,'"<>&');
-            $destination .= 'destinationurl='.$desturl.
-                            '&destsymb='.$destsymb;
-        } else {
-            $destsymb = &HTML::Entities::encode($destsymb,'"<>&');
-            $destination .= 'destinationurl='.$destsymb;
-        }
-    }
-    if ($destination =~ m{^/adm/roles}) {
-        $destination  .= ($destination =~ /\?/) ? '&' : '?';
-        $destination .= 'source=login';
-    }
-
-    my $windowinfo = Apache::lonhtmlcommon::scripttag('self.name="loncapaclient";');
-    my $header = '<meta HTTP-EQUIV="Refresh" CONTENT="0; url='.$destination.'" />';
-    my $brcrum = [{'href' => '',
-                   'text' => 'Successful Login'},];
-    my $start_page=&Apache::loncommon::start_page('Successful Login',
-                                                  $header,
-                                                  {'bread_crumbs' => $brcrum,});
-    my $end_page  =&Apache::loncommon::end_page();
-
-	my $continuelink='<a href="'.$destination.'">'.&mt('Continue').'</a>';
-# ------------------------------------------------- Output for successful login
-
-    &Apache::loncommon::content_type($r,'text/html');
-    $r->header_out('Set-cookie' => $cookie);
-    $r->send_http_header;
-
-    my %lt=&Apache::lonlocal::texthash(
-				       'wel' => 'Welcome',
-				       'pro' => 'Login problems?',
-				       );
-    my $loginhelp = &loginhelpdisplay($domain);
-    if ($loginhelp) {
-        $loginhelp = '<p><a href="'.$loginhelp.'">'.$lt{'pro'}.'</a></p>';
-    }
-
-    my $welcome = &mt('Welcome to the Learning[_1]Online[_2] Network with CAPA. Please wait while your session is being set up.','<i>','</i>'); 
-    $r->print(<<ENDSUCCESS);
-$start_page
-$windowinfo
-<h1>$lt{'wel'}</h1>
-$welcome
-$loginhelp
-$continuelink
-$end_page
-ENDSUCCESS
-    return;
-}
-
-# --------------------------------------------------------------- Failed login!
-
-sub failed {
-    my ($r,$message,$form) = @_;
-    (undef,undef,undef,my $clientmathml,my $clientunicode) =
-        &Apache::loncommon::decode_user_agent();
-    my $args = {};
-    if ($clientunicode && !$clientmathml) {
-        $args = {'browser.unicode' => 1};
-    }
-
-    my $start_page = &Apache::loncommon::start_page('Unsuccessful Login',undef,$args);
-    my $uname = &Apache::loncommon::cleanup_html($form->{'uname'});
-    my $udom = &Apache::loncommon::cleanup_html($form->{'udom'});
-    if (&Apache::lonnet::domain($udom,'description') eq '') {
-        undef($udom);
-    }
-    my $retry = '/adm/login';
-    if ($uname eq $form->{'uname'}) {
-        $retry .= '?username='.$uname;
-    }
-    if ($udom) {
-        $retry .= (($retry=~/\?/)?'&':'?').'domain='.$udom;
-    }
-    if (exists($form->{role})) {
-        my $role = &Apache::loncommon::cleanup_html($form->{role});
-        if ($role ne '') {
-            $retry .= (($retry=~/\?/)?'&':'?').'role='.$role;
-        }
-    }
-    if (exists($form->{symb})) {
-        my $symb = &Apache::loncommon::cleanup_html($form->{symb});
-        if ($symb ne '') {
-            $retry .= (($retry=~/\?/)?'&':'?').'symb='.$symb;
-        }
-    }
-    my $end_page = &Apache::loncommon::end_page();
-    &Apache::loncommon::content_type($r,'text/html');
-    $r->send_http_header;
-    my @actions =
-         (&mt('Please [_1]log in again[_2].','<a href="'.$retry.'">','</a>'));
-    my $loginhelp = &loginhelpdisplay($udom);
-    if ($loginhelp) {
-        push(@actions, '<a href="'.$loginhelp.'">'.&mt('Login problems?').'</a>');
-    }
-    #FIXME: link to helpdesk might be added here
-
-    $r->print(
-       $start_page
-      .'<h2>'.&mt('Sorry ...').'</h2>'
-      .&Apache::lonhtmlcommon::confirm_success(&mt($message),1).'<br /><br />'
-      .&Apache::lonhtmlcommon::actionbox(\@actions)
-      .$end_page
-    );
- }
-
-# ------------------------------------------------------------------ Rerouting!
-
-sub reroute {
-    my ($r) = @_;
-    &Apache::loncommon::content_type($r,'text/html');
-    $r->send_http_header;
-    my $msg='<b>'.&mt('Sorry ...').'</b><br />'
-           .&mt('Please [_1]log in again[_2].');
-    &Apache::loncommon::simple_error_page($r,'Rerouting',$msg,{'no_auto_mt_msg' => 1});
-}
-
-# ---------------------------------------------------------------- Main handler
-
-sub handler {
-    my $r = shift;
-    my $londocroot = $r->dir_config('lonDocRoot');
-    my $form;
-# Are we re-routing?
-    if (-e "$londocroot/lon-status/reroute.txt") {
-	&reroute($r);
-	return OK;
-    }
-
-    &Apache::lonlocal::get_language_handle($r);
-
-# -------------------------------- 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);
-	    &Apache::loncommon::content_type($r,'text/html');
-	    $r->send_http_header;
-	    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
-              .'<p class="LC_warning">'.&mt('You are already logged in!').'</p>'
-              .'<p>'.&mt('Please either [_1]continue the current session[_2] or [_3]log out[_4].'
-                    ,'<a href="'.$dest.'">','</a>','<a href="/adm/logout">','</a>')
-              .'</p>'
-              .$end_page
-            );
-            return OK;
-        }
-    }
-
-# ---------------------------------------------------- No valid token, continue
-
-
-    my $buffer;
-    if ($r->header_in('Content-length') > 0) {
-	$r->read($buffer,$r->header_in('Content-length'),0);
-    }
-    my %form;
-    foreach my $pair (split(/&/,$buffer)) {
-       my ($name,$value) = split(/=/,$pair);
-       $value =~ tr/+/ /;
-       $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
-       $form{$name}=$value;
-    }
-
-    if ((!$form{'uname'}) || (!$form{'upass0'}) || (!$form{'udom'})) {
-	&failed($r,'Username, password and domain need to be specified.',
-		\%form);
-        return OK;
-    }
-
-# split user logging in and "su"-user
-
-    ($form{'uname'},$form{'suname'})=split(/\:/,$form{'uname'});
-    $form{'uname'} = &LONCAPA::clean_username($form{'uname'});
-    $form{'suname'}= &LONCAPA::clean_username($form{'suname'});
-    $form{'udom'}  = &LONCAPA::clean_domain(  $form{'udom'});
-
-    my $role   = $r->dir_config('lonRole');
-    my $domain = $r->dir_config('lonDefDomain');
-    my $prodir = $r->dir_config('lonUsersDir');
-    my $contact_name = &mt('LON-CAPA helpdesk');
-
-# ---------------------------------------- Get the information from login token
-
-    my $tmpinfo=Apache::lonnet::reply('tmpget:'.$form{'logtoken'},
-                                      $form{'serverid'});
-
-    if (($tmpinfo=~/^error/) || ($tmpinfo eq 'con_lost') || 
-        ($tmpinfo eq 'no_such_host')) {
-	&failed($r,'Information needed to verify your login information is missing, inaccessible or expired.',\%form);
-        return OK;
-    } else {
-	my $reply = &Apache::lonnet::reply('tmpdel:'.$form{'logtoken'},
-					   $form{'serverid'});
-        if ( $reply ne 'ok' ) {
-            &failed($r,'Session could not be opened.',\%form);
-	    &Apache::lonnet::logthis("ERROR got a reply of $reply when trying to contact ". $form{'serverid'}." to get login token");
-	    return OK;
-	}
-    }
-
-    if (!&Apache::lonnet::domain($form{'udom'})) {
-        &failed($r,'The domain you provided is not a valid LON-CAPA domain.',\%form);
-        return OK;
-    }
-
-    my ($key,$firsturl,$rolestr,$symbstr,$iptokenstr)=split(/&/,$tmpinfo);
-    if ($rolestr) {
-        $rolestr = &unescape($rolestr);
-    }
-    if ($symbstr) {
-        $symbstr= &unescape($symbstr);
-    }
-    if ($iptokenstr) {
-        $iptokenstr = &unescape($iptokenstr);
-    }
-    if ($rolestr =~ /^role=/) {
-        (undef,$form{'role'}) = split('=',$rolestr);
-    }
-    if ($symbstr =~ /^symb=/) { 
-        (undef,$form{'symb'}) = split('=',$symbstr);
-    }
-    if ($iptokenstr =~ /^iptoken=/) {
-        (undef,$form{'iptoken'}) = split('=',$iptokenstr);
-    }
-
-    my $keybin=pack("H16",$key);
-
-    my $cipher;
-    if ($Crypt::DES::VERSION>=2.03) {
-	$cipher=new Crypt::DES $keybin;
-    }
-    else {
-	$cipher=new DES $keybin;
-    }
-    my $upass='';
-    for (my $i=0;$i<=2;$i++) {
-	my $chunk=
-	    $cipher->decrypt(unpack("a8",pack("H16",substr($form{'upass'.$i},0,16))));
-
-	$chunk.=
-	    $cipher->decrypt(unpack("a8",pack("H16",substr($form{'upass'.$i},16,16))));
-
-	$chunk=substr($chunk,1,ord(substr($chunk,0,1)));
-	$upass.=$chunk;
-    }
-
-# ---------------------------------------------------------------- Authenticate
-
-    my %domconfig = &Apache::lonnet::get_dom('configuration',['usercreation'],$form{'udom'});
-    my ($cancreate,$statustocreate) =
-        &Apache::createaccount::get_creation_controls($form{'udom'},$domconfig{'usercreation'});
-    my $defaultauth;
-    if (ref($cancreate) eq 'ARRAY') {
-        if (grep(/^login$/,@{$cancreate})) {
-            $defaultauth = 1;
-        }
-    }
-    my $clientcancheckhost = 1;
-    my $authhost=Apache::lonnet::authenticate($form{'uname'},$upass,
-                                              $form{'udom'},$defaultauth,
-                                              $clientcancheckhost);
-    
-# --------------------------------------------------------------------- Failed?
-
-    if ($authhost eq 'no_host') {
-	&failed($r,'Username and/or password could not be authenticated.',
-		\%form);
-        return OK;
-    } elsif ($authhost eq 'no_account_on_host') {
-        if ($defaultauth) {
-            my $domdesc = &Apache::lonnet::domain($form{'udom'},'description');
-            unless (&check_can_host($r,\%form,'no_account_on_host',$domdesc)) {
-                return OK;
-            }
-            my $start_page = 
-                &Apache::loncommon::start_page('Create a user account in LON-CAPA');
-            my $lonhost = $r->dir_config('lonHostID');
-            my $origmail = $Apache::lonnet::perlvar{'lonSupportEMail'};
-            my $contacts = 
-                &Apache::loncommon::build_recipient_list(undef,'helpdeskmail',
-                                                        $form{'udom'},$origmail);
-            my ($contact_email) = split(',',$contacts); 
-            my $output = 
-                &Apache::createaccount::username_check($form{'uname'},$form{'udom'},
-                                                       $domdesc,'',$lonhost,
-                                                       $contact_email,$contact_name,
-                                                       undef,$statustocreate);
-            &Apache::loncommon::content_type($r,'text/html');
-            $r->send_http_header;
-            &Apache::createaccount::print_header($r,$start_page);
-            $r->print('<h3>'.&mt('Account creation').'</h3>'.
-                      &mt('Although your username and password were authenticated, you do not currently have a LON-CAPA account at this institution.').'<br />'.
-                      $output.&Apache::loncommon::end_page());
-            return OK;
-        } else {
-            &failed($r,'Although your username and password were authenticated, you do not currently have a LON-CAPA account in this domain, and you are not permitted to create one.',\%form);
-            return OK;
-        }
-    }
-
-    if (($firsturl eq '') || 
-	($firsturl=~/^\/adm\/(logout|remote)/)) {
-	$firsturl='/adm/roles';
-    }
-
-    my $hosthere;
-    if ($form{'iptoken'}) {
-        my %sessiondata = &Apache::lonnet::tmpget($form{'iptoken'});
-        my $delete = &Apache::lonnet::tmpdel($form{'iptoken'});
-        if (($sessiondata{'domain'} eq $form{'udom'}) &&
-            ($sessiondata{'username'} eq $form{'uname'})) {
-            $hosthere = 1;
-        }
-    }
-
-# --------------------------------- 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');
-	}
-    }
-
-    my ($is_balancer,$otherserver);
-
-    unless ($hosthere) {
-        ($is_balancer,$otherserver) =
-            &Apache::lonnet::check_loadbalancing($form{'uname'},$form{'udom'});
-    }
-
-    if ($is_balancer) {
-        if (!$otherserver) { 
-            ($otherserver) = &Apache::lonnet::choose_server($form{'udom'});
-        }
-        if ($otherserver) {
-            &success($r,$form{'uname'},$form{'udom'},$authhost,'noredirect',undef,
-                     \%form);
-            my $switchto = '/adm/switchserver?otherserver='.$otherserver;
-            if (($firsturl) && ($firsturl ne '/adm/switchserver') && ($firsturl ne '/adm/roles')) {
-                $switchto .= '&origurl='.$firsturl;
-            }
-            if ($form{'role'}) {
-                $switchto .= '&role='.$form{'role'};
-            }
-            if ($form{'symb'}) {
-                $switchto .= '&symb='.$form{'symb'};
-            }
-            $r->internal_redirect($switchto);
-        } else {
-            $r->print(&noswitch());
-        }
-        return OK;
-    } else {
-        if (!&check_can_host($r,\%form,$authhost)) {
-            my ($otherserver) = &Apache::lonnet::choose_server($form{'udom'});
-            if ($otherserver) {
-                &success($r,$form{'uname'},$form{'udom'},$authhost,'noredirect',undef,
-                         \%form);
-                my $switchto = '/adm/switchserver?otherserver='.$otherserver;
-                if (($firsturl) && ($firsturl ne '/adm/switchserver') && ($firsturl ne '/adm/roles')) {
-                    $switchto .= '&origurl='.$firsturl;
-                }
-                if ($form{'role'}) {
-                    $switchto .= '&role='.$form{'role'};
-                }
-                if ($form{'symb'}) {
-                    $switchto .= '&symb='.$form{'symb'};
-                }
-                $r->internal_redirect($switchto);
-            } else {
-                $r->print(&noswitch());
-            }
-            return OK;
-        }
-
-# ------------------------------------------------------- Do the load balancing
-
-# ---------------------------------------------------------- Determine own load
-        my $loadlim = $r->dir_config('lonLoadLim');
-        my $loadavg;
-        {
-            my $loadfile=Apache::File->new('/proc/loadavg');
-            $loadavg=<$loadfile>;
-        }
-        $loadavg =~ s/\s.*//g;
-        my $loadpercent=sprintf("%.1f",100*$loadavg/$loadlim);
-        my $userloadpercent=&Apache::lonnet::userload();
-
-# ---------------------------------------------------------- Are we overloaded?
-        if ((($userloadpercent>100.0)||($loadpercent>100.0))) {
-            my $unloaded=Apache::lonnet::spareserver($loadpercent,$userloadpercent,1,$form{'udom'});
-            if (!$unloaded) {
-                ($unloaded) = &Apache::lonnet::choose_server($form{'udom'});
-            }
-            if ($unloaded) {
-                &success($r,$form{'uname'},$form{'udom'},$authhost,'noredirect',
-                         undef,\%form);
-                $r->internal_redirect('/adm/switchserver?otherserver='.$unloaded.'&origurl='.$firsturl);
-                return OK;
-            }
-        }
-        &success($r,$form{'uname'},$form{'udom'},$authhost,$firsturl,undef,
-                 \%form);
-        return OK;
-    }
-}
-
-sub check_can_host {
-    my ($r,$form,$authhost,$domdesc) = @_;
-    return unless (ref($form) eq 'HASH');
-    my $canhost = 1;
-    my $lonhost = $r->dir_config('lonHostID');
-    my $udom = $form->{'udom'};
-    my @intdoms;
-    my $internet_names = &Apache::lonnet::get_internet_names($lonhost);
-    if (ref($internet_names) eq 'ARRAY') {
-        @intdoms = @{$internet_names};
-    }
-    my $uprimary_id = &Apache::lonnet::domain($udom,'primary');
-    my $uint_dom = &Apache::lonnet::internet_dom($uprimary_id);
-    unless ($uint_dom ne '' && grep(/^\Q$uint_dom\E$/, at intdoms)) {
-        my $machine_dom = &Apache::lonnet::host_domain($lonhost);
-        my $hostname = &Apache::lonnet::hostname($lonhost);
-        my $serverhomeID = &Apache::lonnet::get_server_homeID($hostname);
-        my $serverhomedom = &Apache::lonnet::host_domain($serverhomeID);
-        my %defdomdefaults = &Apache::lonnet::get_domain_defaults($serverhomedom);
-        my %udomdefaults = &Apache::lonnet::get_domain_defaults($udom);
-        my $loncaparev;
-        if ($authhost eq 'no_account_on_host') {
-            $loncaparev = &Apache::lonnet::get_server_loncaparev($machine_dom);
-        } else {
-            $loncaparev = &Apache::lonnet::get_server_loncaparev($machine_dom,$lonhost);
-        }
-        $canhost = &Apache::lonnet::can_host_session($udom,$lonhost,$loncaparev,
-                                                     $udomdefaults{'remotesessions'},
-                                                     $defdomdefaults{'hostedsessions'});
-    }
-    unless ($canhost) {
-        if ($authhost eq 'no_account_on_host') {
-            my $checkloginvia = 1;
-            my ($login_host,$hostname) = 
-                &Apache::lonnet::choose_server($udom,$checkloginvia);
-            &Apache::loncommon::content_type($r,'text/html');
-            $r->send_http_header;
-            if ($login_host ne '') {
-                my $protocol = $Apache::lonnet::protocol{$login_host};
-                $protocol = 'http' if ($protocol ne 'https');
-                my $newurl = $protocol.'://'.$hostname.'/adm/createaccount';
-                $r->print(&Apache::loncommon::start_page('Create a user account in LON-CAPA').
-                          '<h3>'.&mt('Account creation').'</h3>'.
-                          &mt('You do not currently have a LON-CAPA account at this institution.').'<br />'.
-                          '<p>'.&mt('You will be able to create one by logging into a LON-CAPA server within the [_1] domain.',$domdesc).'</p>'.
-                          '<p>'.&mt('[_1]Log in[_2]','<a href="'.$newurl.'">','</a>').
-                          &Apache::loncommon::end_page());
-            } else {
-                $r->print(&Apache::loncommon::start_page('Access to LON-CAPA unavailable').
-                          '<h3>'.&mt('Account creation unavailable').'</h3>'.
-                          &mt('You do not currently have a LON-CAPA account at this institution.').'<br />'.
-                          '<p>'.&mt('Currently a LON-CAPA server is not available within the [_1] domain for you to log-in to, to create an account.',$domdesc).'</p>'.
-                          &Apache::loncommon::end_page());
-            }
-        } else {
-            &success($r,$form->{'uname'},$udom,$authhost,'noredirect',undef,
-                     $form);
-            my ($otherserver) = &Apache::lonnet::choose_server($udom);
-            $r->internal_redirect('/adm/switchserver?otherserver='.$otherserver);
-        }
-    }
-    return $canhost;
-}
-
-sub noswitch {
-    my $result = &Apache::loncommon::start_page('Access to LON-CAPA unavailable').
-                 '<h3>'.&mt('Session unavailable').'</h3>'.
-                 &mt('This LON-CAPA server is unable to host your session.').'<br />'.
-                 '<p>'.&mt('Currently no other LON-CAPA server is available to host your session either.').'</p>'.
-                 &Apache::loncommon::end_page();
-    return $result;
-}
-
-sub loginhelpdisplay {
-    my ($authdomain) = @_;
-    my $login_help = 1;
-    my $lang = &Apache::lonlocal::current_language();
-    if ($login_help) {
-        my $dom = $authdomain;
-        if ($dom eq '') {
-            $dom = &Apache::lonnet::default_login_domain();
-        }
-        my %domconfhash = &Apache::loncommon::get_domainconf($dom);
-        my $loginhelp_url;
-        if ($lang) {
-            $loginhelp_url = $domconfhash{$dom.'.login.helpurl_'.$lang};
-            if ($loginhelp_url ne '') {
-                return $loginhelp_url;
-            }
-        }
-        $loginhelp_url = $domconfhash{$dom.'.login.helpurl_nolang'};
-        if ($loginhelp_url ne '') {
-            return $loginhelp_url;
-        } else {
-            return '/adm/loginproblems.html';
-        }
-    }
-    return;
-}
-
-1;
-__END__
-
-
+# The LearningOnline Network
+# User Authentication Module
+#
+# $Id: lonauth.pm,v 1.136 2014/12/05 12:03:20 kruse Exp $
+#
+# Copyright Michigan State University Board of Trustees
+#
+# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
+#
+# LON-CAPA is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# LON-CAPA is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with LON-CAPA; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+# /home/httpd/html/adm/gpl.txt
+#
+# http://www.lon-capa.org/
+#
+
+package Apache::lonauth;
+
+use strict;
+use LONCAPA;
+use Apache::Constants qw(:common);
+use CGI qw(:standard);
+use DynaLoader; # for Crypt::DES version
+use Crypt::DES;
+use Apache::loncommon();
+use Apache::lonnet;
+use Apache::lonmenu();
+use Apache::createaccount;
+use Fcntl qw(:flock);
+use Apache::lonlocal;
+use Apache::File();
+use HTML::Entities;
+ 
+# ------------------------------------------------------------ Successful login
+sub success {
+    my ($r, $username, $domain, $authhost, $lowerurl, $extra_env,
+	$form) = @_;
+
+# ------------------------------------------------------------ Get cookie ready
+    my $cookie =
+	&Apache::loncommon::init_user_environment($r, $username, $domain,
+						  $authhost, $form,
+						  {'extra_env' => $extra_env,});
+
+    my $public=($username eq 'public' && $domain eq 'public');
+
+    if ($public or $lowerurl eq 'noredirect') { return $cookie; }
+
+# -------------------------------------------------------------------- Log this
+
+    &Apache::lonnet::log($domain,$username,$authhost,
+                         "Login $ENV{'REMOTE_ADDR'}");
+
+# ------------------------------------------------- Check for critical messages
+
+    my @what=&Apache::lonnet::dump('critical',$domain,$username);
+    if ($what[0]) {
+	if (($what[0] ne 'con_lost') && ($what[0]!~/^error\:/)) {
+	    $lowerurl='/adm/email?critical=display';
+        }
+    }
+
+# ------------------------------------------------------------ Get cookie ready
+    $cookie="lonID=$cookie; path=/";
+# -------------------------------------------------------- Menu script and info
+    my $destination = $lowerurl;
+
+    if (defined($form->{role})) {
+        my $envkey = 'user.role.'.$form->{role};
+        my $now=time;
+        my $then=$env{'user.login.time'};
+        my $refresh=$env{'user.refresh.time'};
+        my $update=$env{'user.update.time'};
+        if (!$update) {
+            $update = $then;
+        }
+        if (exists($env{$envkey})) {
+            my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus);
+            &Apache::lonnet::role_status($envkey,$update,$refresh,$now,\$role,\$where,
+                                         \$trolecode,\$tstatus,\$tstart,\$tend);
+            if ($tstatus eq 'is') {
+                $destination  .= ($destination =~ /\?/) ? '&' : '?';
+                my $newrole = &HTML::Entities::encode($form->{role},'"<>&');
+                $destination .= 'selectrole=1&'.$newrole.'=1';
+            }
+        }
+    }
+    if (defined($form->{symb})) {
+        my $destsymb = $form->{symb};
+        $destination  .= ($destination =~ /\?/) ? '&' : '?';
+        if ($destsymb =~ /___/) {
+            # FIXME Need to deal with encrypted symbs and urls as needed.
+            my ($map,$resid,$desturl)=split(/___/,$destsymb);
+            unless ($desturl=~/^(adm|editupload|public)/) {
+                $desturl = &Apache::lonnet::clutter($desturl);
+            }
+            $desturl = &HTML::Entities::encode($desturl,'"<>&');
+            $destsymb = &HTML::Entities::encode($destsymb,'"<>&');
+            $destination .= 'destinationurl='.$desturl.
+                            '&destsymb='.$destsymb;
+        } else {
+            $destsymb = &HTML::Entities::encode($destsymb,'"<>&');
+            $destination .= 'destinationurl='.$destsymb;
+        }
+    }
+    if ($destination =~ m{^/adm/roles}) {
+        $destination  .= ($destination =~ /\?/) ? '&' : '?';
+        $destination .= 'source=login';
+    }
+
+    my $windowinfo = Apache::lonhtmlcommon::scripttag('self.name="loncapaclient";');
+    my $header = '<meta HTTP-EQUIV="Refresh" CONTENT="0; url='.$destination.'" />';
+    my $brcrum = [{'href' => '',
+                   'text' => 'Successful Login'},];
+    my $start_page=&Apache::loncommon::start_page('Successful Login',
+                                                  $header,
+                                                  {'bread_crumbs' => $brcrum,});
+    my $end_page  =&Apache::loncommon::end_page();
+
+	my $continuelink='<a href="'.$destination.'">'.&mt('Continue').'</a>';
+# ------------------------------------------------- Output for successful login
+
+    &Apache::loncommon::content_type($r,'text/html');
+    $r->header_out('Set-cookie' => $cookie);
+    $r->send_http_header;
+
+    my %lt=&Apache::lonlocal::texthash(
+				       'wel' => 'Welcome',
+				       'pro' => 'Login problems?',
+				       );
+    my $loginhelp = &loginhelpdisplay($domain);
+    if ($loginhelp) {
+        $loginhelp = '<p><a href="'.$loginhelp.'">'.$lt{'pro'}.'</a></p>';
+    }
+
+    my $welcome = &mt('Welcome to the Learning[_1]Online[_2] Network with CAPA. Please wait while your session is being set up.','<i>','</i>'); 
+    $r->print(<<ENDSUCCESS);
+$start_page
+$windowinfo
+<h1>$lt{'wel'}</h1>
+$welcome
+$loginhelp
+$continuelink
+$end_page
+ENDSUCCESS
+    return;
+}
+
+# --------------------------------------------------------------- Failed login!
+
+sub failed {
+    my ($r,$message,$form) = @_;
+    (undef,undef,undef,my $clientmathml,my $clientunicode) =
+        &Apache::loncommon::decode_user_agent();
+    my $args = {};
+    if ($clientunicode && !$clientmathml) {
+        $args = {'browser.unicode' => 1};
+    }
+
+    my $start_page = &Apache::loncommon::start_page('Unsuccessful Login',undef,$args);
+    my $uname = &Apache::loncommon::cleanup_html($form->{'uname'});
+    my $udom = &Apache::loncommon::cleanup_html($form->{'udom'});
+    if (&Apache::lonnet::domain($udom,'description') eq '') {
+        undef($udom);
+    }
+    my $retry = '/adm/login';
+    if ($uname eq $form->{'uname'}) {
+        $retry .= '?username='.$uname;
+    }
+    if ($udom) {
+        $retry .= (($retry=~/\?/)?'&':'?').'domain='.$udom;
+    }
+    if (exists($form->{role})) {
+        my $role = &Apache::loncommon::cleanup_html($form->{role});
+        if ($role ne '') {
+            $retry .= (($retry=~/\?/)?'&':'?').'role='.$role;
+        }
+    }
+    if (exists($form->{symb})) {
+        my $symb = &Apache::loncommon::cleanup_html($form->{symb});
+        if ($symb ne '') {
+            $retry .= (($retry=~/\?/)?'&':'?').'symb='.$symb;
+        }
+    }
+    my $end_page = &Apache::loncommon::end_page();
+    &Apache::loncommon::content_type($r,'text/html');
+    $r->send_http_header;
+    my @actions =
+         (&mt('Please [_1]log in again[_2].','<a href="'.$retry.'">','</a>'));
+    my $loginhelp = &loginhelpdisplay($udom);
+    if ($loginhelp) {
+        push(@actions, '<a href="'.$loginhelp.'">'.&mt('Login problems?').'</a>');
+    }
+    #FIXME: link to helpdesk might be added here
+
+    $r->print(
+       $start_page
+      .'<h2>'.&mt('Sorry ...').'</h2>'
+      .&Apache::lonhtmlcommon::confirm_success(&mt($message),1).'<br /><br />'
+      .&Apache::lonhtmlcommon::actionbox(\@actions)
+      .$end_page
+    );
+ }
+
+# ------------------------------------------------------------------ Rerouting!
+
+sub reroute {
+    my ($r) = @_;
+    &Apache::loncommon::content_type($r,'text/html');
+    $r->send_http_header;
+    my $msg='<b>'.&mt('Sorry ...').'</b><br />'
+           .&mt('Please [_1]log in again[_2].');
+    &Apache::loncommon::simple_error_page($r,'Rerouting',$msg,{'no_auto_mt_msg' => 1});
+}
+
+# ---------------------------------------------------------------- Main handler
+
+sub handler {
+    my $r = shift;
+    my $londocroot = $r->dir_config('lonDocRoot');
+    my $form;
+# Are we re-routing?
+    if (-e "$londocroot/lon-status/reroute.txt") {
+	&reroute($r);
+	return OK;
+    }
+
+    &Apache::lonlocal::get_language_handle($r);
+
+# -------------------------------- 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);
+	    &Apache::loncommon::content_type($r,'text/html');
+	    $r->send_http_header;
+	    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
+              .'<p class="LC_warning">'.&mt('You are already logged in!').'</p>'
+              .'<p>'.&mt('Please either [_1]continue the current session[_2] or [_3]log out[_4].'
+                    ,'<a href="'.$dest.'">','</a>','<a href="/adm/logout">','</a>')
+              .'</p>'
+              .$end_page
+            );
+            return OK;
+        }
+    }
+
+# ---------------------------------------------------- No valid token, continue
+
+
+    my $buffer;
+    if ($r->header_in('Content-length') > 0) {
+	$r->read($buffer,$r->header_in('Content-length'),0);
+    }
+    my %form;
+    foreach my $pair (split(/&/,$buffer)) {
+       my ($name,$value) = split(/=/,$pair);
+       $value =~ tr/+/ /;
+       $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
+       $form{$name}=$value;
+    }
+
+    if ((!$form{'uname'}) || (!$form{'upass0'}) || (!$form{'udom'})) {
+	&failed($r,'Username, password and domain need to be specified.',
+		\%form);
+        return OK;
+    }
+
+# split user logging in and "su"-user
+
+    ($form{'uname'},$form{'suname'})=split(/\:/,$form{'uname'});
+    $form{'uname'} = &LONCAPA::clean_username($form{'uname'});
+    $form{'suname'}= &LONCAPA::clean_username($form{'suname'});
+    $form{'udom'}  = &LONCAPA::clean_domain(  $form{'udom'});
+
+    my $role   = $r->dir_config('lonRole');
+    my $domain = $r->dir_config('lonDefDomain');
+    my $prodir = $r->dir_config('lonUsersDir');
+    my $contact_name = &mt('LON-CAPA helpdesk');
+
+# ---------------------------------------- Get the information from login token
+
+    my $tmpinfo=Apache::lonnet::reply('tmpget:'.$form{'logtoken'},
+                                      $form{'serverid'});
+
+    my %sessiondata;
+    if ($form{'iptoken'}) {
+        %sessiondata = &Apache::lonnet::tmpget($form{'iptoken'});
+        my $delete = &Apache::lonnet::tmpdel($form{'iptoken'});
+    }
+
+    if (($tmpinfo=~/^error/) || ($tmpinfo eq 'con_lost') || 
+        ($tmpinfo eq 'no_such_host')) {
+	&failed($r,'Information needed to verify your login information is missing, inaccessible or expired.',\%form);
+        return OK;
+    } else {
+	my $reply = &Apache::lonnet::reply('tmpdel:'.$form{'logtoken'},
+					   $form{'serverid'});
+        if ( $reply ne 'ok' ) {
+            &failed($r,'Session could not be opened.',\%form);
+	    &Apache::lonnet::logthis("ERROR got a reply of $reply when trying to contact ". $form{'serverid'}." to get login token");
+	    return OK;
+	}
+    }
+
+    if (!&Apache::lonnet::domain($form{'udom'})) {
+        &failed($r,'The domain you provided is not a valid LON-CAPA domain.',\%form);
+        return OK;
+    }
+
+    my ($key,$firsturl,$rolestr,$symbstr)=split(/&/,$tmpinfo);
+    if ($rolestr) {
+        $rolestr = &unescape($rolestr);
+    }
+    if ($symbstr) {
+        $symbstr= &unescape($symbstr);
+    }
+    if ($rolestr =~ /^role=/) {
+        (undef,$form{'role'}) = split('=',$rolestr);
+    }
+    if ($symbstr =~ /^symb=/) { 
+        (undef,$form{'symb'}) = split('=',$symbstr);
+    }
+
+    my $upass = $ENV{HTTPS} ? join("", @form{qw(upass0 upass1 upass2)}) 
+        : decrypt($key, @form{qw(upass0 upass1 upass2)});
+
+# ---------------------------------------------------------------- Authenticate
+
+    my %domconfig = &Apache::lonnet::get_dom('configuration',['usercreation'],$form{'udom'});
+    my ($cancreate,$statustocreate) =
+        &Apache::createaccount::get_creation_controls($form{'udom'},$domconfig{'usercreation'});
+    my $defaultauth;
+    if (ref($cancreate) eq 'ARRAY') {
+        if (grep(/^login$/,@{$cancreate})) {
+            $defaultauth = 1;
+        }
+    }
+    my $clientcancheckhost = 1;
+    my $authhost=Apache::lonnet::authenticate($form{'uname'},$upass,
+                                              $form{'udom'},$defaultauth,
+                                              $clientcancheckhost);
+    
+# --------------------------------------------------------------------- Failed?
+
+    if ($authhost eq 'no_host') {
+	&failed($r,'Username and/or password could not be authenticated.',
+		\%form);
+        return OK;
+    } elsif ($authhost eq 'no_account_on_host') {
+        if ($defaultauth) {
+            my $domdesc = &Apache::lonnet::domain($form{'udom'},'description');
+            unless (&check_can_host($r,\%form,'no_account_on_host',$domdesc)) {
+                return OK;
+            }
+            my $start_page = 
+                &Apache::loncommon::start_page('Create a user account in LON-CAPA');
+            my $lonhost = $r->dir_config('lonHostID');
+            my $origmail = $Apache::lonnet::perlvar{'lonSupportEMail'};
+            my $contacts = 
+                &Apache::loncommon::build_recipient_list(undef,'helpdeskmail',
+                                                        $form{'udom'},$origmail);
+            my ($contact_email) = split(',',$contacts); 
+            my $output = 
+                &Apache::createaccount::username_check($form{'uname'},$form{'udom'},
+                                                       $domdesc,'',$lonhost,
+                                                       $contact_email,$contact_name,
+                                                       undef,$statustocreate);
+            &Apache::loncommon::content_type($r,'text/html');
+            $r->send_http_header;
+            &Apache::createaccount::print_header($r,$start_page);
+            $r->print('<h3>'.&mt('Account creation').'</h3>'.
+                      &mt('Although your username and password were authenticated, you do not currently have a LON-CAPA account at this institution.').'<br />'.
+                      $output.&Apache::loncommon::end_page());
+            return OK;
+        } else {
+            &failed($r,'Although your username and password were authenticated, you do not currently have a LON-CAPA account in this domain, and you are not permitted to create one.',\%form);
+            return OK;
+        }
+    }
+
+    if (($firsturl eq '') || 
+	($firsturl=~/^\/adm\/(logout|remote)/)) {
+	$firsturl='/adm/roles';
+    }
+
+    my $hosthere;
+    if ($form{'iptoken'}) {
+        if (($sessiondata{'domain'} eq $form{'udom'}) &&
+            ($sessiondata{'username'} eq $form{'uname'})) {
+            $hosthere = 1;
+        }
+    }
+
+# --------------------------------- 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');
+	}
+    }
+
+    my ($is_balancer,$otherserver);
+
+    unless ($hosthere) {
+        ($is_balancer,$otherserver) =
+            &Apache::lonnet::check_loadbalancing($form{'uname'},$form{'udom'});
+    }
+
+    if ($is_balancer) {
+        if (!$otherserver) { 
+            ($otherserver) = &Apache::lonnet::choose_server($form{'udom'});
+        }
+        if ($otherserver) {
+            &success($r,$form{'uname'},$form{'udom'},$authhost,'noredirect',undef,
+                     \%form);
+            my $switchto = '/adm/switchserver?otherserver='.$otherserver;
+            if (($firsturl) && ($firsturl ne '/adm/switchserver') && ($firsturl ne '/adm/roles')) {
+                $switchto .= '&origurl='.$firsturl;
+            }
+            if ($form{'role'}) {
+                $switchto .= '&role='.$form{'role'};
+            }
+            if ($form{'symb'}) {
+                $switchto .= '&symb='.$form{'symb'};
+            }
+            $r->internal_redirect($switchto);
+        } else {
+            $r->print(&noswitch());
+        }
+        return OK;
+    } else {
+        if (!&check_can_host($r,\%form,$authhost)) {
+            my ($otherserver) = &Apache::lonnet::choose_server($form{'udom'});
+            if ($otherserver) {
+                &success($r,$form{'uname'},$form{'udom'},$authhost,'noredirect',undef,
+                         \%form);
+                my $switchto = '/adm/switchserver?otherserver='.$otherserver;
+                if (($firsturl) && ($firsturl ne '/adm/switchserver') && ($firsturl ne '/adm/roles')) {
+                    $switchto .= '&origurl='.$firsturl;
+                }
+                if ($form{'role'}) {
+                    $switchto .= '&role='.$form{'role'};
+                }
+                if ($form{'symb'}) {
+                    $switchto .= '&symb='.$form{'symb'};
+                }
+                $r->internal_redirect($switchto);
+            } else {
+                $r->print(&noswitch());
+            }
+            return OK;
+        }
+
+# ------------------------------------------------------- Do the load balancing
+
+# ---------------------------------------------------------- Determine own load
+        my $loadlim = $r->dir_config('lonLoadLim');
+        my $loadavg;
+        {
+            my $loadfile=Apache::File->new('/proc/loadavg');
+            $loadavg=<$loadfile>;
+        }
+        $loadavg =~ s/\s.*//g;
+        my $loadpercent=sprintf("%.1f",100*$loadavg/$loadlim);
+        my $userloadpercent=&Apache::lonnet::userload();
+
+# ---------------------------------------------------------- Are we overloaded?
+        if ((($userloadpercent>100.0)||($loadpercent>100.0))) {
+            my $unloaded=Apache::lonnet::spareserver($loadpercent,$userloadpercent,1,$form{'udom'});
+            if (!$unloaded) {
+                ($unloaded) = &Apache::lonnet::choose_server($form{'udom'});
+            }
+            if ($unloaded) {
+                &success($r,$form{'uname'},$form{'udom'},$authhost,'noredirect',
+                         undef,\%form);
+                $r->internal_redirect('/adm/switchserver?otherserver='.$unloaded.'&origurl='.$firsturl);
+                return OK;
+            }
+        }
+        &success($r,$form{'uname'},$form{'udom'},$authhost,$firsturl,undef,
+                 \%form);
+        return OK;
+    }
+}
+
+sub decrypt {
+    my ($key, @chunks) = @_;
+
+    my $keybin = pack("H16",$key);
+
+    my $cipher;
+    if ($Crypt::DES::VERSION >= 2.03) {
+        $cipher = new Crypt::DES $keybin;
+    } else {
+        $cipher = new DES $keybin;
+    }
+
+    my $upass='';
+    for (my $i=0;$i<=2;$i++) {
+        my $chunk =
+            $cipher->decrypt(
+                unpack("a8",pack("H16",substr($chunks[$i],0,16))));
+
+        $chunk .=
+            $cipher->decrypt(
+                unpack("a8",pack("H16",substr($chunks[$i],16,16))));
+
+        $chunk = substr($chunk,1,ord(substr($chunk,0,1)));
+        $upass .= $chunk;
+    }
+    return $upass;
+}
+
+sub check_can_host {
+    my ($r,$form,$authhost,$domdesc) = @_;
+    return unless (ref($form) eq 'HASH');
+    my $canhost = 1;
+    my $lonhost = $r->dir_config('lonHostID');
+    my $udom = $form->{'udom'};
+    my @intdoms;
+    my $internet_names = &Apache::lonnet::get_internet_names($lonhost);
+    if (ref($internet_names) eq 'ARRAY') {
+        @intdoms = @{$internet_names};
+    }
+    my $uprimary_id = &Apache::lonnet::domain($udom,'primary');
+    my $uint_dom = &Apache::lonnet::internet_dom($uprimary_id);
+    unless ($uint_dom ne '' && grep(/^\Q$uint_dom\E$/, at intdoms)) {
+        my $machine_dom = &Apache::lonnet::host_domain($lonhost);
+        my $hostname = &Apache::lonnet::hostname($lonhost);
+        my $serverhomeID = &Apache::lonnet::get_server_homeID($hostname);
+        my $serverhomedom = &Apache::lonnet::host_domain($serverhomeID);
+        my %defdomdefaults = &Apache::lonnet::get_domain_defaults($serverhomedom);
+        my %udomdefaults = &Apache::lonnet::get_domain_defaults($udom);
+        my $loncaparev;
+        if ($authhost eq 'no_account_on_host') {
+            $loncaparev = &Apache::lonnet::get_server_loncaparev($machine_dom);
+        } else {
+            $loncaparev = &Apache::lonnet::get_server_loncaparev($machine_dom,$lonhost);
+        }
+        $canhost = &Apache::lonnet::can_host_session($udom,$lonhost,$loncaparev,
+                                                     $udomdefaults{'remotesessions'},
+                                                     $defdomdefaults{'hostedsessions'});
+    }
+    unless ($canhost) {
+        if ($authhost eq 'no_account_on_host') {
+            my $checkloginvia = 1;
+            my ($login_host,$hostname) = 
+                &Apache::lonnet::choose_server($udom,$checkloginvia);
+            &Apache::loncommon::content_type($r,'text/html');
+            $r->send_http_header;
+            if ($login_host ne '') {
+                my $protocol = $Apache::lonnet::protocol{$login_host};
+                $protocol = 'http' if ($protocol ne 'https');
+                my $newurl = $protocol.'://'.$hostname.'/adm/createaccount';
+                $r->print(&Apache::loncommon::start_page('Create a user account in LON-CAPA').
+                          '<h3>'.&mt('Account creation').'</h3>'.
+                          &mt('You do not currently have a LON-CAPA account at this institution.').'<br />'.
+                          '<p>'.&mt('You will be able to create one by logging into a LON-CAPA server within the [_1] domain.',$domdesc).'</p>'.
+                          '<p>'.&mt('[_1]Log in[_2]','<a href="'.$newurl.'">','</a>').
+                          &Apache::loncommon::end_page());
+            } else {
+                $r->print(&Apache::loncommon::start_page('Access to LON-CAPA unavailable').
+                          '<h3>'.&mt('Account creation unavailable').'</h3>'.
+                          &mt('You do not currently have a LON-CAPA account at this institution.').'<br />'.
+                          '<p>'.&mt('Currently a LON-CAPA server is not available within the [_1] domain for you to log-in to, to create an account.',$domdesc).'</p>'.
+                          &Apache::loncommon::end_page());
+            }
+        } else {
+            &success($r,$form->{'uname'},$udom,$authhost,'noredirect',undef,
+                     $form);
+            my ($otherserver) = &Apache::lonnet::choose_server($udom);
+            $r->internal_redirect('/adm/switchserver?otherserver='.$otherserver);
+        }
+    }
+    return $canhost;
+}
+
+sub noswitch {
+    my $result = &Apache::loncommon::start_page('Access to LON-CAPA unavailable').
+                 '<h3>'.&mt('Session unavailable').'</h3>'.
+                 &mt('This LON-CAPA server is unable to host your session.').'<br />'.
+                 '<p>'.&mt('Currently no other LON-CAPA server is available to host your session either.').'</p>'.
+                 &Apache::loncommon::end_page();
+    return $result;
+}
+
+sub loginhelpdisplay {
+    my ($authdomain) = @_;
+    my $login_help = 1;
+    my $lang = &Apache::lonlocal::current_language();
+    if ($login_help) {
+        my $dom = $authdomain;
+        if ($dom eq '') {
+            $dom = &Apache::lonnet::default_login_domain();
+        }
+        my %domconfhash = &Apache::loncommon::get_domainconf($dom);
+        my $loginhelp_url;
+        if ($lang) {
+            $loginhelp_url = $domconfhash{$dom.'.login.helpurl_'.$lang};
+            if ($loginhelp_url ne '') {
+                return $loginhelp_url;
+            }
+        }
+        $loginhelp_url = $domconfhash{$dom.'.login.helpurl_nolang'};
+        if ($loginhelp_url ne '') {
+            return $loginhelp_url;
+        } else {
+            return '/adm/loginproblems.html';
+        }
+    }
+    return;
+}
+
+1;
+__END__
+
+


More information about the LON-CAPA-cvs mailing list