Annotation of loncom/auth/lonauth.pm, revision 1.121.2.5

1.1       albertel    1: # The LearningOnline Network
                      2: # User Authentication Module
1.27      www         3: #
1.121.2.5! raeburn     4: # $Id: lonauth.pm,v 1.121.2.4 2013/08/13 13:29:09 raeburn Exp $
1.27      www         5: #
                      6: # Copyright Michigan State University Board of Trustees
                      7: #
                      8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
                      9: #
                     10: # LON-CAPA is free software; you can redistribute it and/or modify
                     11: # it under the terms of the GNU General Public License as published by
                     12: # the Free Software Foundation; either version 2 of the License, or
                     13: # (at your option) any later version.
                     14: #
                     15: # LON-CAPA is distributed in the hope that it will be useful,
                     16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
                     17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     18: # GNU General Public License for more details.
                     19: #
                     20: # You should have received a copy of the GNU General Public License
                     21: # along with LON-CAPA; if not, write to the Free Software
                     22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     23: #
                     24: # /home/httpd/html/adm/gpl.txt
                     25: #
                     26: # http://www.lon-capa.org/
                     27: #
1.1       albertel   28: 
                     29: package Apache::lonauth;
                     30: 
1.18      albertel   31: use strict;
1.78      albertel   32: use LONCAPA;
1.1       albertel   33: use Apache::Constants qw(:common);
                     34: use CGI qw(:standard);
1.26      harris41   35: use DynaLoader; # for Crypt::DES version
1.8       www        36: use Crypt::DES;
1.45      matthew    37: use Apache::loncommon();
1.66      albertel   38: use Apache::lonnet;
1.12      www        39: use Apache::lonmenu();
1.90      raeburn    40: use Apache::createaccount;
1.18      albertel   41: use Fcntl qw(:flock);
1.56      www        42: use Apache::lonlocal;
1.119     raeburn    43: use Apache::File();
1.101     raeburn    44: use HTML::Entities;
1.85      albertel   45:  
1.1       albertel   46: # ------------------------------------------------------------ Successful login
1.85      albertel   47: sub success {
                     48:     my ($r, $username, $domain, $authhost, $lowerurl, $extra_env,
                     49: 	$form) = @_;
1.1       albertel   50: 
1.85      albertel   51: # ------------------------------------------------------------ Get cookie ready
                     52:     my $cookie =
                     53: 	&Apache::loncommon::init_user_environment($r, $username, $domain,
                     54: 						  $authhost, $form,
1.86      albertel   55: 						  {'extra_env' => $extra_env,});
1.4       www        56: 
1.69      albertel   57:     my $public=($username eq 'public' && $domain eq 'public');
                     58: 
1.85      albertel   59:     if ($public or $lowerurl eq 'noredirect') { return $cookie; }
1.78      albertel   60: 
1.7       www        61: # -------------------------------------------------------------------- Log this
                     62: 
                     63:     &Apache::lonnet::log($domain,$username,$authhost,
                     64:                          "Login $ENV{'REMOTE_ADDR'}");
1.4       www        65: 
1.14      www        66: # ------------------------------------------------- Check for critical messages
                     67: 
1.21      www        68:     my @what=&Apache::lonnet::dump('critical',$domain,$username);
1.14      www        69:     if ($what[0]) {
1.22      www        70: 	if (($what[0] ne 'con_lost') && ($what[0]!~/^error\:/)) {
1.21      www        71: 	    $lowerurl='/adm/email?critical=display';
1.14      www        72:         }
                     73:     }
                     74: 
1.5       www        75: # ------------------------------------------------------------ Get cookie ready
1.1       albertel   76:     $cookie="lonID=$cookie; path=/";
1.12      www        77: # -------------------------------------------------------- Menu script and info
1.100     raeburn    78:     my $destination = $lowerurl;
                     79: 
                     80:     if (defined($form->{role})) {
                     81:         my $envkey = 'user.role.'.$form->{role};
                     82:         my $now=time;
                     83:         my $then=$env{'user.login.time'};
                     84:         my $refresh=$env{'user.refresh.time'};
1.111     raeburn    85:         my $update=$env{'user.update.time'};
                     86:         if (!$update) {
                     87:             $update = $then;
                     88:         }
1.100     raeburn    89:         if (exists($env{$envkey})) {
                     90:             my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus);
1.111     raeburn    91:             &Apache::lonnet::role_status($envkey,$update,$refresh,$now,\$role,\$where,
1.100     raeburn    92:                                          \$trolecode,\$tstatus,\$tstart,\$tend);
                     93:             if ($tstatus eq 'is') {
1.101     raeburn    94:                 $destination  .= ($destination =~ /\?/) ? '&' : '?';
                     95:                 my $newrole = &HTML::Entities::encode($form->{role},'"<>&');
                     96:                 $destination .= 'selectrole=1&'.$newrole.'=1';
1.100     raeburn    97:             }
                     98:         }
                     99:     }
