--- loncom/auth/lonauth.pm 2010/08/25 16:34:32 1.109 +++ loncom/auth/lonauth.pm 2011/11/07 18:15:07 1.120 @@ -1,7 +1,7 @@ # The LearningOnline Network # User Authentication Module # -# $Id: lonauth.pm,v 1.109 2010/08/25 16:34:32 raeburn Exp $ +# $Id: lonauth.pm,v 1.120 2011/11/07 18:15:07 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -40,7 +40,7 @@ use Apache::lonmenu(); use Apache::createaccount; use Fcntl qw(:flock); use Apache::lonlocal; -use Apache::File (); +use Apache::File(); use HTML::Entities; # ------------------------------------------------------------ Successful login @@ -82,9 +82,13 @@ sub success { my $now=time; my $then=$env{'user.login.time'}; my $refresh=$env{'user.refresh.time'}; + my $update=$env{'user.update.time'}; + if (!$update) { + $update = $then; + } if (exists($env{$envkey})) { my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus); - &Apache::lonnet::role_status($envkey,$then,$refresh,$now,\$role,\$where, + &Apache::lonnet::role_status($envkey,$update,$refresh,$now,\$role,\$where, \$trolecode,\$tstatus,\$tstart,\$tend); if ($tstatus eq 'is') { $destination .= ($destination =~ /\?/) ? '&' : '?'; @@ -111,6 +115,10 @@ sub success { $destination .= '&destinationurl='.$destsymb; } } + if ($destination =~ m{^/adm/roles}) { + $destination .= ($destination =~ /\?/) ? '&' : '?'; + $destination .= 'source=login'; + } my $windowinfo = Apache::lonhtmlcommon::scripttag('self.name="loncapaclient";'); my $header = ''; @@ -130,15 +138,15 @@ sub success { my %lt=&Apache::lonlocal::texthash( 'wel' => 'Welcome', - 'mes' => 'Welcome to the LearningOnline Network with CAPA. Please wait while your session is being set up.', 'pro' => 'Login problems?', 'log' => 'loginproblems.html', ); + my $welcome = &mt('Welcome to the Learning[_1]Online[_2] Network with CAPA. Please wait while your session is being set up.','',''); $r->print(<$lt{'wel'} -$lt{'mes'}

+$welcome

$lt{'pro'}

