Diff for /loncom/auth/lonlogin.pm between versions 1.94.2.1 and 1.201

version 1.94.2.1, 2007/10/09 16:48:51 version 1.201, 2022/06/30 21:04:13
Line 1 Line 1
 # The LearningOnline Network  # The LearningOnline Network
 # Login Screen  # Login Screen
 #  #
 # $Id$  # $Id$
 #  #
 # Copyright Michigan State University Board of Trustees  # Copyright Michigan State University Board of Trustees
 #  #
 # This file is part of the LearningOnline Network with CAPA (LON-CAPA).  # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
 #  #
 # LON-CAPA is free software; you can redistribute it and/or modify  # 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  # it under the terms of the GNU General Public License as published by
 # the Free Software Foundation; either version 2 of the License, or  # the Free Software Foundation; either version 2 of the License, or
 # (at your option) any later version.  # (at your option) any later version.
 #  #
 # LON-CAPA is distributed in the hope that it will be useful,  # LON-CAPA is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of  # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.  # GNU General Public License for more details.
 #  #
 # You should have received a copy of the GNU General Public License  # You should have received a copy of the GNU General Public License
 # along with LON-CAPA; if not, write to the Free Software  # along with LON-CAPA; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 #  #
 # /home/httpd/html/adm/gpl.txt  # /home/httpd/html/adm/gpl.txt
 #  #
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
   
 package Apache::lonlogin;  package Apache::lonlogin;
   
 use strict;  use strict;
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
 use CGI::Cookie();  use Apache::File ();
 use Apache::File ();  use Apache::lonnet;
 use Apache::lonnet;  use Apache::loncommon();
 use Apache::loncommon();  use Apache::lonauth();
 use Apache::lonauth();  use Apache::lonlocal;
 use Apache::lonlocal;  use Apache::migrateuser();
 use Apache::migrateuser();  use lib '/home/httpd/lib/perl/';
 use lib '/home/httpd/lib/perl/';  use LONCAPA qw(:DEFAULT :match);
 use LONCAPA;  use URI::Escape;
    use HTML::Entities();
 sub handler {  use CGI::Cookie();
     my $r = shift;   
   sub handler {
     &Apache::loncommon::get_unprocessed_cgi      my $r = shift;
  (join('&',$ENV{'QUERY_STRING'},$env{'request.querystring'},  
       $ENV{'REDIRECT_QUERY_STRING'}),      &Apache::loncommon::get_unprocessed_cgi
  ['interface','username','domain','firsturl','localpath','localres',   (join('&',$ENV{'QUERY_STRING'},$env{'request.querystring'},
   'token']);        $ENV{'REDIRECT_QUERY_STRING'}),
    ['interface','username','domain','firsturl','localpath','localres',
 # -- check if they are a migrating user    'token','role','symb','iptoken','btoken','ltoken','ttoken','linkkey',
     if (defined($env{'form.token'})) {            'saml','sso','retry']);
  return &Apache::migrateuser::handler($r);  
     }  # -- check if they are a migrating user
       if (defined($env{'form.token'})) {
     &Apache::loncommon::no_cache($r);          return &Apache::migrateuser::handler($r);
     &Apache::lonlocal::get_language_handle($r);      }
     &Apache::loncommon::content_type($r,'text/html');  
     $r->send_http_header;      my $lonhost = $r->dir_config('lonHostID');
     return OK if $r->header_only;      if ($env{'form.ttoken'}) {
           my %info = &Apache::lonnet::tmpget($env{'form.ttoken'});
           &Apache::lonnet::tmpdel($env{'form.ttoken'});
 # Are we re-routing?          if ($info{'origurl'}) {
     if (-e '/home/httpd/html/lon-status/reroute.txt') {              $env{'form.firsturl'} = $info{'origurl'};
  &Apache::lonauth::reroute($r);          }
  return OK;          if ($info{'ltoken'}) {
     }              $env{'form.ltoken'} = $info{'ltoken'};
           } elsif ($info{'linkprot'}) {
               $env{'form.linkprot'} = $info{'linkprot'};
 # -------------------------------- Prevent users from attempting to login twice              foreach my $item ('linkprotuser','linkprotexit') {
     my %cookies=CGI::Cookie->parse($r->header_in('Cookie'));                  if ($info{$item} ne '') {
     my $lonid=$cookies{'lonID'};                      $env{'form.'.$item} = $info{$item};
     my $cookie;                  }
     if ($lonid) {              }
  my $handle=&LONCAPA::clean_handle($lonid->value);          } elsif ($info{'linkkey'} ne '') {
         my $lonidsdir=$r->dir_config('lonIDsDir');              $env{'form.linkkey'} = $info{'linkkey'};
  if (-e "$lonidsdir/$handle.id") {          }
 # Is there an existing token file?      } elsif (($env{'form.sso'}) || ($env{'form.retry'})) {
     if ($handle=~/^publicuser\_/) {          my $infotoken;
 # For "public user" - remove it, we apparently really want to login          if ($env{'form.sso'}) {
  unlink("$lonidsdir/$handle.id");              $infotoken = $env{'form.sso'};
     } elsif ($handle ne '') {          } else {
 # Indeed, a valid token is found              $infotoken = $env{'form.retry'};
  my $start_page =           }
     &Apache::loncommon::start_page('Already logged in');          my $data = &Apache::lonnet::reply('tmpget:'.$infotoken,$lonhost);
  my $end_page =           unless (($data=~/^error/) || ($data eq 'con_lost') ||
     &Apache::loncommon::end_page();                  ($data eq 'no_such_host')) {
  $r->print(<<ENDFAILED);              my %info = &decode_token($data);
 $start_page              foreach my $item (keys(%info)) {
 <h1>You are already logged in</h1>                  $env{'form.'.$item} = $info{$item};
 <p>Please either <a href="/adm/roles">continue the current session</a> or              }
 <a href="/adm/logout">logout</a>.</p>              &Apache::lonnet::tmpdel($infotoken);
 <p>          }
 <a href="/adm/loginproblems.html">Problems?</a></p>      } else {
 $end_page          if (!defined($env{'form.firsturl'})) {
 ENDFAILED              &Apache::lonacc::get_posted_cgi($r,['firsturl']);
                 return OK;          }
      }            if (!defined($env{'form.firsturl'})) {
  }              if ($ENV{'REDIRECT_URL'} =~ m{^/+tiny/+$LONCAPA::match_domain/+\w+$}) {
     }                  $env{'form.firsturl'} = $ENV{'REDIRECT_URL'};
               }
 # ---------------------------------------------------- No valid token, continue          }
           if (($env{'form.firsturl'} =~ m{^/+tiny/+$LONCAPA::match_domain/+\w+$}) &&
  # ---------------------------- Not possible to really login to domain "public"              (!$env{'form.ltoken'}) && (!$env{'form.linkprot'}) && (!$env{'form.linkkey'})) {
     if ($env{'form.domain'} eq 'public') {              &Apache::lonacc::get_posted_cgi($r,['linkkey']);
  $env{'form.domain'}='';          }
  $env{'form.username'}='';          if ($env{'form.firsturl'} eq '/adm/logout') {
     }              delete($env{'form.firsturl'});
 # ----------------------------------------------------------- Process Interface          }
     $env{'form.interface'}=~s/\W//g;      }
   
     my $textbrowsers=$r->dir_config('lonTextBrowsers');  # For "public user" - remove any exising "public" cookie, as user really wants to log-in
     my $httpbrowser=$ENV{"HTTP_USER_AGENT"};      my ($handle,$lonidsdir,$expirepub,$userdom);
           $lonidsdir=$r->dir_config('lonIDsDir');
     foreach (split(/\:/,$textbrowsers)) {      unless ($r->header_only) {
  if ($httpbrowser=~/$_/i) {          $handle = &Apache::lonnet::check_for_valid_session($r,'lonID',undef,\$userdom);
     $env{'form.interface'}='textual';          if ($handle ne '') {
         }              if ($handle=~/^publicuser\_/) {
     }                  unlink($r->dir_config('lonIDsDir')."/$handle.id");
                   undef($handle);
     my $fullgraph=($env{'form.interface'} ne 'textual');                  undef($userdom);
                   $expirepub = 1;
     my $iconpath=               }
  &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL'));          }
       }
     my $domain = &Apache::lonnet::default_login_domain();  
     if (($env{'form.domain'}) &&       &Apache::loncommon::no_cache($r);
  (&Apache::lonnet::domain($env{'form.domain'},'description'))) {      &Apache::lonlocal::get_language_handle($r);
  $domain=$env{'form.domain'};      &Apache::loncommon::content_type($r,'text/html');
     }      if ($expirepub) {
     my $role    = $r->dir_config('lonRole');          my $c = new CGI::Cookie(-name    => 'lonPubID',
     my $loadlim = $r->dir_config('lonLoadLim');                                  -value   => '',
     my $servadm = $r->dir_config('lonAdmEMail');                                  -expires => '-10y',);
     my $lonhost = $r->dir_config('lonHostID');          $r->header_out('Set-cookie' => $c);
     my $tabdir  = $r->dir_config('lonTabDir');      } elsif (($handle eq '') && ($userdom ne '')) {
     my $include = $r->dir_config('lonIncludes');          my %cookies=CGI::Cookie->parse($r->header_in('Cookie'));
     my $expire  = $r->dir_config('lonExpire');          foreach my $name (keys(%cookies)) {
     my $version = $r->dir_config('lonVersion');              next unless ($name =~ /^lon(|S|Link|Pub)ID$/);
     my $host_name = &Apache::lonnet::hostname($lonhost);              my $c = new CGI::Cookie(-name    => $name,
                                       -value   => '',
 # --------------------------------------------- Default values for login fields                                      -expires => '-10y',);
               $r->headers_out->add('Set-cookie' => $c);
     my $authusername=($env{'form.username'}?$env{'form.username'}:'');          }
     my $authdomain=($env{'form.domain'}?$env{'form.domain'}:$domain);      }
       $r->send_http_header;
 # ---------------------------------------------------------- Determine own load      return OK if $r->header_only;
     my $loadavg;  
     {  
  my $loadfile=Apache::File->new('/proc/loadavg');  # Are we re-routing?
  $loadavg=<$loadfile>;      my $londocroot = $r->dir_config('lonDocRoot');
     }      if (-e "$londocroot/lon-status/reroute.txt") {
     $loadavg =~ s/\s.*//g;   &Apache::lonauth::reroute($r);
     my $loadpercent=sprintf("%.1f",100*$loadavg/$loadlim);   return OK;
     my $userloadpercent=&Apache::lonnet::userload();      }
   
 # ------------------------------------------------------- Do the load balancing  # Check if browser sent a LON-CAPA load balancer cookie (and this is a balancer)
     my $otherserver= &Apache::lonnet::absolute_url($host_name);  
     my $firsturl=      my ($found_server,$balancer_cookie) = &Apache::lonnet::check_for_balancer_cookie($r,1);
     ($env{'request.firsturl'}?$env{'request.firsturl'}:$env{'form.firsturl'});      if ($found_server) {
 # ---------------------------------------------------------- Are we overloaded?          my $hostname = &Apache::lonnet::hostname($found_server);
     if ((($userloadpercent>100.0)||($loadpercent>100.0))) {          if ($hostname ne '') {
         my $unloaded=Apache::lonnet::spareserver($loadpercent,$userloadpercent);              my $protocol = $Apache::lonnet::protocol{$found_server};
  if ($unloaded) { $otherserver=$unloaded; }              $protocol = 'http' if ($protocol ne 'https');
     }              my $dest = '/adm/roles';
               if ($env{'form.firsturl'} ne '') {
 # ----------------------------------------------------------- Get announcements                  $dest = &HTML::Entities::encode($env{'form.firsturl'},'\'"<>&');
     my $announcements=&Apache::lonnet::getannounce();              }
 # -------------------------------------------------------- Set login parameters              my %info = (
                            balcookie => $lonhost.':'.$balancer_cookie,
     my @hexstr=('0','1','2','3','4','5','6','7',                         );
                 '8','9','a','b','c','d','e','f');              if ($env{'form.role'}) {
     my $lkey='';                  $info{'role'} = $env{'form.role'};
     for (0..7) {              }
         $lkey.=$hexstr[rand(15)];              if ($env{'form.symb'}) {
     }                  $info{'symb'} = $env{'form.symb'};
               }
     my $ukey='';              my $balancer_token = &Apache::lonnet::tmpput(\%info,$found_server);
     for (0..7) {              unless (($balancer_token eq 'con_lost') || ($balancer_token eq 'refused') ||
         $ukey.=$hexstr[rand(15)];                      ($balancer_token eq 'unknown_cmd') || ($balancer_token eq 'no_such_host')) {
     }                  $dest .=  (($dest=~/\?/)?'&amp;':'?') . 'btoken='.$balancer_token;
               }
     my $lextkey=hex($lkey);              if ($env{'form.firsturl'} =~ m{^/tiny/$match_domain/\w+$}) {
     if ($lextkey>2147483647) { $lextkey-=4294967296; }                  my %link_info;
                   if ($env{'form.ltoken'}) {
     my $uextkey=hex($ukey);                      $link_info{'ltoken'} = $env{'form.ltoken'};
     if ($uextkey>2147483647) { $uextkey-=4294967296; }                  } elsif ($env{'form.linkprot'}) {
                       $link_info{'linkprot'} = $env{'form.linkprot'};
 # -------------------------------------------------------- Store away log token                      foreach my $item ('linkprotuser','linkprotexit') {
     my $logtoken=Apache::lonnet::reply(                          if ($env{'form.'.$item} ne '') {
        'tmpput:'.$ukey.$lkey.'&'.$firsturl,                              $link_info{$item} = $env{'form.'.$item};
        $lonhost);                          }
                       }
 # ------------------- If we cannot talk to ourselves, we are in serious trouble                  } elsif ($env{'form.linkkey'} ne '') {
                       $link_info{'linkkey'} = $env{'form.linkkey'};
     if ($logtoken eq 'con_lost') {                  }
         my $spares='';                  if (keys(%link_info)) {
  my $last;                      $link_info{'origurl'} = $env{'form.firsturl'};
         foreach my $hostid (sort                      my $token = &Apache::lonnet::tmpput(\%link_info,$found_server,'link');
     {                      unless (($token eq 'con_lost') || ($token eq 'refused') ||
  &Apache::lonnet::hostname($a) cmp                              ($token eq 'unknown_cmd') || ($token eq 'no_such_host')) {
     &Apache::lonnet::hostname($b);                          $dest .=  (($dest=~/\?/)?'&amp;':'?') . 'ttoken='.$token;
     }                      }
     keys(%Apache::lonnet::spareid)) {                  }
             next if ($hostid eq $lonhost);              }
     my $hostname = &Apache::lonnet::hostname($hostid);              unless ($found_server eq $lonhost) {
     next if ($last eq $hostname);                  my $alias = &Apache::lonnet::use_proxy_alias($r,$found_server);
             $spares.='<br /><font size="+1"><a href="http://'.                  $hostname = $alias if ($alias ne '');
                 $hostname.              }
                 '/adm/login?domain='.$authdomain.'">'.              my $url = $protocol.'://'.$hostname.$dest;
                 $hostname.'</a>'.              my $start_page =
                 ' (preferred)</font>'.$/;                  &Apache::loncommon::start_page('Switching Server ...',undef,
     $last=$hostname;                                                 {'redirect'       => [0,$url],});
         }              my $end_page   = &Apache::loncommon::end_page();
         $spares.= '<br />';              $r->print($start_page.$end_page);
  my %all_hostnames = &Apache::lonnet::all_hostnames();              return OK;
         foreach my $hostid (sort          }
     {      }
  &Apache::lonnet::hostname($a) cmp  
     &Apache::lonnet::hostname($b);  #
     }  # Check if a LON-CAPA load balancer sent user here because user's browser sent
     keys(%all_hostnames)) {  # it a balancer cookie for an active session on this server.
             next if ($hostid eq $lonhost || $Apache::lonnet::spareid{$hostid});  #
     my $hostname = &Apache::lonnet::hostname($hostid);  
             next if ($last eq $hostname);      my $balcookie;
             $spares.='<br /><a href="http://'.      if ($env{'form.btoken'}) {
                 $hostname.          my %info = &Apache::lonnet::tmpget($env{'form.btoken'});
                 '/adm/login?domain='.$authdomain.'">'.          $balcookie = $info{'balcookie'};
                 $hostname.'</a>';          &Apache::lonnet::tmpdel($env{'form.btoken'});
     $last=$hostname;          delete($env{'form.btoken'});
         }      }
  $r->print(<<ENDTROUBLE);  
 <html>  #
 <head><title>The LearningOnline Network with CAPA</title></head>  # If browser sent an old cookie for which the session file had been removed
 <body bgcolor="#FFFFFF">  # check if configuration for user's domain has a portal URL set.  If so
 <img src="/adm/lonKaputt/lonlogo_broken.gif" align="right" />  # switch user's log-in to the portal.
 <h3>This LON-CAPA server is temporarily not available for login</h3>  #
 <p>Please attempt to login to one of the following servers:</p>$spares  
 </body>      if (($handle eq '') && ($userdom ne '')) {
 </html>          my %domdefaults = &Apache::lonnet::get_domain_defaults($userdom);
 ENDTROUBLE          if ($domdefaults{'portal_def'} =~ /^https?\:/) {
         return OK;              my $start_page = &Apache::loncommon::start_page('Switching Server ...',undef,
     }                                            {'redirect' => [0,$domdefaults{'portal_def'}],});
               my $end_page   = &Apache::loncommon::end_page();
 # ----------------------------------------------- Apparently we are in business              $r->print($start_page.$end_page);
     $servadm=~s/\,/\<br \/\>/g;              return OK;
           }
 # --------------------------------------------------- Print login screen header      }
     $r->print(<<ENDHEADER);  
 <html>  # -------------------------------- Prevent users from attempting to login twice
 <head>      if ($handle ne '') {
 <meta HTTP-EQUIV="Refresh" CONTENT="$expire; url=/adm/roles" />          &Apache::lonnet::transfer_profile_to_env($lonidsdir,$handle);
 <title>The LearningOnline Network with CAPA Login</title>   my $start_page =
 </head>      &Apache::loncommon::start_page('Already logged in');
 ENDHEADER   my $end_page =
 # ---------------------------------------------------- Serve out DES JavaScript      &Apache::loncommon::end_page();
     {          my $dest = '/adm/roles';
  my $jsh=Apache::File->new($include."/londes.js");          if ($env{'form.firsturl'} ne '') {
         $r->print(<$jsh>);              $dest = &HTML::Entities::encode($env{'form.firsturl'},'\'"<>&');
     }          }
           if (($env{'form.ltoken'}) || ($env{'form.linkprot'})) {
 # ----------------------------------------------------------- Front page design              my ($linkprot,$linkprotuser,$linkprotexit);
     my $pgbg=              if ($env{'form.ltoken'}) {
       ($fullgraph?&Apache::loncommon::designparm('login.pgbg',$domain):'#FFFFFF');                  my %info = &Apache::lonnet::tmpget($env{'form.ltoken'});
     my $font=                  $linkprot = $info{'linkprot'};
       ($fullgraph?&Apache::loncommon::designparm('login.font',$domain):'#000000');                  if ($info{'linkprotuser'} ne '') {
     my $link=                      $linkprotuser = $info{'linkprotuser'};
       ($fullgraph?&Apache::loncommon::designparm('login.link',$domain):'#0000FF');                  }
     my $vlink=                  if ($info{'linkprotexit'} ne '') {
       ($fullgraph?&Apache::loncommon::designparm('login.vlink',$domain):'#0000FF');                      $linkprotexit = $info{'linkprotexit'};
     my $alink=&Apache::loncommon::designparm('login.alink',$domain);                  }
     my $mainbg=              } else {
       ($fullgraph?&Apache::loncommon::designparm('login.mainbg',$domain):'#FFFFFF');                  $linkprot = $env{'form.linkprot'};
     my $sidebg=                  $linkprotuser = $env{'form.linkprotuser'};
       ($fullgraph?&Apache::loncommon::designparm('login.sidebg',$domain):'#FFFFFF');                  $linkprotexit = $env{'form.linkprotexit'};
     my $logo=&Apache::loncommon::designparm('login.logo',$domain);              }
     my $img=&Apache::loncommon::designparm('login.img',$domain);              if ($linkprot) {
     my $domainlogo=&Apache::loncommon::domainlogo($domain);                  my ($linkprotector,$deeplink) = split(/:/,$linkprot,2);
     my $showadminmail=&Apache::loncommon::designparm('login.adminmail',                                                      $domain);                  if (($deeplink =~ m{^/tiny/$match_domain/\w+$}) &&
     my $showcoursecat =                      ($linkprotuser ne '') && ($linkprotuser ne $env{'user.name'}.':'.$env{'user.domain'})) {
         &Apache::loncommon::designparm('login.coursecatalog',$domain);                      my $ip = &Apache::lonnet::get_requestor_ip();
                       my %linkprotinfo = (
                                             origurl => $deeplink,
 # ----------------------------------------------------------------------- Texts                                            linkprot => $linkprot,
                                             linkprotuser => $linkprotuser,
 my %lt=&Apache::lonlocal::texthash(                                            linkprotexit => $linkprotexit,
   'un'  => 'Username',                                         );    
   'pw'  => 'Password',                      if ($env{'form.ltoken'}) {
   'dom' => 'Domain',                          my $delete = &Apache::lonnet::tmpdel($env{'form.ltoken'});
   'perc' => 'percent',                      }
   'load' => 'Load',                      &Apache::migrateuser::logout($r,$ip,$handle,undef,undef,\%linkprotinfo);
                   'userload' => 'User Load',                      return OK;
                   'about'  => 'About LON-CAPA',                  }
                   'access' => 'Accessibility Options',                  if ($env{'user.linkprotector'}) {
                   'catalog' => 'Course Catalog',                      my @protectors = split(/,/,$env{'user.linkprotector'});
   'auth' => 'userauthentication.gif',                      unless (grep(/^\Q$linkprotector\E$/,@protectors)) {
   'log' => 'Log in',                          push(@protectors,$linkprotector);
   'help' => 'Log-in Help',                          @protectors = sort { $a <=> $b } @protectors;
   'serv' => 'Server',                          &Apache::lonnet::appenv({'user.linkprotector' => join(',',@protectors)});
                   'servadm' => 'Server Administration',                      }
                   'helpdesk' => 'Contact Helpdesk',                  } else {
                   'forgotpw' => 'Forgot password?');                      &Apache::lonnet::appenv({'user.linkprotector' => $linkprotector });
 # -------------------------------------------------- Change password field name                  }
     my $now=time;                  if ($env{'user.linkproturi'}) {
     my $forgotpw = &forgotpwdisplay(%lt);                      my @proturis = split(/,/,$env{'user.linkproturi'});
     my $loginhelp = &loginhelpdisplay(%lt);                      unless (grep(/^\Q$deeplink\E$/,@proturis)) {
 # ---------------------------------------------------------- Serve rest of page                          push(@proturis,$deeplink);
     $r->print(<<ENDSCRIPT);                          @proturis = sort @proturis;
                           &Apache::lonnet::appenv({'user.linkproturi' => join(',',@proturis)});
 <body bgcolor="$pgbg" text="$font" link="$link" vlink="$vlink" alink="$alink"                      }
   topmargin=0 leftmargin=0 marginwidth=0 marginheight=0>                  } else {
                       &Apache::lonnet::appenv({'user.linkproturi' => $deeplink});
  <script language="JavaScript">                  }
     function send()              }
     {          } elsif ($env{'form.linkkey'} ne '') {
  this.document.server.elements.uname.value              if ($env{'form.firsturl'} =~ m{^/tiny/$match_domain/\w+$}) {
        =this.document.client.elements.uname.value;                  my $linkkey = $env{'form.linkkey'};
                   if ($env{'user.deeplinkkey'}) {
         this.document.server.elements.udom.value                      my @linkkeys = split(/,/,$env{'user.deeplinkkey'});
        =this.document.client.elements.udom.value;                      unless (grep(/^\Q$linkkey\E$/,@linkkeys)) {
                           push(@linkkeys,$linkkey);
         this.document.server.elements.imagesuppress.value                          &Apache::lonnet::appenv({'user.deeplinkkey' => join(',',sort(@linkkeys))});
        =this.document.client.elements.imagesuppress.checked;                      }
                   } else {
         this.document.server.elements.embedsuppress.value                      &Apache::lonnet::appenv({'user.deeplinkkey' => $linkkey});
        =this.document.client.elements.embedsuppress.checked;                  }
                   my $deeplink = $env{'form.firsturl'};
         this.document.server.elements.appletsuppress.value                  if ($env{'user.keyedlinkuri'}) {
        =this.document.client.elements.appletsuppress.checked;                      my @keyeduris = split(/,/,$env{'user.keyedlinkuri'});
                       unless (grep(/^\Q$deeplink\E$/,@keyeduris)) {
         this.document.server.elements.fontenhance.value                          push(@keyeduris,$deeplink);
        =this.document.client.elements.fontenhance.checked;                          &Apache::lonnet::appenv({'user.keyedlinkuri' => join(',',sort(@keyeduris))});
                       }
         this.document.server.elements.blackwhite.value                  } else {
        =this.document.client.elements.blackwhite.checked;                      &Apache::lonnet::appenv({'user.keyedlinkuri' => $deeplink});
                   }
         this.document.server.elements.remember.value              }
        =this.document.client.elements.remember.checked;          }
           if ($env{'form.ltoken'}) {
         uextkey=this.document.client.elements.uextkey.value;              my $delete = &Apache::lonnet::tmpdel($env{'form.ltoken'});
         lextkey=this.document.client.elements.lextkey.value;          }
         initkeys();   $r->print(
                     $start_page
         this.document.server.elements.upass0.value                   .'<p class="LC_warning">'.&mt('You are already logged in!').'</p>'
     =crypted(this.document.client.elements.upass$now.value.substr(0,15));                   .'<p>'.&mt('Please either [_1]continue the current session[_2] or [_3]log out[_4].',
  this.document.server.elements.upass1.value                    '<a href="'.$dest.'">','</a>','<a href="/adm/logout">','</a>').'</p>'
     =crypted(this.document.client.elements.upass$now.value.substr(15,15));                   .$end_page
  this.document.server.elements.upass2.value                   );
     =crypted(this.document.client.elements.upass$now.value.substr(30,15));          return OK;
       }
         this.document.client.elements.uname.value='';  
         this.document.client.elements.upass$now.value='';  # ---------------------------------------------------- No valid token, continue
   
         this.document.server.submit();  # ---------------------------- Not possible to really login to domain "public"
  return false;      if ($env{'form.domain'} eq 'public') {
     }   $env{'form.domain'}='';
  </script>   $env{'form.username'}='';
 ENDSCRIPT      }
   
     if ($fullgraph) {  # ------ Is this page requested because /adm/migrateuser detected an IP change?
  $r->print(      my %sessiondata;
   '<table width="100%" cellpadding=0 cellspacing=0 border=0>');      if ($env{'form.iptoken'}) {
     }          %sessiondata = &Apache::lonnet::tmpget($env{'form.iptoken'});
           unless ($sessiondata{'sessionserver'}) {
     $r->print(<<ENDSERVERFORM);              my $delete = &Apache::lonnet::tmpdel($env{'form.iptoken'});
   <form name="server" action="$otherserver/adm/authenticate" method="post" target="_top">              delete($env{'form.iptoken'});
    <input type="hidden" name="logtoken" value="$logtoken" />          }
    <input type="hidden" name="serverid" value="$lonhost" />      }
    <input type="hidden" name="interface" value="$env{'form.interface'}" />  # ----------------------------------------------------------- Process Interface
    <input type="hidden" name="uname" value="" />      $env{'form.interface'}=~s/\W//g;
    <input type="hidden" name="upass0" value="" />  
    <input type="hidden" name="upass1" value="" />      (undef,undef,undef,undef,undef,undef,my $clientmobile) =
    <input type="hidden" name="upass2" value="" />          &Apache::loncommon::decode_user_agent($r);
    <input type="hidden" name="udom" value="" />  
    <input type="hidden" name="imagesuppress"  value="" />      my $iconpath=
    <input type="hidden" name="appletsuppress"  value="" />   &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL'));
    <input type="hidden" name="embedsuppress"  value="" />  
    <input type="hidden" name="fontenhance"  value="" />      my $domain = &Apache::lonnet::default_login_domain();
    <input type="hidden" name="blackwhite"  value="" />      my $defdom = $domain;
    <input type="hidden" name="remember"  value="" />      if ($lonhost ne '') {
    <input type="hidden" name="localpath" value="$env{'form.localpath'}" />          unless ($sessiondata{'sessionserver'}) {
    <input type="hidden" name="localres" value="$env{'form.localres'}" />              my $redirect = &check_loginvia($domain,$lonhost,$lonidsdir,$balcookie);
   </form>              if ($redirect) {
 ENDSERVERFORM                  $r->print($redirect);
     my $coursecatalog;                  return OK;
     if (($showcoursecat eq '') || ($showcoursecat)) {              }
         $coursecatalog = &coursecatalog_link($lt{'catalog'});          }
     }      }
     if ($fullgraph) { $r->print(<<ENDTOP);  
   <!-- The LON-CAPA Header -->      if (($sessiondata{'domain'}) &&
   <tr>          (&Apache::lonnet::domain($sessiondata{'domain'},'description'))) {
           $domain=$sessiondata{'domain'};
    <!-- Row 1 Columns 2-4 -->      } elsif (($env{'form.domain'}) &&
    <td width="100%" height=75 colspan=4 align="left" valign="top" bgcolor="$pgbg"><img src="$img" border=0 alt="The Learning Online Network with CAPA" /></td>   (&Apache::lonnet::domain($env{'form.domain'},'description'))) {
   </tr>   $domain=$env{'form.domain'};
       }
   <!-- The gray bar that starts the two table frames -->  
   <tr>      my $role    = $r->dir_config('lonRole');
       my $loadlim = $r->dir_config('lonLoadLim');
    <!-- Row 2 Column 1 -->      my $uloadlim= $r->dir_config('lonUserLoadLim');
    <td width=182 height=27 bgcolor="$sidebg">&nbsp;</td>      my $servadm = $r->dir_config('lonAdmEMail');
       my $tabdir  = $r->dir_config('lonTabDir');
    <!-- Row 2 Column 2 -->      my $include = $r->dir_config('lonIncludes');
    <td width=27 height=27 align="left" background="$iconpath/filltop.gif"><img src="$iconpath/upperleft.gif" border=0 alt="" /></td>      my $expire  = $r->dir_config('lonExpire');
       my $version = $r->dir_config('lonVersion');
    <!-- Row 2 Column 3 -->      my $host_name = &Apache::lonnet::hostname($lonhost);
    <td height=27 background="$iconpath/filltop.gif"><img src="$iconpath/filltop.gif" alt="" /></td>  
   # --------------------------------------------- Default values for login fields
    <!-- Row 2 Column 4 -->     
    <td width=27 height=27 align="right" background="$iconpath/filltop.gif"><img src="$iconpath/upperright.gif" border=0 alt="" /></td>      my ($authusername,$authdomain);
   </tr>      if ($sessiondata{'username'}) {
   <tr>          $authusername=$sessiondata{'username'};
          } else {
    <!-- A cell that will hold the 'access', 'about', and 'catalog' links -->          $env{'form.username'} = &Apache::loncommon::cleanup_html($env{'form.username'});
    <!-- Row 3 Column 1 -->          $authusername=($env{'form.username'}?$env{'form.username'}:'');
    <td valign="top" height="60" align="left" bgcolor="$sidebg">      }
     <table cellpadding="0" cellspacing="2" border="0">      if ($sessiondata{'domain'}) {
      <tr>          $authdomain=$sessiondata{'domain'};
       <td>&nbsp;</td>      } else {
       <td><a href="/adm/login?interface=textual"><b>$lt{'access'}</b></a></td>          $env{'form.domain'} = &Apache::loncommon::cleanup_html($env{'form.domain'});
      </tr>          $authdomain=($env{'form.domain'}?$env{'form.domain'}:$domain);
      <tr>      }
       <td>&nbsp;</td>  
       <td><a href="/adm/about.html"><b>$lt{'about'}</b></a></td>  # ---------------------------------------------------------- Determine own load
      </tr>$coursecatalog      my $loadavg;
      <tr>      {
       <td colspan="2">&nbsp;</td>   my $loadfile=Apache::File->new('/proc/loadavg');
      </tr>   $loadavg=<$loadfile>;
     </table>      }
    </td>      $loadavg =~ s/\s.*//g;
    <!-- The shaded space between the two main columns -->  
    <!-- Row 3 Column 2 -->      my ($loadpercent,$userloadpercent);
    <td width=27 height=60 background="$iconpath/fillleft.gif"><img src="$iconpath/fillleft.gif" alt="" /></td>      if ($loadlim) {
           $loadpercent=sprintf("%.1f",100*$loadavg/$loadlim);
    <!-- The right main column holding the large LON-CAPA logo-->      }
    <!-- Rows 3-4 Column 3 -->      if ($uloadlim) {
    <td align="center" valign="top" width="100%" height="100%" bgcolor="$mainbg">          $userloadpercent=&Apache::lonnet::userload();
     <center>      }
      <img src="$logo" alt="" />  
     </center>      my $firsturl=
    </td>      ($env{'request.firsturl'}?$env{'request.firsturl'}:$env{'form.firsturl'});
   
    <!-- Row 3 Column 4 -->  # ----------------------------------------------------------- Get announcements
    <td width=27 background="$iconpath/fillright.gif"><img src="$iconpath/fillright.gif" alt="" /></td>      my $announcements=&Apache::lonnet::getannounce();
   </tr>  # -------------------------------------------------------- Set login parameters
   <tr>  
       my @hexstr=('0','1','2','3','4','5','6','7',
    <!-- The entry form -->                  '8','9','a','b','c','d','e','f');
    <!-- Row 4 Column 1 -->      my $lkey='';
    <td align="center" valign="middle" bgcolor="$sidebg">      for (0..7) {
 ENDTOP          $lkey.=$hexstr[rand(15)];
 } else {      }
     $r->print('<h1>The Learning<i>Online</i> Network with CAPA</h1><h2>Text-based Interface Login</h2>'.$announcements);  
 }      my $ukey='';
     $r->print('<form name="client" onsubmit="return(send())">');      for (0..7) {
     unless ($fullgraph) {          $ukey.=$hexstr[rand(15)];
         $r->print(<<ENDACCESSOPTIONS);      }
 <h3>Select Accessibility Options</h3>  
 <label><input type="checkbox" name="imagesuppress" /> Suppress rendering of images</label><br />      my $lextkey=hex($lkey);
 <label><input type="checkbox" name="appletsuppress" /> Suppress Java applets</label><br />      if ($lextkey>2147483647) { $lextkey-=4294967296; }
 <label><input type="checkbox" name="embedsuppress" /> Suppress rendering of embedded multimedia</label><br />  
 <label><input type="checkbox" name="fontenhance" /> Increase font size</label><br />      my $uextkey=hex($ukey);
 <label><input type="checkbox" name="blackwhite" /> Switch to black and white mode</label><br />      if ($uextkey>2147483647) { $uextkey-=4294967296; }
 <input type="checkbox" name="remember" /> Remember these settings for next login<hr />  
 ENDACCESSOPTIONS  # -------------------------------------------------------- Store away log token
 } else {      my ($tokenextras,$tokentype,$linkprot_for_login);
     $r->print(<<ENDNOOPT);      my @names = ('role','symb','iptoken','ltoken','linkprotuser','linkprotexit','linkprot','linkkey');
 <input type="hidden" name="imagesuppress"  value="" />      foreach my $name (@names) {
 <input type="hidden" name="embedsuppress"  value="" />          if ($env{'form.'.$name} ne '') {
 <input type="hidden" name="appletsuppress"  value="" />              if ($name eq 'ltoken') {
 <input type="hidden" name="fontenhance"  value="" />                  my %info = &Apache::lonnet::tmpget($env{'form.'.$name});
 <input type="hidden" name="blackwhite"  value="" />                  if ($info{'linkprot'}) {
 <input type="hidden" name="remember"  value="" />                      $linkprot_for_login = $info{'linkprot'};
 ENDNOOPT                      $tokenextras .= '&linkprot='.&escape($info{'linkprot'});
 }                      foreach my $item ('linkprotuser','linkprotexit') {
     $r->print(<<ENDLOGIN);                          if ($info{$item}) {
      <input type="hidden" name="lextkey" value="$lextkey">                              $tokenextras .= '&'.$item.'='.&escape($info{$item});
      <input type="hidden" name="uextkey" value="$uextkey">                          }
                       }
      <!-- Start the sub-table for text and input alignment -->                      $tokentype = 'link';
      <table border=0 cellspacing=0 cellpadding=0>                      last;
       <tr><td bgcolor="$sidebg" colspan=2><img src="$iconpath/$lt{'auth'}" alt="User Authentication" /></td></tr>                  }
       <tr>              } else {
        <td bgcolor="$mainbg"><br /><font size=-1><b>&nbsp;&nbsp;&nbsp;<label for="uname">$lt{'un'}</label>:</b></font></td>                  $tokenextras .= '&'.$name.'='.&escape($env{'form.'.$name});
        <td bgcolor="$mainbg"><br /><input type="text" name="uname" size="10" value="$authusername" /></td>                  if (($name eq 'linkkey') || ($name eq 'linkprot')) {
       </tr>                      if ((($env{'form.retry'}) || ($env{'form.sso'})) &&
       <tr>                          (!$env{'form.ltoken'}) && ($name eq 'linkprot')) {
        <td bgcolor="$mainbg"><font size=-1><b>&nbsp;&nbsp;&nbsp;<label for="upass$now">$lt{'pw'}</label>:</b></font></td>                          $linkprot_for_login = $env{'form.linkprot'};
        <td bgcolor="$mainbg"><input type="password" name="upass$now" size="10" /></td>                      }
       </tr>                      $tokentype = 'link';
       <tr>                  }
        <td bgcolor="$mainbg"><font size=-1><b>&nbsp;&nbsp;&nbsp;<label for="udom">$lt{'dom'}</label>:</b></font></td>              }
        <td bgcolor="$mainbg"><input type="text" name="udom" size="10" value="$authdomain" /></td>          }
       </tr>      }
       <tr>      if ($tokentype) {
        <td bgcolor="$mainbg">&nbsp;</td>          $tokenextras .= ":$tokentype";
        <td bgcolor="$mainbg" valign="bottom" align="center">      }
         <br />      my $logtoken=Apache::lonnet::reply(
         <input type="submit" value="$lt{'log'}" />         'tmpput:'.$ukey.$lkey.'&'.&escape($firsturl).$tokenextras,
        </td>         $lonhost);
       </tr>  
       <tr>  # -- If we cannot talk to ourselves, or hostID does not map to a hostname
        <td bgcolor="$mainbg" valign="bottom" align="left" colspan="2">  #    we are in serious trouble
         $loginhelp  
         $forgotpw      if (($logtoken eq 'con_lost') || ($logtoken eq 'no_such_host')) {
        </td>          if ($logtoken eq 'no_such_host') {
       </tr>              &Apache::lonnet::logthis('No valid logtoken for log-in page -- unable to determine hostname for hostID: '.$lonhost.'. Check entry in hosts.tab');
      </table>          }
      <!-- End sub-table -->          if ($env{'form.ltoken'}) {
     </form>              &Apache::lonnet::tmpdel($env{'form.ltoken'});
 ENDLOGIN              delete($env{'form.ltoken'});
     if ($fullgraph) {          }
         my $helpdeskscript;          my $spares='';
         my $contactblock = &contactdisplay(\%lt,$servadm,$showadminmail,          my (@sparehosts,%spareservers);
                                   $version,$authdomain,\$helpdeskscript);          my $sparesref = &Apache::lonnet::this_host_spares($defdom);
  $r->print(<<ENDDOCUMENT);          if (ref($sparesref) eq 'HASH') {
    </td>              foreach my $key (keys(%{$sparesref})) {
                   if (ref($sparesref->{$key}) eq 'ARRAY') {
    <!-- Row 4 Column 2 -->                      my @sorted = sort { &Apache::lonnet::hostname($a) cmp
    <td width=27 background="$iconpath/fillleft.gif"><img src="$iconpath/fillleft.gif" alt="" /></td>                                          &Apache::lonnet::hostname($b);
                                         } @{$sparesref->{$key}};
    <!-- Row 4 Column 3 -->                      if (@sorted) {
 <td bgcolor="$mainbg">$announcements</td>                          if ($key eq 'primary') {
                               unshift(@sparehosts,@sorted);
    <!-- Row 4 Column 4 -->                          } elsif ($key eq 'default') {
    <td width=27 background="$iconpath/fillright.gif"><img src="$iconpath/fillright.gif" alt="" /></td>                              push(@sparehosts,@sorted);
   </tr>                          }
   <tr>                      }
                   }
    <!-- Row 5 Column 1 -->              }
    <td bgcolor="$sidebg" valign="middle" align="left">          }
      <br />          foreach my $hostid (@sparehosts) {
      <table border=0 cellspacing=0 cellpadding=0>              next if ($hostid eq $lonhost);
       <tr>      my $hostname = &Apache::lonnet::hostname($hostid);
        <td bgcolor="$sidebg" align="left" valign="top">      next if (($hostname eq '') || ($spareservers{$hostname}));
         <small><b>&nbsp;&nbsp;&nbsp;$lt{'dom'}:&nbsp;</b></small>              $spareservers{$hostname} = 1;
        </td>              my $protocol = $Apache::lonnet::protocol{$hostid};
        <td bgcolor="$sidebg" align="left" valign="top">              $protocol = 'http' if ($protocol ne 'https');
         <small><tt>&nbsp;$domain</tt></small>              $spares.='<br /><span style="font-size: larger;"><a href="'.$protocol.'://'.
        </td>                  $hostname.
       </tr>                  '/adm/login?domain='.$authdomain.'">'.
       <tr>                  $hostname.'</a>'.
        <td bgcolor="$sidebg" align="left" valign="top">                  ' '.&mt('(preferred)').'</span>'.$/;
         <small><b>&nbsp;&nbsp;&nbsp;$lt{'serv'}:&nbsp;</b></small>          }
        </td>          if ($spares) {
        <td bgcolor="$sidebg" align="left" valign="top">              $spares.= '<br />';
         <small><tt>&nbsp;$lonhost ($role)</tt></small>          }
        </td>          my %all_hostnames = &Apache::lonnet::all_hostnames();
       </tr>          foreach my $hostid (sort
       <tr>      {
        <td bgcolor="$sidebg" align="left" valign="top">   &Apache::lonnet::hostname($a) cmp
         <small><b>&nbsp;&nbsp;&nbsp;$lt{'load'}:&nbsp;</b></small>      &Apache::lonnet::hostname($b);
        </td>      }
        <td bgcolor="$sidebg" align="left" valign="top">      keys(%all_hostnames)) {
         <small><tt>&nbsp;$loadpercent $lt{'perc'}</tt></small>              next if ($hostid eq $lonhost);
        </td>              my $hostname = &Apache::lonnet::hostname($hostid);
       </tr>              next if (($hostname eq '') || ($spareservers{$hostname}));
       <tr>              $spareservers{$hostname} = 1;
        <td bgcolor="$sidebg" align="left" valign="top">              my $protocol = $Apache::lonnet::protocol{$hostid};
         <small><b>&nbsp;&nbsp;&nbsp;$lt{'userload'}:&nbsp;</b></small>              $protocol = 'http' if ($protocol ne 'https');
        </td>              $spares.='<br /><a href="'.$protocol.'://'.
        <td bgcolor="$sidebg" align="left" valign="top">               $hostname.
         <small><tt>&nbsp;$userloadpercent $lt{'perc'}</tt></small>               '/adm/login?domain='.$authdomain.'">'.
        </td>               $hostname.'</a>';
       </tr>           }
      </table>           $r->print(
      <br />     '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'
     $contactblock    .'<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">'
    </td>    .'<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>'
     .&mt('The LearningOnline Network with CAPA')
    <!-- Row 5 Column 2 -->    .'</title></head>'
    <td width=27 background="$iconpath/fillleft.gif"><img src="$iconpath/fillleft.gif" alt="" /></td>    .'<body bgcolor="#FFFFFF">'
     .'<h1>'.&mt('The LearningOnline Network with CAPA').'</h1>'
    <!-- Row 5 Column 3 -->    .'<img src="/adm/lonKaputt/lonlogo_broken.gif" alt="broken icon" align="right" />'
    <td width="100%" valign="bottom" bgcolor="$mainbg">    .'<h3>'.&mt('This LON-CAPA server is temporarily not available for login.').'</h3>');
 $domainlogo          if ($spares) {
 </td>              $r->print('<p>'.&mt('Please attempt to login to one of the following servers:')
                        .'</p>'
    <!-- Row 5 Column 4 -->                       .$spares);
    <td width=27 background="$iconpath/fillright.gif"><img src="$iconpath/fillright.gif" alt="" /></td>          }
   </tr>          $r->print('</body>'
   <tr>                   .'</html>'
           );
    <!-- Row 6 Column 1 -->          return OK;
    <td bgcolor="$sidebg">&nbsp;</td>      }
   
    <!-- Row 6 Column 2 -->  # ----------------------------------------------- Apparently we are in business
    <td align="left" background="$iconpath/fillbottom.gif"><img src="$iconpath/lowerleft.gif" alt="" /></td>      $servadm=~s/\,/\<br \/\>/g;
   
    <!-- Row 6 Column 3 -->  # ----------------------------------------------------------- Front page design
    <td background="$iconpath/fillbottom.gif"><img src="$iconpath/fillbottom.gif" alt="" /></td>      my $pgbg=&Apache::loncommon::designparm('login.pgbg',$domain);
       my $font=&Apache::loncommon::designparm('login.font',$domain);
    <!-- Row 6 Column 4 -->      my $link=&Apache::loncommon::designparm('login.link',$domain);
    <td align="right" background="$iconpath/fillbottom.gif"><img src="$iconpath/lowerright.gif" alt="" /></td>      my $vlink=&Apache::loncommon::designparm('login.vlink',$domain);
   </tr>      my $alink=&Apache::loncommon::designparm('login.alink',$domain);
  </table>      my $mainbg=&Apache::loncommon::designparm('login.mainbg',$domain);
       my $loginbox_bg=&Apache::loncommon::designparm('login.sidebg',$domain);
 <script type="text/javascript">      my $loginbox_header_bgcol=&Apache::loncommon::designparm('login.bgcol',$domain);
 // the if prevents the script error if the browser can not handle this      my $loginbox_header_textcol=&Apache::loncommon::designparm('login.textcol',$domain);
 if ( document.client.uname ) { document.client.uname.focus(); }      my $logo=&Apache::loncommon::designparm('login.logo',$domain);
 </script>      my $img=&Apache::loncommon::designparm('login.img',$domain);
 $helpdeskscript      my $domainlogo=&Apache::loncommon::domainlogo($domain);
       my $showbanner = 1;
 ENDDOCUMENT      my $showmainlogo = 1;
 }      if (defined(&Apache::loncommon::designparm('login.showlogo_img',$domain))) {
     $r->print('</body></html>');          $showbanner = &Apache::loncommon::designparm('login.showlogo_img',$domain);
     return OK;      }
 }      if (defined(&Apache::loncommon::designparm('login.showlogo_logo',$domain))) {
           $showmainlogo = &Apache::loncommon::designparm('login.showlogo_logo',$domain);
 sub contactdisplay {      }
     my ($lt,$servadm,$showadminmail,$version,$authdomain,$helpdeskscript) = @_;      my $showadminmail;
     my $contactblock;      my @possdoms = &Apache::lonnet::current_machine_domains();
     my $showhelpdesk = 0;      if (grep(/^\Q$domain\E$/,@possdoms)) {
     my $requestmail = $Apache::lonnet::perlvar{'lonSupportEMail'};          $showadminmail=&Apache::loncommon::designparm('login.adminmail',$domain);
     if ($requestmail =~ m/^[^\@]+\@[^\@]+$/) {      }
         $showhelpdesk = 1;      my $showcoursecat =
     }          &Apache::loncommon::designparm('login.coursecatalog',$domain);
     if ($servadm && $showadminmail) {      my $shownewuserlink =
         $contactblock .= '<b>&nbsp;&nbsp;&nbsp;'.$$lt{'servadm'}.':</b><br />'.          &Apache::loncommon::designparm('login.newuser',$domain);
                          '<tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.$servadm.'</tt><br />&nbsp;<br />';      my $showhelpdesk =
     }          &Apache::loncommon::designparm('login.helpdesk',$domain);
     if ($showhelpdesk) {      my $now=time;
         $contactblock .= '<b>&nbsp;&nbsp;&nbsp;<a href="javascript:helpdesk()"><font size="+1">'.$lt->{'helpdesk'}.'</font></a></b><br />';      my $js = (<<ENDSCRIPT);
         my $thisurl = &escape('/adm/login');  
         $$helpdeskscript = <<"ENDSCRIPT";  <script type="text/javascript" language="JavaScript">
 <script type="text/javascript">  // <![CDATA[
 function helpdesk() {  function send()
     var codedom = document.client.udom.value;  {
     if (codedom == '') {  this.document.server.elements.uname.value
         codedom = "$authdomain";  =this.document.client.elements.uname.value;
     }  
     var querystr = "origurl=$thisurl&codedom="+codedom;  this.document.server.elements.udom.value
     document.location.href = "/adm/helpdesk?"+querystr;  =this.document.client.elements.udom.value;
     return;  
 }  uextkey=this.document.client.elements.uextkey.value;
 </script>  lextkey=this.document.client.elements.lextkey.value;
 ENDSCRIPT  initkeys();
     }  
     $contactblock .= <<"ENDBLOCK";  if(this.document.server.action.substr(0,5) === 'http:'){
      &nbsp;&nbsp;&nbsp;$version      this.document.server.elements.upass0.value
 ENDBLOCK          =getCrypted(this.document.client.elements.upass$now.value);
     return $contactblock;  } else {
 }      this.document.server.elements.upass0.value
           =this.document.client.elements.upass$now.value;
 sub forgotpwdisplay {  }
     my (%lt) = @_;  
     my $prompt_for_resetpw = 1;   this.document.client.elements.uname.value='';
     if ($prompt_for_resetpw) {  this.document.client.elements.upass$now.value='';
         return '<br />&nbsp;&nbsp;&nbsp;<a href="/adm/resetpw">'.$lt{'forgotpw'}.'</a></b><br /><br />';  
     }  this.document.server.submit();
     return;  return false;
 }  }
   
 sub loginhelpdisplay {  function enableInput() {
     my (%lt) = @_;      this.document.client.elements.upass$now.removeAttribute("readOnly");
     my $login_help = 1;      this.document.client.elements.uname.removeAttribute("readOnly");
     if ($login_help) {      this.document.client.elements.udom.removeAttribute("readOnly");
         return '&nbsp;&nbsp;&nbsp;<a href="/adm/loginproblems.html">'.$lt{'help'}.'</a></b>';      return;
     }  }
     return;  
 }  // ]]>
   </script>
 sub coursecatalog_link {  
     my ($linkname) = @_;  ENDSCRIPT
     return <<"END";  
      <tr>      my ($lonhost_in_use,@hosts,%defaultdomconf,$saml_prefix,$saml_landing,
       <td>&nbsp;</td>          $samlssotext,$samlnonsso,$samlssoimg,$samlssoalt,$samlssourl,$samltooltip);
       <td><a href="/adm/coursecatalog"><b>$linkname</b></a></td>      %defaultdomconf = &Apache::loncommon::get_domainconf($defdom);
      </tr>      @hosts = &Apache::lonnet::current_machine_ids();
 END      $lonhost_in_use = $lonhost;
 }      if (@hosts > 1) {
           foreach my $hostid (@hosts) {
 1;              if (&Apache::lonnet::host_domain($hostid) eq $defdom) {
 __END__                  $lonhost_in_use = $hostid;
                   last;
               }
           }
       }
       $saml_prefix = $defdom.'.login.saml_';
       if ($defaultdomconf{$saml_prefix.$lonhost_in_use}) {
           $saml_landing = 1;
           $samlssotext = $defaultdomconf{$saml_prefix.'text_'.$lonhost_in_use};
           $samlnonsso = $defaultdomconf{$saml_prefix.'notsso_'.$lonhost_in_use};
           $samlssoimg = $defaultdomconf{$saml_prefix.'img_'.$lonhost_in_use};
           $samlssoalt = $defaultdomconf{$saml_prefix.'alt_'.$lonhost_in_use};
           $samlssourl = $defaultdomconf{$saml_prefix.'url_'.$lonhost_in_use};
           $samltooltip = $defaultdomconf{$saml_prefix.'title_'.$lonhost_in_use};
       }
       if ($saml_landing) {
          if ($samlssotext eq '') {
              $samlssotext = 'SSO Login';
          }
          if ($samlnonsso eq '') {
              $samlnonsso = 'Non-SSO Login';
          }
          $js .= <<"ENDSAMLJS";
   
   <script type="text/javascript">
   // <![CDATA[
   function toggleLClogin() {
       if (document.getElementById('LC_standard_login')) {
           if (document.getElementById('LC_standard_login').style.display == 'none') {
               document.getElementById('LC_standard_login').style.display = 'inline-block';
               if (document.getElementById('LC_login_text')) {
                   document.getElementById('LC_login_text').innerHTML = '$samlnonsso';
               }
               if ( document.client.uname ) { document.client.uname.focus(); }
               if (document.getElementById('LC_SSO_login')) {
                   document.getElementById('LC_SSO_login').style.display = 'none';
               }
           } else {
               document.getElementById('LC_standard_login').style.display = 'none';
               if (document.getElementById('LC_login_text')) {
                   document.getElementById('LC_login_text').innerHTML = '$samlssotext';
               }
               if (document.getElementById('LC_SSO_login')) {
                   document.getElementById('LC_SSO_login').style.display = 'inline-block';
               }
           }
       }
       return;
   }
   
   // ]]>
   </script>
   
   ENDSAMLJS
       }
   
   # --------------------------------------------------- Print login screen header
   
       my %add_entries = (
          bgcolor      => "$mainbg",
          text         => "$font",
          link         => "$link",
          vlink        => "$vlink",
          alink        => "$alink",
                  onload       => 'javascript:enableInput();',);
   
       my ($headextra,$headextra_exempt);
       $headextra = $defaultdomconf{$defdom.'.login.headtag_'.$lonhost_in_use};
       $headextra_exempt = $defaultdomconf{$domain.'.login.headtag_exempt_'.$lonhost_in_use};
       if ($headextra) {
           my $omitextra;
           if ($headextra_exempt ne '') {
               my @exempt = split(',',$headextra_exempt);
               my $ip = &Apache::lonnet::get_requestor_ip();
               if (grep(/^\Q$ip\E$/,@exempt)) {
                   $omitextra = 1;
               }
           }
           unless ($omitextra) {
               my $confname = $defdom.'-domainconfig';
               if ($headextra =~ m{^\Q/res/$defdom/$confname/login/headtag/$lonhost_in_use/\E}) {
                   my $extra = &Apache::lonnet::getfile(&Apache::lonnet::filelocation("",$headextra));
                   unless ($extra eq '-1') {
                       $js .= "\n".$extra."\n";
                   }
               }
           }
       }
   
       $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'   => 'Change?',
          );
   # -------------------------------------------------- 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="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())" id="lclogin">
     <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) {
           my $alttext = &Apache::loncommon::designparm('login.alttext_img',$domain);
           if ($alttext eq '') {
               $alttext = 'The Learning Online Network with CAPA';
           }
           $r->print(<<HEADER);
   <!-- The LON-CAPA Header -->
   <div style="background:$pgbg;margin:0;width:100%;">
     <img src="$img" border="0" alt="$alttext" class="LC_maxwidth" id="lcloginbanner" />
   </div>
   HEADER
       }
   
       my $stdauthformstyle = 'inline-block';
       my $ssoauthstyle = 'none';
       my $logintype;
       $r->print('<div style="float:left;margin-top:0;">');
       if ($saml_landing) {
           $ssoauthstyle = 'inline-block';
           $stdauthformstyle = 'none';
           $logintype = $samlssotext;
           my $ssologin = '/adm/sso';
           if ($samlssourl  ne '') {
               $ssologin = $samlssourl;
           }
           if (($logtoken eq 'con_lost') || ($logtoken eq 'no_such_host')) {
               my $querystring;
               if ($env{'form.firsturl'} ne '') {
                   $querystring = 'origurl=';
                   if ($env{'form.firsturl'} =~ /[^\x00-\xFF]/) {
                       $querystring .= &uri_escape_utf8($env{'form.firsturl'});
                   } else {
                       $querystring .= &uri_escape($env{'form.firsturl'});
                   }
                   $querystring = &HTML::Entities::encode($querystring,"'");
               }
               if ($env{'form.ltoken'} ne '') {
                   $querystring .= (($querystring eq '')?'':'&amp;') . 'ltoken='.
                                     &HTML::Entities::encode(&uri_escape($env{'form.ltoken'}));
               } elsif ($env{'form.linkkey'}) {
                   $querystring .= (($querystring eq '')?'':'&amp;') . 'linkkey='.
                                     &HTML::Entities::encode(&uri_escape($env{'form.linkkey'}));
               }
               if ($querystring ne '') {
                   $ssologin .= (($ssologin=~/\?/)?'&amp;':'?') . $querystring;
               }
           } elsif ($logtoken ne '') {
               $ssologin .= (($ssologin=~/\?/)?'&amp;':'?') . 'logtoken='.$logtoken;
           }
           my $ssohref;
           if ($samlssoimg ne '') {
               $ssohref = '<a href="'.$ssologin.'" title="'.$samltooltip.'">'.
                          '<img src="'.$samlssoimg.'" alt="'.$samlssoalt.'" id="lcssobutton" /></a>';
           } else {
               $ssohref = '<a href="'.$ssologin.'">'.$samlssotext.'</a>';
           }
           if (($env{'form.saml'} eq 'no') ||
               (($env{'form.username'} ne '') && ($env{'form.domain'} ne ''))) {
               $ssoauthstyle = 'none';
               $stdauthformstyle = 'inline-block';
               $logintype = $samlnonsso;
           }
           $r->print(<<ENDSAML);
   <p>
   Log-in type:
   <span style="font-weight:bold" id="LC_login_text">$logintype</span><br />
   <span><a href="javascript:toggleLClogin();" style="color:#000000">$lt{'change'}</a></span>
   </p>
   <div style="display:$ssoauthstyle" id="LC_SSO_login">
   <div class="LC_Box" style="padding-top: 10px;">
   $ssohref
   $noscript_warning
   </div>
   <div class="LC_Box" style="padding-top: 10px;">
   $loginhelp
   $contactblock
   $coursecatalog
   </div>
   </div>
   ENDSAML
       } else {
           if ($env{'form.ltoken'}) {
               &Apache::lonnet::tmpdel($env{'form.ltoken'});
               delete($env{'form.ltoken'});
           }
       }
       my $in_frame_js;
       if ($linkprot_for_login) {
           my ($linkprotector,$linkproturi) = split(/:/,$linkprot_for_login,2);
           if (($linkprotector =~ /^\d+(c|d)$/) && ($linkproturi =~ m{^/+tiny/+$LONCAPA::match_domain/+\w+$})) {
               my $set_target;
               if (($env{'form.retry'}) || ($env{'form.sso'})) {
                   if ($linkproturi eq $env{'form.firsturl'}) {
                       $set_target = "    document.server.target = '_self';";
                   }
               } else {
                   $set_target = <<ENDTARG;
       var linkproturi = '$linkproturi';
       var path = document.location.pathname.replace( new RegExp('^/adm/launch'),'');
       if (linkproturi == path) {
           document.server.target = '_self';
       }
   ENDTARG
               }
               $in_frame_js = <<ENDJS;
   <script type="text/javascript">
   // <![CDATA[
   if ((window.self !== window.top) && (document.server.target != '_self')) {
       $set_target
   }
   // ]]>
   </script>
   ENDJS
           }
       }
   
       $r->print(<<ENDLOGIN);
   <div style="display:$stdauthformstyle;" id="LC_standard_login">
   <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>
   
   ENDLOGIN
       $r->print('</div><div>'."\n");
       if ($showmainlogo) {
           my $alttext = &Apache::loncommon::designparm('login.alttext_logo',$domain);
           $r->print(' <img src="'.$logo.'" alt="'.$alttext.'" class="LC_maxwidth" id="lcloginmainlogo" />'."\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'}:&nbsp;</b></small>
          </td>
          <td  align="left" valign="top">
           <small><tt>&nbsp;$domain</tt></small>
          </td>
         </tr>
   END
       $serverrow = <<"END";
         <tr>
          <td  align="left" valign="top">
           <small><b>$lt{'serv'}:&nbsp;</b></small>
          </td>
          <td align="left" valign="top">
           <small><tt>&nbsp;$lonhost ($role)</tt></small>
          </td>
         </tr>
   END
       if ($loadlim) {
           $loadrow = <<"END";
         <tr>
          <td align="left" valign="top">
           <small><b>$lt{'load'}:&nbsp;</b></small>
          </td>
          <td align="left" valign="top">
           <small><tt>&nbsp;$loadpercent $lt{'perc'}</tt></small>
          </td>
         </tr>
   END
       }
       if ($uloadlim) {
           $userloadrow = <<"END";
         <tr>
          <td align="left" valign="top">
           <small><b>$lt{'userload'}:&nbsp;</b></small>
          </td>
          <td align="left" valign="top">
           <small><tt>&nbsp;$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>
   
   $in_frame_js
   <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,$lonidsdir,$balcookie) = @_;
       if ($domain eq '' || $lonhost eq '' || $lonidsdir 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 = &Apache::lonnet::get_requestor_ip();  
           if ($ip eq '127.0.0.1') {
               $noredirect = 1;
           } else {
               if ($loginvia_exempt ne '') {
                   my @exempt = split(',',$loginvia_exempt);
                   if (grep(/^\Q$ip\E$/,@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 '') {
                       if ($balcookie) {
                           my ($balancer,$cookie) = split(/:/,$balcookie);
                           if ($cookie =~ /^($match_domain)_($match_username)_([a-f0-9]+)$/) {
                               my ($udom,$uname,$cookieid) = ($1,$2,$3);
                               unless (&Apache::lonnet::delbalcookie($cookie,$balancer) eq 'ok') {
                                   if ((-d $lonidsdir) && (opendir(my $dh,$lonidsdir))) {
                                       while (my $filename=readdir($dh)) {
                                           if ($filename=~/^(\Q$uname\E_\d+_\Q$udom\E_$match_lonid)\.id$/) {
                                               my $handle = $1;
                                               my %hash =
                                                   &Apache::lonnet::get_sessionfile_vars($handle,$lonidsdir,
                                                                                        ['request.balancercookie',
                                                                                         'user.linkedenv']);
                                               if ($hash{'request.balancercookie'} eq "$balancer:$cookieid") {
                                                   if (unlink("$lonidsdir/$filename")) {
                                                       if (($hash{'user.linkedenv'} =~ /^[a-f0-9]+_linked$/) &&
                                                           (-l "$lonidsdir/$hash{'user.linkedenv'}.id") &&
                                                           (readlink("$lonidsdir/$hash{'user.linkedenv'}.id") eq "$lonidsdir/$filename")) {
                                                           unlink("$lonidsdir/$hash{'user.linkedenv'}.id");
                                                       }
                                                   }
                                               }
                                               last;
                                           }
                                       }
                                       closedir($dh);
                                   }
                               }
                           }
                       }
                       $output = &redirect_page($newhost,$path);
                   }
               }
           }
       }
       return $output;
   }
   
   sub redirect_page {
       my ($desthost,$path) = @_;
       my $hostname = &Apache::lonnet::hostname($desthost);
       my $protocol = $Apache::lonnet::protocol{$desthost};
       $protocol = 'http' if ($protocol ne 'https');
       unless ($path =~ m{^/}) {
           $path = '/'.$path;
       }
       my $url = $protocol.'://'.$hostname.$path;
       my $args = {};
       if ($env{'form.firsturl'} =~ m{^/tiny/$match_domain/\w+$}) {
           $url = $protocol.'://'.$hostname.$env{'form.firsturl'};
           if (($env{'form.ltoken'}) || ($env{'form.linkprot'} ne '') ||
               ($env{'form.linkkey'} ne '')) {
               my %link_info;
               if ($env{'form.ltoken'}) {
                   %link_info = &Apache::lonnet::tmpget($env{'form.ltoken'});
                   &Apache::lonnet::tmpdel($env{'form.ltoken'});
                   $args->{'only_body'} = 1;
               } elsif ($env{'form.linkprot'}) {
                   $link_info{'linkprot'} = $env{'form.linkprot'};
                   foreach my $item ('linkprotuser','linkprotexit') {
                       if ($env{'form.'.$item}) {
                           $link_info{$item} = $env{'form.'.$item};
                       }
                   }
                   $args->{'only_body'} = 1;
               } elsif ($env{'form.linkkey'} ne '') {
                   $link_info{'linkkey'} = $env{'form.linkkey'};
               }
               my $token = &Apache::lonnet::tmpput(\%link_info,$desthost,'link');
               unless (($token eq 'con_lost') || ($token eq 'refused') ||
                       ($token eq 'unknown_cmd') || ($token eq 'no_such_host')) {
                   $url .= '?ltoken='.$token;
               }
           }
       } else {
           my $querystring;
           if ($env{'form.firsturl'} ne '') {
               if ($env{'form.firsturl'} =~ /[^\x00-\xFF]/) {
                   $querystring = &uri_escape_utf8($env{'form.firsturl'});
               } else {
                   $querystring = &uri_escape($env{'form.firsturl'});
               }
               $querystring = &HTML::Entities::encode($querystring,"'");
               $querystring = '?firsturl='.$querystring;
           }
           if ($env{'form.ltoken'}) {
               my %link_info = &Apache::lonnet::tmpget($env{'form.ltoken'});
               &Apache::lonnet::tmpdel($env{'form.ltoken'});
               my $token = &Apache::lonnet::tmpput(\%link_info,$desthost,'link');
               unless (($token eq 'con_lost') || ($token eq 'refused') || ($token =~ /^error:/) ||
                       ($token eq 'unknown_cmd') || ($token eq 'no_such_host')) {
                   unless (($path eq '/adm/roles') || ($path eq '/adm/login')) {
                       $url = $protocol.'://'.$hostname.'/adm/roles';
                   }
                   $querystring .= (($querystring =~/^\?/)?'&amp;':'?') . 'ttoken='.$token;
               }
           }
           $url .= $querystring;
       }
       $args->{'redirect'} = [0,$url];
       my $start_page = &Apache::loncommon::start_page('Switching Server ...',undef,$args);
       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>';
   }
   
   sub decode_token {
       my ($info) = @_;
       my ($firsturl,@rest)=split(/\&/,$info);
       my %form;
       if ($firsturl ne '') {
           $form{'firsturl'} = &unescape($firsturl);
       }
       foreach my $item (@rest) {
           my ($key,$value) = split(/=/,$item);
           $form{$key} = &unescape($value);
       }
       return %form;
   }
   
   1;
   __END__

Removed from v.1.94.2.1  
changed lines
  Added in v.1.201


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.