1.101     raeburn   100:     if (defined($form->{symb})) {
                    101:         my $destsymb = $form->{symb};
                    102:         $destination  .= ($destination =~ /\?/) ? '&' : '?';
                    103:         if ($destsymb =~ /___/) {
                    104:             # FIXME Need to deal with encrypted symbs and urls as needed.
                    105:             my ($map,$resid,$desturl)=split(/___/,$destsymb);
1.121.2.3  raeburn   106:             unless ($desturl=~/^(adm|editupload|public)/) {
1.101     raeburn   107:                 $desturl = &Apache::lonnet::clutter($desturl);
                    108:             }
                    109:             $desturl = &HTML::Entities::encode($desturl,'"<>&');
                    110:             $destsymb = &HTML::Entities::encode($destsymb,'"<>&');
                    111:             $destination .= '&destinationurl='.$desturl.
                    112:                             '&destsymb='.$destsymb;
                    113:         } else {
                    114:             $destsymb = &HTML::Entities::encode($destsymb,'"<>&');
                    115:             $destination .= '&destinationurl='.$destsymb;
                    116:         }
                    117:     }
1.111     raeburn   118:     if ($destination =~ m{^/adm/roles}) {
                    119:         $destination  .= ($destination =~ /\?/) ? '&' : '?';
                    120:         $destination .= 'source=login';
                    121:     }
1.100     raeburn   122: 
1.121.2.1  raeburn   123:     my $windowinfo=&Apache::lonmenu::open($env{'browser.os'});
                    124:     my $startupremote=&Apache::lonmenu::startupremote($destination);
                    125:     my $remoteinfo=&Apache::lonmenu::load_remote_msg($lowerurl);
                    126:     my $setflags=&Apache::lonmenu::setflags();
                    127:     my $maincall=&Apache::lonmenu::maincall();
1.99      bisitz    128:     my $brcrum = [{'href' => '',
                    129:                    'text' => 'Successful Login'},];
1.74      albertel  130:     my $start_page=&Apache::loncommon::start_page('Successful Login',
1.121.2.1  raeburn   131:                                                   $startupremote,
                    132:                                                   {'no_inline_link' => 1,
                    133:                                                    'bread_crumbs' => $brcrum,});
1.74      albertel  134:     my $end_page  =&Apache::loncommon::end_page();
                    135: 
1.121.2.1  raeburn   136:     my $continuelink;
                    137:     if ($env{'environment.remote'} eq 'off') {
                    138: 	$continuelink='<a href="'.$destination.'">'.&mt('Continue').'</a>';
                    139:     }
1.5       www       140: # ------------------------------------------------- Output for successful login
                    141: 
1.74      albertel  142:     &Apache::loncommon::content_type($r,'text/html');
                    143:     $r->header_out('Set-cookie' => $cookie);
                    144:     $r->send_http_header;
1.1       albertel  145: 
1.58      www       146:     my %lt=&Apache::lonlocal::texthash(
                    147: 				       'wel' => 'Welcome',
1.92      bisitz    148: 				       'pro' => 'Login problems?',
1.58      www       149: 				       );
1.121.2.2  raeburn   150:     my $loginhelp = &loginhelpdisplay($domain);
                    151:     if ($loginhelp) {
                    152:         $loginhelp = '<p><a href="'.$loginhelp.'">'.$lt{'pro'}.'</a></p>';
                    153:     }
                    154: 