$continuelink $end_page @@ -187,9 +195,10 @@ sub reroute { sub handler { my $r = shift; + my $londocroot = $r->dir_config('lonDocRoot'); my $form; # Are we re-routing? - if (-e '/home/httpd/html/lon-status/reroute.txt') { + if (-e "$londocroot/lon-status/reroute.txt") { &reroute($r); return OK; } @@ -266,7 +275,8 @@ sub handler { my $tmpinfo=Apache::lonnet::reply('tmpget:'.$form{'logtoken'}, $form{'serverid'}); - if (($tmpinfo=~/^error/) || ($tmpinfo eq 'con_lost')) { + if (($tmpinfo=~/^error/) || ($tmpinfo eq 'con_lost') || + ($tmpinfo eq 'no_such_host')) { &failed($r,'Information needed to verify your login information is missing, inaccessible or expired.',\%form); return OK; } else { @@ -320,21 +330,15 @@ sub handler { } # ---------------------------------------------------------------- Authenticate - my @cancreate; + my %domconfig = &Apache::lonnet::get_dom('configuration',['usercreation'],$form{'udom'}); - if (ref($domconfig{'usercreation'}) eq 'HASH') { - if (ref($domconfig{'usercreation'}{'cancreate'}) eq 'HASH') { - if (ref($domconfig{'usercreation'}{'cancreate'}{'selfcreate'}) eq 'ARRAY') { - @cancreate = @{$domconfig{'usercreation'}{'cancreate'}{'selfcreate'}}; - } elsif (($domconfig{'usercreation'}{'cancreate'}{'selfcreate'} ne 'none') && - ($domconfig{'usercreation'}{'cancreate'}{'selfcreate'} ne '')) { - @cancreate = ($domconfig{'usercreation'}{'cancreate'}{'selfcreate'}); - } - } - } + my ($cancreate,$statustocreate) = + &Apache::createaccount::get_creation_controls($form{'udom'},$domconfig{'usercreation'}); my $defaultauth; - if (grep(/^login$/,@cancreate)) { - $defaultauth = 1; + if (ref($cancreate) eq 'ARRAY') { + if (grep(/^login$/,@{$cancreate})) { + $defaultauth = 1; + } } my $clientcancheckhost = 1; my $authhost=Apache::lonnet::authenticate($form{'uname'},$upass, @@ -348,11 +352,11 @@ sub handler { \%form); return OK; } elsif ($authhost eq 'no_account_on_host') { - my %domconfig = - &Apache::lonnet::get_dom('configuration',['usercreation'],$form{'udom'}); - if (grep(/^login$/,@cancreate)) { + if ($defaultauth) { my $domdesc = &Apache::lonnet::domain($form{'udom'},'description'); - &check_can_host($r,\%form,'no_account_on_host',$domdesc); + unless (&check_can_host($r,\%form,'no_account_on_host',$domdesc)) { + return OK; + } my $start_page = &Apache::loncommon::start_page('Create a user account in LON-CAPA'); my $lonhost = $r->dir_config('lonHostID'); @@ -361,9 +365,11 @@ sub handler { &Apache::loncommon::build_recipient_list(undef,'helpdeskmail', $form{'udom'},$origmail); my ($contact_email) = split(',',$contacts); - my $output = &Apache::createaccount::username_check($form{'uname'}, - $form{'udom'},$domdesc,'', - $lonhost,$contact_email,$contact_name); + my $output = + &Apache::createaccount::username_check($form{'uname'},$form{'udom'}, + $domdesc,'',$lonhost, + $contact_email,$contact_name, + undef,$statustocreate); &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; &Apache::createaccount::print_header($r,$start_page); @@ -404,14 +410,34 @@ sub handler { } } - &check_can_host($r,\%form,$authhost); + my ($is_balancer,$otherserver) = + &Apache::lonnet::check_loadbalancing($form{'uname'},$form{'udom'}); - if ($r->dir_config("lonBalancer") eq 'yes') { - &success($r,$form{'uname'},$form{'udom'},$authhost,'noredirect',undef, - \%form); - my ($otherserver) = &Apache::lonnet::choose_server($form{'udom'}); - $r->internal_redirect('/adm/switchserver?otherserver='.$otherserver.'&origurl='.$firsturl); + if ($is_balancer) { + if (!$otherserver) { + ($otherserver) = &Apache::lonnet::choose_server($form{'udom'}); + } + if ($otherserver) { + &success($r,$form{'uname'},$form{'udom'},$authhost,'noredirect',undef, + \%form); + $r->internal_redirect('/adm/switchserver?otherserver='.$otherserver.'&origurl='.$firsturl); + } else { + $r->print(&noswitch()); + } + return OK; } else { + if (!&check_can_host($r,\%form,$authhost)) { + my ($otherserver) = &Apache::lonnet::choose_server($form{'udom'}); + if ($otherserver) { + &success($r,$form{'uname'},$form{'udom'},$authhost,'noredirect',undef, + \%form); + $r->internal_redirect('/adm/switchserver?otherserver='.$otherserver.'&origurl='.$firsturl); + } else { + $r->print(&noswitch()); + } + return OK; + } + # ------------------------------------------------------- Do the load balancing # ---------------------------------------------------------- Determine own load @@ -428,16 +454,20 @@ sub handler { # ---------------------------------------------------------- Are we overloaded? if ((($userloadpercent>100.0)||($loadpercent>100.0))) { my $unloaded=Apache::lonnet::spareserver($loadpercent,$userloadpercent,1,$form{'udom'}); + if (!$unloaded) { + ($unloaded) = &Apache::lonnet::choose_server($form{'udom'}); + } if ($unloaded) { &success($r,$form{'uname'},$form{'udom'},$authhost,'noredirect', undef,\%form); $r->internal_redirect('/adm/switchserver?otherserver='.$unloaded.'&origurl='.$firsturl); + return OK; } } &success($r,$form{'uname'},$form{'udom'},$authhost,$firsturl,undef, \%form); + return OK; } - return OK; } sub check_can_host { @@ -472,7 +502,9 @@ sub check_can_host { } unless ($canhost) { if ($authhost eq 'no_account_on_host') { - my ($login_host,$hostname) = &Apache::lonnet::choose_server($udom); + my $checkloginvia = 1; + my ($login_host,$hostname) = + &Apache::lonnet::choose_server($udom,$checkloginvia); &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; if ($login_host ne '') { @@ -492,7 +524,6 @@ sub check_can_host { '

'.&mt('Currently a LON-CAPA server is not available within the [_1] domain for you to log-in to, to create an account.',$domdesc).'

'. &Apache::loncommon::end_page()); } - return OK; } else { &success($r,$form->{'uname'},$udom,$authhost,'noredirect',undef, $form); @@ -500,6 +531,16 @@ sub check_can_host { $r->internal_redirect('/adm/switchserver?otherserver='.$otherserver); } } + return $canhost; +} + +sub noswitch { + my $result = &Apache::loncommon::start_page('Access to LON-CAPA unavailable'). + '

'.&mt('Session unavailable').'

'. + &mt('This LON-CAPA server is unable to host your session.').'
'. + '

'.&mt('Currently no other LON-CAPA server is available to host your session either.').'

'. + &Apache::loncommon::end_page(); + return $result; } 1;