1.112     raeburn   155:     my $welcome = &mt('Welcome to the Learning[_1]Online[_2] Network with CAPA. Please wait while your session is being set up.','<i>','</i>'); 
1.1       albertel  156:     $r->print(<<ENDSUCCESS);
1.74      albertel  157: $start_page
1.121.2.1  raeburn   158: $setflags
1.19      www       159: $windowinfo
1.58      www       160: <h1>$lt{'wel'}</h1>
1.121.2.2  raeburn   161: $welcome
                    162: $loginhelp
1.121.2.1  raeburn   163: $remoteinfo
                    164: $maincall
1.64      albertel  165: $continuelink
1.74      albertel  166: $end_page
1.1       albertel  167: ENDSUCCESS
                    168: }
                    169: 
                    170: # --------------------------------------------------------------- Failed login!
                    171: 
                    172: sub failed {
1.85      albertel  173:     my ($r,$message,$form) = @_;
1.104     droeschl  174:     my $start_page = &Apache::loncommon::start_page('Unsuccessful Login',undef);
1.100     raeburn   175:     my $retry = '/adm/login?username='.$form->{'uname'}.
                    176:                 '&domain='.$form->{'udom'};
                    177:     if (exists($form->{role})) {
                    178:         $retry .= '&role='.$form->{role};
                    179:     }
                    180:     if (exists($form->{symb})) {
                    181:         $retry .= '&symb='.$form->{symb};
                    182:     }
1.74      albertel  183:     my $end_page   = &Apache::loncommon::end_page();
                    184:     &Apache::loncommon::content_type($r,'text/html');
                    185:     $r->send_http_header;
1.121.2.2  raeburn   186:     my $loginhelp = &loginhelpdisplay($form->{'udom'});
                    187:     if ($loginhelp) {
                    188:         $loginhelp = '<p><a href="'.$loginhelp.'">'.&mt('Login problems?').'</a></p>';
                    189:     }
                    190: 
1.92      bisitz    191:     $r->print(
                    192:        $start_page
                    193:       .'<h1>'.&mt('Sorry ...').'</h1>'
1.95      bisitz    194:       .'<p class="LC_warning">'.&mt($message).'</p>'
1.100     raeburn   195:       .'<p>'.&mt('Please [_1]log in again[_2].','<a href="'.$retry.'">','</a>')
1.92      bisitz    196:       .'</p>'
1.121.2.2  raeburn   197:       .$loginhelp
1.92      bisitz    198:       .$end_page
                    199:     );
                    200:  }
1.60      www       201: 
1.55      www       202: # ------------------------------------------------------------------ Rerouting!
                    203: 
                    204: sub reroute {
1.74      albertel  205:     my ($r) = @_;
                    206:     &Apache::loncommon::content_type($r,'text/html');
                    207:     $r->send_http_header;
1.121.2.5! raeburn   208:     my $msg='<b>'.&mt('Sorry ...').'</b><br />'
1.92      bisitz    209:            .&mt('Please [_1]log in again[_2].');
1.121.2.5! raeburn   210:     &Apache::loncommon::simple_error_page($r,'Rerouting',$msg,{'no_auto_mt_msg' => 1});
1.55      www       211: }
                    212: 
1.1       albertel  213: # ---------------------------------------------------------------- Main handler
                    214: 
                    215: sub handler {
                    216:     my $r = shift;
1.120     raeburn   217:     my $londocroot = $r->dir_config('lonDocRoot');
1.85      albertel  218:     my $form;
1.55      www       219: # Are we re-routing?
1.120     raeburn   220:     if (-e "$londocroot/lon-status/reroute.txt") {
1.55      www       221: 	&reroute($r);
                    222: 	return OK;
                    223:     }
1.56      www       224: 
1.57      www       225:     &Apache::lonlocal::get_language_handle($r);
1.1       albertel  226: 
1.59      www       227: # -------------------------------- Prevent users from attempting to login twice
1.89      albertel  228:     my $handle = &Apache::lonnet::check_for_valid_session($r);
                    229:     if ($handle ne '') {
1.103     raeburn   230:         my $lonidsdir=$r->dir_config('lonIDsDir');
                    231:         if ($handle=~/^publicuser\_/) {
                    232: # For "public user" - remove it, we apparently really want to login
                    233:             unlink($r->dir_config('lonIDsDir')."/$handle.id");
                    234:         } else {
1.59      www       235: # Indeed, a valid token is found
1.103     raeburn   236:             &Apache::lonnet::transfer_profile_to_env($lonidsdir,$handle);
                    237: 	    &Apache::loncommon::content_type($r,'text/html');
                    238: 	    $r->send_http_header;
                    239: 	    my $start_page = 
                    240: 	        &Apache::loncommon::start_page('Already logged in');
                    241: 	    my $end_page = 
                    242: 	        &Apache::loncommon::end_page();
1.105     raeburn   243:             my $dest = '/adm/roles';
                    244:             if ($env{'form.firsturl'} ne '') {
                    245:                 $dest = $env{'form.firsturl'};
                    246:             }
1.103     raeburn   247:             $r->print(
                    248:                $start_page
1.121.2.4  raeburn   249:               .'<p class="LC_warning">'.&mt('You are already logged in!').'</p>'
1.103     raeburn   250:               .'<p>'.&mt('Please either [_1]continue the current session[_2] or [_3]log out[_4].'
1.105     raeburn   251:                     ,'<a href="'.$dest.'">','</a>','<a href="/adm/logout">','</a>')
1.103     raeburn   252:               .'</p>'
                    253:               .$end_page
                    254:             );
                    255:             return OK;
                    256:         }
1.59      www       257:     }
                    258: 
                    259: # ---------------------------------------------------- No valid token, continue
                    260: 
                    261: 
1.1       albertel  262:     my $buffer;
1.84      albertel  263:     if ($r->header_in('Content-length') > 0) {
                    264: 	$r->read($buffer,$r->header_in('Content-length'),0);
                    265:     }
1.85      albertel  266:     my %form;
                    267:     foreach my $pair (split(/&/,$buffer)) {
                    268:        my ($name,$value) = split(/=/,$pair);
1.7       www       269:        $value =~ tr/+/ /;
                    270:        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
1.85      albertel  271:        $form{$name}=$value;
1.1       albertel  272:     } 
                    273: 
1.85      albertel  274:     if ((!$form{'uname'}) || (!$form{'upass0'}) || (!$form{'udom'})) {
                    275: 	&failed($r,'Username, password and domain need to be specified.',
                    276: 		\%form);
1.1       albertel  277:         return OK;
                    278:     }
1.61      www       279: 
                    280: # split user logging in and "su"-user
                    281: 
1.85      albertel  282:     ($form{'uname'},$form{'suname'})=split(/\:/,$form{'uname'});
1.87      albertel  283:     $form{'uname'} = &LONCAPA::clean_username($form{'uname'});
                    284:     $form{'suname'}= &LONCAPA::clean_username($form{'suname'});
                    285:     $form{'udom'}  = &LONCAPA::clean_domain(  $form{'udom'});
1.1       albertel  286: 
                    287:     my $role   = $r->dir_config('lonRole');
                    288:     my $domain = $r->dir_config('lonDefDomain');
                    289:     my $prodir = $r->dir_config('lonUsersDir');
1.93      raeburn   290:     my $contact_name = &mt('LON-CAPA helpdesk');
1.1       albertel  291: 
1.8       www       292: # ---------------------------------------- Get the information from login token
                    293: 
1.85      albertel  294:     my $tmpinfo=Apache::lonnet::reply('tmpget:'.$form{'logtoken'},
                    295:                                       $form{'serverid'});
1.8       www       296: 
1.114     raeburn   297:     if (($tmpinfo=~/^error/) || ($tmpinfo eq 'con_lost') || 
                    298:         ($tmpinfo eq 'no_such_host')) {
1.85      albertel  299: 	&failed($r,'Information needed to verify your login information is missing, inaccessible or expired.',\%form);
1.8       www       300:         return OK;
1.44      www       301:     } else {
1.85      albertel  302: 	my $reply = &Apache::lonnet::reply('tmpdel:'.$form{'logtoken'},
                    303: 					   $form{'serverid'});
1.77      albertel  304:         if ( $reply ne 'ok' ) {
1.85      albertel  305:             &failed($r,'Session could not be opened.',\%form);
                    306: 	    &Apache::lonnet::logthis("ERROR got a reply of $reply when trying to contact ". $form{'serverid'}." to get login token");
1.77      albertel  307: 	    return OK;
1.44      www       308: 	}
1.8       www       309:     }
1.100     raeburn   310: 
1.93      raeburn   311:     if (!&Apache::lonnet::domain($form{'udom'})) {
                    312:         &failed($r,'The domain you provided is not a valid LON-CAPA domain.',\%form);
                    313:         return OK;
                    314:     }
1.100     raeburn   315: 
                    316:     my ($key,$firsturl,$rolestr,$symbstr)=split(/&/,$tmpinfo);
                    317:     if ($rolestr) {
                    318:         $rolestr = &unescape($rolestr);
                    319:     }
                    320:     if ($symbstr) {
                    321:         $symbstr= &unescape($symbstr);
                    322:     }
                    323:     if ($rolestr =~ /^role=/) {
                    324:         (undef,$form{'role'}) = split('=',$rolestr);
                    325:     }
                    326:     if ($symbstr =~ /^symb=/) { 
                    327:         (undef,$form{'symb'}) = split('=',$symbstr);
                    328:     }
1.8       www       329: 
                    330:     my $keybin=pack("H16",$key);
                    331: 
1.26      harris41  332:     my $cipher;
                    333:     if ($Crypt::DES::VERSION>=2.03) {
                    334: 	$cipher=new Crypt::DES $keybin;
                    335:     }
                    336:     else {
                    337: 	$cipher=new DES $keybin;
                    338:     }
1.67      www       339:     my $upass='';
                    340:     for (my $i=0;$i<=2;$i++) {
                    341: 	my $chunk=
1.85      albertel  342: 	    $cipher->decrypt(unpack("a8",pack("H16",substr($form{'upass'.$i},0,16))));
1.8       www       343: 
1.67      www       344: 	$chunk.=
1.85      albertel  345: 	    $cipher->decrypt(unpack("a8",pack("H16",substr($form{'upass'.$i},16,16))));
1.8       www       346: 
1.67      www       347: 	$chunk=substr($chunk,1,ord(substr($chunk,0,1)));
                    348: 	$upass.=$chunk;
                    349:     }
1.8       www       350: 
1.1       albertel  351: # ---------------------------------------------------------------- Authenticate
1.119     raeburn   352: 
1.90      raeburn   353:     my %domconfig = &Apache::lonnet::get_dom('configuration',['usercreation'],$form{'udom'});
1.119     raeburn   354:     my ($cancreate,$statustocreate) =
                    355:         &Apache::createaccount::get_creation_controls($form{'udom'},$domconfig{'usercreation'});
                    356:     my $defaultauth;
                    357:     if (ref($cancreate) eq 'ARRAY') {
                    358:         if (grep(/^login$/,@{$cancreate})) {
                    359:             $defaultauth = 1;
1.90      raeburn   360:         }
                    361:     }
1.105     raeburn   362:     my $clientcancheckhost = 1;
1.90      raeburn   363:     my $authhost=Apache::lonnet::authenticate($form{'uname'},$upass,
1.105     raeburn   364:                                               $form{'udom'},$defaultauth,
                    365:                                               $clientcancheckhost);
1.1       albertel  366:     
                    367: # --------------------------------------------------------------------- Failed?
                    368: 
                    369:     if ($authhost eq 'no_host') {
1.85      albertel  370: 	&failed($r,'Username and/or password could not be authenticated.',
                    371: 		\%form);
1.1       albertel  372:         return OK;
1.90      raeburn   373:     } elsif ($authhost eq 'no_account_on_host') {
1.119     raeburn   374:         if ($defaultauth) {
1.105     raeburn   375:             my $domdesc = &Apache::lonnet::domain($form{'udom'},'description');
1.110     raeburn   376:             unless (&check_can_host($r,\%form,'no_account_on_host',$domdesc)) {
                    377:                 return OK;
                    378:             }
1.90      raeburn   379:             my $start_page = 
1.121.2.1  raeburn   380:                 &Apache::loncommon::start_page('Create a user account in LON-CAPA',
                    381:                                                '',{'no_inline_link'   => 1,});
1.93      raeburn   382:             my $lonhost = $r->dir_config('lonHostID');
                    383:             my $origmail = $Apache::lonnet::perlvar{'lonSupportEMail'};
                    384:             my $contacts = 
                    385:                 &Apache::loncommon::build_recipient_list(undef,'helpdeskmail',
                    386:                                                         $form{'udom'},$origmail);
                    387:             my ($contact_email) = split(',',$contacts); 
1.119     raeburn   388:             my $output = 
                    389:                 &Apache::createaccount::username_check($form{'uname'},$form{'udom'},
                    390:                                                        $domdesc,'',$lonhost,
                    391:                                                        $contact_email,$contact_name,
                    392:                                                        undef,$statustocreate);
1.90      raeburn   393:             &Apache::loncommon::content_type($r,'text/html');
                    394:             $r->send_http_header;
                    395:             &Apache::createaccount::print_header($r,$start_page);
1.94      raeburn   396:             $r->print('<h3>'.&mt('Account creation').'</h3>'.
                    397:                       &mt('Although your username and password were authenticated, you do not currently have a LON-CAPA account at this institution.').'<br />'.
                    398:                       $output.&Apache::loncommon::end_page());
1.90      raeburn   399:             return OK;
                    400:         } else {
                    401:             &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);
                    402:             return OK;
                    403:         }
1.1       albertel  404:     }
                    405: 
1.59      www       406:     if (($firsturl eq '') || 
                    407: 	($firsturl=~/^\/adm\/(logout|remote)/)) {
1.24      www       408: 	$firsturl='/adm/roles';
1.7       www       409:     }
1.61      www       410: # --------------------------------- Are we attempting to login as somebody else?
1.85      albertel  411:     if ($form{'suname'}) {
1.61      www       412: # ------------ see if the original user has enough privileges to pull this stunt
1.85      albertel  413: 	if (&Apache::lonnet::privileged($form{'uname'},$form{'udom'})) {
1.61      www       414: # ---------------------------------------------------- see if the su-user exists
1.85      albertel  415: 	    unless (&Apache::lonnet::homeserver($form{'suname'},$form{'udom'})
1.61      www       416: 		eq 'no_host') {
1.85      albertel  417: 		&Apache::lonnet::logthis(&Apache::lonnet::homeserver($form{'suname'},$form{'udom'}));
1.61      www       418: # ------------------------------ see if the su-user is not too highly privileged
1.85      albertel  419: 		unless (&Apache::lonnet::privileged($form{'suname'},$form{'udom'})) {
1.61      www       420: # -------------------------------------------------------- actually switch users
1.85      albertel  421: 		    &Apache::lonnet::logperm('User '.$form{'uname'}.' at '.$form{'udom'}.
                    422: 			' logging in as '.$form{'suname'});
                    423: 		    $form{'uname'}=$form{'suname'};
1.61      www       424: 		} else {
                    425: 		    &Apache::lonnet::logthis('Attempted switch user to privileged user');
                    426: 		}
                    427: 	    }
                    428: 	} else {
                    429: 	    &Apache::lonnet::logthis('Non-privileged user attempting switch user');
                    430: 	}
                    431:     }
1.85      albertel  432: 
1.117     raeburn   433:     my ($is_balancer,$otherserver) = 
                    434:         &Apache::lonnet::check_loadbalancing($form{'uname'},$form{'udom'});
                    435: 
                    436:     if ($is_balancer) {
1.115     raeburn   437:         if (!$otherserver) { 
1.116     raeburn   438:             ($otherserver) = &Apache::lonnet::choose_server($form{'udom'});
1.115     raeburn   439:         }
                    440:         if ($otherserver) {
                    441:             &success($r,$form{'uname'},$form{'udom'},$authhost,'noredirect',undef,
                    442:                      \%form);
                    443: 	    $r->internal_redirect('/adm/switchserver?otherserver='.$otherserver.'&origurl='.$firsturl);
                    444:         } else {
                    445:             $r->print(&noswitch());
                    446:         }
1.110     raeburn   447:         return OK;
1.81      albertel  448:     } else {
1.115     raeburn   449:         if (!&check_can_host($r,\%form,$authhost)) {
1.118     raeburn   450:             my ($otherserver) = &Apache::lonnet::choose_server($form{'udom'});
1.115     raeburn   451:             if ($otherserver) {
                    452:                 &success($r,$form{'uname'},$form{'udom'},$authhost,'noredirect',undef,
                    453:                          \%form);
                    454:                 $r->internal_redirect('/adm/switchserver?otherserver='.$otherserver.'&origurl='.$firsturl);
                    455:             } else {
                    456:                 $r->print(&noswitch());
                    457:             }
                    458:             return OK;
                    459:         }
                    460: 
1.109     raeburn   461: # ------------------------------------------------------- Do the load balancing
                    462: 
                    463: # ---------------------------------------------------------- Determine own load
                    464:         my $loadlim = $r->dir_config('lonLoadLim');
                    465:         my $loadavg;
                    466:         {
                    467:             my $loadfile=Apache::File->new('/proc/loadavg');
                    468:             $loadavg=<$loadfile>;
                    469:         }
                    470:         $loadavg =~ s/\s.*//g;
                    471:         my $loadpercent=sprintf("%.1f",100*$loadavg/$loadlim);
                    472:         my $userloadpercent=&Apache::lonnet::userload();
                    473: 
                    474: # ---------------------------------------------------------- Are we overloaded?
                    475:         if ((($userloadpercent>100.0)||($loadpercent>100.0))) {
                    476:             my $unloaded=Apache::lonnet::spareserver($loadpercent,$userloadpercent,1,$form{'udom'});
1.115     raeburn   477:             if (!$unloaded) {
1.118     raeburn   478:                 ($unloaded) = &Apache::lonnet::choose_server($form{'udom'});
1.115     raeburn   479:             }
1.109     raeburn   480:             if ($unloaded) {
                    481:                 &success($r,$form{'uname'},$form{'udom'},$authhost,'noredirect',
                    482:                          undef,\%form);
                    483:                 $r->internal_redirect('/adm/switchserver?otherserver='.$unloaded.'&origurl='.$firsturl);
1.110     raeburn   484:                 return OK;
1.109     raeburn   485:             }
                    486:         }
                    487:         &success($r,$form{'uname'},$form{'udom'},$authhost,$firsturl,undef,
                    488:                  \%form);
1.110     raeburn   489:         return OK;
1.81      albertel  490:     }
1.1       albertel  491: }
                    492: 
1.105     raeburn   493: sub check_can_host {
                    494:     my ($r,$form,$authhost,$domdesc) = @_;
                    495:     return unless (ref($form) eq 'HASH');
                    496:     my $canhost = 1;
1.106     raeburn   497:     my $lonhost = $r->dir_config('lonHostID');
1.105     raeburn   498:     my $udom = $form->{'udom'};
1.108     raeburn   499:     my @intdoms;
                    500:     my $internet_names = &Apache::lonnet::get_internet_names($lonhost);
                    501:     if (ref($internet_names) eq 'ARRAY') {
                    502:         @intdoms = @{$internet_names};
                    503:     }
1.106     raeburn   504:     my $uprimary_id = &Apache::lonnet::domain($udom,'primary');
                    505:     my $uint_dom = &Apache::lonnet::internet_dom($uprimary_id);
                    506:     unless ($uint_dom ne '' && grep(/^\Q$uint_dom\E$/,@intdoms)) {
                    507:         my $machine_dom = &Apache::lonnet::host_domain($lonhost);
                    508:         my $hostname = &Apache::lonnet::hostname($lonhost);
                    509:         my $serverhomeID = &Apache::lonnet::get_server_homeID($hostname);
                    510:         my $serverhomedom = &Apache::lonnet::host_domain($serverhomeID);
                    511:         my %defdomdefaults = &Apache::lonnet::get_domain_defaults($serverhomedom);
1.105     raeburn   512:         my %udomdefaults = &Apache::lonnet::get_domain_defaults($udom);
                    513:         my $loncaparev;
                    514:         if ($authhost eq 'no_account_on_host') {
1.106     raeburn   515:             $loncaparev = &Apache::lonnet::get_server_loncaparev($machine_dom);
1.105     raeburn   516:         } else {
1.106     raeburn   517:             $loncaparev = &Apache::lonnet::get_server_loncaparev($machine_dom,$lonhost);
1.105     raeburn   518:         }
1.106     raeburn   519:         $canhost = &Apache::lonnet::can_host_session($udom,$lonhost,$loncaparev,
                    520:                                                      $udomdefaults{'remotesessions'},
                    521:                                                      $defdomdefaults{'hostedsessions'});
1.105     raeburn   522:     }
                    523:     unless ($canhost) {
                    524:         if ($authhost eq 'no_account_on_host') {
1.115     raeburn   525:             my $checkloginvia = 1;
                    526:             my ($login_host,$hostname) = 
                    527:                 &Apache::lonnet::choose_server($udom,$checkloginvia);
1.105     raeburn   528:             &Apache::loncommon::content_type($r,'text/html');
                    529:             $r->send_http_header;
                    530:             if ($login_host ne '') {
                    531:                 my $protocol = $Apache::lonnet::protocol{$login_host};
                    532:                 $protocol = 'http' if ($protocol ne 'https');
                    533:                 my $newurl = $protocol.'://'.$hostname.'/adm/createaccount';
                    534:                 $r->print(&Apache::loncommon::start_page('Create a user account in LON-CAPA').
                    535:                           '<h3>'.&mt('Account creation').'</h3>'.
                    536:                           &mt('You do not currently have a LON-CAPA account at this institution.').'<br />'.
                    537:                           '<p>'.&mt('You will be able to create one by logging into a LON-CAPA server within the [_1] domain.',$domdesc).'</p>'.
                    538:                           '<p>'.&mt('[_1]Log in[_2]','<a href="'.$newurl.'">','</a>').
                    539:                           &Apache::loncommon::end_page());
                    540:             } else {
                    541:                 $r->print(&Apache::loncommon::start_page('Access to LON-CAPA unavailable').
                    542:                           '<h3>'.&mt('Account creation unavailable').'</h3>'.
                    543:                           &mt('You do not currently have a LON-CAPA account at this institution.').'<br />'.
                    544:                           '<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>'.
                    545:                           &Apache::loncommon::end_page());
                    546:             }
                    547:         } else {
                    548:             &success($r,$form->{'uname'},$udom,$authhost,'noredirect',undef,
                    549:                      $form);
1.107     raeburn   550:             my ($otherserver) = &Apache::lonnet::choose_server($udom);
1.105     raeburn   551:             $r->internal_redirect('/adm/switchserver?otherserver='.$otherserver);
                    552:         }
                    553:     }
1.110     raeburn   554:     return $canhost;
1.105     raeburn   555: }
                    556: 
1.115     raeburn   557: sub noswitch {
                    558:     my $result = &Apache::loncommon::start_page('Access to LON-CAPA unavailable').
                    559:                  '<h3>'.&mt('Session unavailable').'</h3>'.
                    560:                  &mt('This LON-CAPA server is unable to host your session.').'<br />'.
                    561:                  '<p>'.&mt('Currently no other LON-CAPA server is available to host your session either.').'</p>'.
                    562:                  &Apache::loncommon::end_page();
                    563:     return $result;
                    564: }
                    565: 
1.121.2.2  raeburn   566: sub loginhelpdisplay {
                    567:     my ($authdomain) = @_;
                    568:     my $login_help = 1;
                    569:     my $lang = &Apache::lonlocal::current_language();
                    570:     if ($login_help) {
                    571:         my $dom = $authdomain;
                    572:         if ($dom eq '') {
                    573:             $dom = &Apache::lonnet::default_login_domain();
                    574:         }
                    575:         my %domconfhash = &Apache::loncommon::get_domainconf($dom);
                    576:         my $loginhelp_url;
                    577:         if ($lang) {
                    578:             $loginhelp_url = $domconfhash{$dom.'.login.helpurl_'.$lang};
                    579:             if ($loginhelp_url ne '') {
                    580:                 return $loginhelp_url;
                    581:             }
                    582:         }
                    583:         $loginhelp_url = $domconfhash{$dom.'.login.helpurl_nolang'};
                    584:         if ($loginhelp_url ne '') {
                    585:             return $loginhelp_url;
                    586:         } else {
                    587:             return '/adm/loginproblems.html';
                    588:         }
                    589:     }
                    590:     return;
                    591: }
                    592: 
1.1       albertel  593: 1;
                    594: __END__
1.7       www       595: 
                    596: 

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.