Diff for /loncom/auth/lonauth.pm between versions 1.101.4.2 and 1.101.8.9.2.2

version 1.101.4.2, 2010/05/23 21:20:11 version 1.101.8.9.2.2, 2012/02/09 22:01:34
Line 40  use Apache::lonmenu(); Line 40  use Apache::lonmenu();
 use Apache::createaccount;  use Apache::createaccount;
 use Fcntl qw(:flock);  use Fcntl qw(:flock);
 use Apache::lonlocal;  use Apache::lonlocal;
   use Apache::File();
 use HTML::Entities;  use HTML::Entities;
     
 # ------------------------------------------------------------ Successful login  # ------------------------------------------------------------ Successful login
Line 81  sub success { Line 82  sub success {
         my $now=time;          my $now=time;
         my $then=$env{'user.login.time'};          my $then=$env{'user.login.time'};
         my $refresh=$env{'user.refresh.time'};          my $refresh=$env{'user.refresh.time'};
           my $update=$env{'user.update.time'};
           if (!$update) {
               $update = $then;
           }
         if (exists($env{$envkey})) {          if (exists($env{$envkey})) {
             my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus);              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);                                           \$trolecode,\$tstatus,\$tstart,\$tend);
             if ($tstatus eq 'is') {              if ($tstatus eq 'is') {
                 $destination  .= ($destination =~ /\?/) ? '&' : '?';                  $destination  .= ($destination =~ /\?/) ? '&' : '?';
Line 110  sub success { Line 115  sub success {
             $destination .= '&destinationurl='.$destsymb;              $destination .= '&destinationurl='.$destsymb;
         }          }
     }      }
       if ($destination =~ m{^/adm/roles}) {
           $destination  .= ($destination =~ /\?/) ? '&' : '?';
           $destination .= 'source=login';
       }
   
     my $windowinfo=&Apache::lonmenu::open($env{'browser.os'});      my $windowinfo=&Apache::lonmenu::open($env{'browser.os'});
     my $startupremote=&Apache::lonmenu::startupremote($destination);      my $startupremote=&Apache::lonmenu::startupremote($destination);
     my $remoteinfo=&Apache::lonmenu::load_remote_msg($lowerurl);      my $remoteinfo=&Apache::lonmenu::load_remote_msg($lowerurl);
     my $setflags=&Apache::lonmenu::setflags();      my $setflags=&Apache::lonmenu::setflags();
     my $maincall=&Apache::lonmenu::maincall();      my $maincall=&Apache::lonmenu::maincall();
       my $brcrum = [{'href' => '',
                      'text' => 'Successful Login'},];
     my $start_page=&Apache::loncommon::start_page('Successful Login',      my $start_page=&Apache::loncommon::start_page('Successful Login',
                                                   $startupremote,                                                    $startupremote,
                                                   {'no_inline_link' => 1,});                                                    {'no_inline_link' => 1,
                                                      'bread_crumbs' => $brcrum,});
     my $end_page  =&Apache::loncommon::end_page();      my $end_page  =&Apache::loncommon::end_page();
   
     my $continuelink;      my $continuelink;
     if (($env{'browser.interface'} eq 'textual') ||      if ($env{'environment.remote'} eq 'off') {
         ($env{'environment.remote'} eq 'off')) {  
  $continuelink='<a href="'.$destination.'">'.&mt('Continue').'</a>';   $continuelink='<a href="'.$destination.'">'.&mt('Continue').'</a>';
     }      }
 # ------------------------------------------------- Output for successful login  # ------------------------------------------------- Output for successful login
Line 134  sub success { Line 145  sub success {
   
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
        'wel' => 'Welcome',         'wel' => 'Welcome',
        'mes' => 'Welcome to the Learning<i>Online</i> Network with CAPA. Please wait while your session is being set up.',  
        'pro' => 'Login problems?',         'pro' => 'Login problems?',
        'log' => 'loginproblems.html',         '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.','<i>','</i>');
     $r->print(<<ENDSUCCESS);      $r->print(<<ENDSUCCESS);
 $start_page  $start_page
 $setflags  $setflags
 $windowinfo  $windowinfo
 <h1>$lt{'wel'}</h1>  <h1>$lt{'wel'}</h1>
 $lt{'mes'}<p>  $welcome<p>
 <a href="/adm/$lt{'log'}">$lt{'pro'}</a></p>  <a href="/adm/$lt{'log'}">$lt{'pro'}</a></p>
 $remoteinfo  $remoteinfo
 $maincall  $maincall
Line 214  sub handler { Line 225  sub handler {
         } else {          } else {
 # Indeed, a valid token is found  # Indeed, a valid token is found
             &Apache::lonnet::transfer_profile_to_env($lonidsdir,$handle);              &Apache::lonnet::transfer_profile_to_env($lonidsdir,$handle);
     &Apache::loncommon::content_type($r,'text/html');              &Apache::loncommon::content_type($r,'text/html');
     $r->send_http_header;              $r->send_http_header;
     my $start_page =               my $start_page =
         &Apache::loncommon::start_page('Already logged in');                  &Apache::loncommon::start_page('Already logged in');
     my $end_page =               my $end_page =
         &Apache::loncommon::end_page();                  &Apache::loncommon::end_page();
             my $dest = '/adm/roles';              my $dest = '/adm/roles';
             if ($env{'form.firsturl'} ne '') {              if ($env{'form.firsturl'} ne '') {
                 $dest = $env{'form.firsturl'};                  $dest = $env{'form.firsturl'};
             }              }
             $r->print(              $r->print(
                 $start_page                 $start_page
                .'<h1>'.&mt('You are already logged in!').'</h1>'                .'<h1>'.&mt('You are already logged in!').'</h1>'
                .'<p>'.&mt('Please either [_1]continue the current session[_2] or [_3]log out[_4].'                .'<p>'.&mt('Please either [_1]continue the current session[_2] or [_3]log out[_4].'
                         ,'<a href="'.$dest.'">','</a>','<a href="/adm/logout">','</a>')                      ,'<a href="'.$dest.'">','</a>','<a href="/adm/logout">','</a>')
               .'</p>'                .'</p>'
               .$end_page                .$end_page
             );              );
Line 274  sub handler { Line 285  sub handler {
     my $tmpinfo=Apache::lonnet::reply('tmpget:'.$form{'logtoken'},      my $tmpinfo=Apache::lonnet::reply('tmpget:'.$form{'logtoken'},
                                       $form{'serverid'});                                        $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);   &failed($r,'Information needed to verify your login information is missing, inaccessible or expired.',\%form);
         return OK;          return OK;
     } else {      } else {
Line 328  sub handler { Line 340  sub handler {
     }      }
   
 # ---------------------------------------------------------------- Authenticate  # ---------------------------------------------------------------- Authenticate
     my @cancreate;  
     my %domconfig = &Apache::lonnet::get_dom('configuration',['usercreation'],$form{'udom'});      my %domconfig = &Apache::lonnet::get_dom('configuration',['usercreation'],$form{'udom'});
     if (ref($domconfig{'usercreation'}) eq 'HASH') {      my $domdesc = &Apache::lonnet::domain($form{'udom'},'description');
         if (ref($domconfig{'usercreation'}{'cancreate'}) eq 'HASH') {      my ($cancreate,$statustocreate) =
             if (ref($domconfig{'usercreation'}{'cancreate'}{'selfcreate'}) eq 'ARRAY') {          &Apache::createaccount::get_creation_controls($form{'udom'},$domconfig{'usercreation'});
                 @cancreate = @{$domconfig{'usercreation'}{'cancreate'}{'selfcreate'}};  
             } elsif (($domconfig{'usercreation'}{'cancreate'}{'selfcreate'} ne 'none') &&   
                      ($domconfig{'usercreation'}{'cancreate'}{'selfcreate'} ne '')) {  
                 @cancreate = ($domconfig{'usercreation'}{'cancreate'}{'selfcreate'});  
             }  
         }  
     }  
     my $defaultauth;      my $defaultauth;
     if (grep(/^login$/,@cancreate)) {      if (ref($cancreate) eq 'ARRAY') {
         $defaultauth = 1;          if (grep(/^login$/,@{$cancreate})) {
               $defaultauth = 1;
           }
     }      }
     my $authhost=Apache::lonnet::authenticate($form{'uname'},$upass,      my $clientcancheckhost = 1;
                                               $form{'udom'},$defaultauth);      my $uname = $form{'uname'};
       my $authhost=Apache::lonnet::authenticate($uname,$upass,
                                                 $form{'udom'},$defaultauth,
                                                 $clientcancheckhost);
           
 # --------------------------------------------------------------------- Failed?  # --------------------------------------------------------------------- Failed?
   
     if ($authhost eq 'no_host') {      if ($authhost eq 'no_host') {
  &failed($r,'Username and/or password could not be authenticated.',          my $lc_uname = lc($uname);
  \%form);          if ($uname eq $lc_uname) {
         return OK;              &failed($r,'Username and/or password could not be authenticated.',
     } elsif ($authhost eq 'no_account_on_host') {                      \%form);
         my %domconfig =   
             &Apache::lonnet::get_dom('configuration',['usercreation'],$form{'udom'});  
         if (grep(/^login$/,@cancreate)) {  
             my $start_page =   
                 &Apache::loncommon::start_page('Create a user account in LON-CAPA',  
                                                '',{'no_inline_link'   => 1,});  
             my $domdesc = &Apache::lonnet::domain($form{'udom'},'description');  
             my $lonhost = $r->dir_config('lonHostID');  
             my $origmail = $Apache::lonnet::perlvar{'lonSupportEMail'};  
             my $contacts =   
                 &Apache::loncommon::build_recipient_list(undef,'helpdeskmail',  
                                                         $form{'udom'},$origmail);  
             my ($contact_email) = split(',',$contacts);   
             my $output = &Apache::createaccount::username_check($form{'uname'},   
                                                                 $form{'udom'},$domdesc,'',  
                                                                 $lonhost,$contact_email,$contact_name);  
             &Apache::loncommon::content_type($r,'text/html');  
             $r->send_http_header;  
             &Apache::createaccount::print_header($r,$start_page);  
             $r->print('<h3>'.&mt('Account creation').'</h3>'.  
                       &mt('Although your username and password were authenticated, you do not currently have a LON-CAPA account at this institution.').'<br />'.  
                       $output.&Apache::loncommon::end_page());  
             return OK;              return OK;
         } else {          } else {
             &failed($r,'Although your username and password were authenticated, you do not currently have a LON-CAPA account in this domain, and you are not permitted to create one.',\%form);              $authhost=Apache::lonnet::authenticate($lc_uname,$upass,
             return OK;                                                     $form{'udom'},$defaultauth);
               if ($authhost eq 'no_host') {
                   &failed($r,'Username (in lower case) and/or password could not be authenticated.',
                           \%form);
                   return OK;
               } elsif ($authhost eq 'no_account_on_host') {
                   &create_account($r,\%form,$cancreate,$lc_uname,$contact_name,$domdesc);
                   return OK;
               } else {
                   $form{'uname'} = $lc_uname;
               }
         }          }
       } elsif ($authhost eq 'no_account_on_host') {
           &create_account($r,\%form,$cancreate,$uname,$contact_name,$domdesc);
           return OK;
     }      }
   
     if (($firsturl eq '') ||       if (($firsturl eq '') || 
Line 411  sub handler { Line 412  sub handler {
     }      }
   
     if ($r->dir_config("lonBalancer") eq 'yes') {      if ($r->dir_config("lonBalancer") eq 'yes') {
  &success($r,$form{'uname'},$form{'udom'},$authhost,'noredirect',undef,          my $otherserver = &Apache::lonnet::spareserver(30000,undef,1,$form{'udom'});
  \%form);          if (!$otherserver) {
  $r->internal_redirect('/adm/switchserver');              ($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,$domdesc)) {
               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
           my $loadlim = $r->dir_config('lonLoadLim');
           my $loadavg;
           {
               my $loadfile=Apache::File->new('/proc/loadavg');
               $loadavg=<$loadfile>;
           }
           $loadavg =~ s/\s.*//g;
           my $loadpercent=sprintf("%.1f",100*$loadavg/$loadlim);
           my $userloadpercent=&Apache::lonnet::userload();
   
   # ---------------------------------------------------------- Are we overloaded?
           if ((($userloadpercent>100.0)||($loadpercent>100.0))) {
               my $unloaded=Apache::lonnet::spareserver($loadpercent,$userloadpercent,1,$form{'udom'});
               if (!$unloaded) {
                   ($unloaded) = &Apache::lonnet::choose_server($form{'udom'});
               }
               if ($unloaded) {
                   &success($r,$form{'uname'},$form{'udom'},$authhost,'noredirect',
                            undef,\%form);
                   $r->internal_redirect('/adm/switchserver?otherserver='.$unloaded.'&origurl='.$firsturl);
                   return OK;
               }
           }
           &success($r,$form{'uname'},$form{'udom'},$authhost,$firsturl,undef,
                    \%form);
           return OK;
       }
   }
   
   sub check_can_host {
       my ($r,$form,$authhost,$domdesc) = @_;
       return unless (ref($form) eq 'HASH');
       my $canhost = 1;
       my $lonhost = $r->dir_config('lonHostID');
       my $udom = $form->{'udom'};
       my @intdoms;
       my $internet_names = &Apache::lonnet::get_internet_names($lonhost);
       if (ref($internet_names) eq 'ARRAY') {
           @intdoms = @{$internet_names};
       }
       my $uprimary_id = &Apache::lonnet::domain($udom,'primary');
       my $uint_dom = &Apache::lonnet::internet_dom($uprimary_id);
       unless ($uint_dom ne '' && grep(/^\Q$uint_dom\E$/,@intdoms)) {
           my $machine_dom = &Apache::lonnet::host_domain($lonhost);
           my $hostname = &Apache::lonnet::hostname($lonhost);
           my $serverhomeID = &Apache::lonnet::get_server_homeID($hostname);
           my $serverhomedom = &Apache::lonnet::host_domain($serverhomeID);
           my %defdomdefaults = &Apache::lonnet::get_domain_defaults($serverhomedom);
           my %udomdefaults = &Apache::lonnet::get_domain_defaults($udom);
           my $loncaparev;
           if ($authhost eq 'no_account_on_host') {
               $loncaparev = &Apache::lonnet::get_server_loncaparev($machine_dom);
           } else {
               $loncaparev = &Apache::lonnet::get_server_loncaparev($machine_dom,$lonhost);
           }
           $canhost = &Apache::lonnet::can_host_session($udom,$lonhost,$loncaparev,
                                                        $udomdefaults{'remotesessions'},
                                                        $defdomdefaults{'hostedsessions'});
       }
       unless ($canhost) {
           if ($authhost eq 'no_account_on_host') {
               my $checkloginvia = 1;
               my ($login_host,$hostname) =
                   &Apache::lonnet::choose_server($udom,$checkloginvia);
               &Apache::loncommon::content_type($r,'text/html');
               $r->send_http_header;
               if ($login_host ne '') {
                   my $protocol = $Apache::lonnet::protocol{$login_host};
                   $protocol = 'http' if ($protocol ne 'https');
                   my $newurl = $protocol.'://'.$hostname.'/adm/createaccount';
                   $r->print(&Apache::loncommon::start_page('Create a user account in LON-CAPA').
                             '<h3>'.&mt('Account creation').'</h3>'.
                             &mt('You do not currently have a LON-CAPA account at this institution.').'<br />'.
                             '<p>'.&mt('You will be able to create one by logging into a LON-CAPA server within the [_1] domain.',$domdesc).'</p>'.
                             '<p>'.&mt('[_1]Log in[_2]','<a href="'.$newurl.'">','</a>').
                             &Apache::loncommon::end_page());
               } else {
                   $r->print(&Apache::loncommon::start_page('Access to LON-CAPA unavailable').
                             '<h3>'.&mt('Account creation unavailable').'</h3>'.
                             &mt('You do not currently have a LON-CAPA account at this institution.').'<br />'.
                             '<p>'.&mt('Currently a LON-CAPA server is not available within the [_1] domain for you to log-in to, to create an account.',$domdesc).'</p>'.
                             &Apache::loncommon::end_page());
               }
           } else {
               &success($r,$form->{'uname'},$udom,$authhost,'noredirect',undef,
                        $form);
               my ($otherserver) = &Apache::lonnet::choose_server($udom);
               $r->internal_redirect('/adm/switchserver?otherserver='.$otherserver);
           }
       }
       return $canhost;
   }
   
   sub noswitch {
       my $result = &Apache::loncommon::start_page('Access to LON-CAPA unavailable').
                    '<h3>'.&mt('Session unavailable').'</h3>'.
                    &mt('This LON-CAPA server is unable to host your session.').'<br />'.
                    '<p>'.&mt('Currently no other LON-CAPA server is available to host your session either.').'</p>'.
                    &Apache::loncommon::end_page();
       return $result;
   }
   
   sub create_account {
       my ($r,$form,$cancreate,$uname,$contact_name,$domdesc) = @_;
       return unless((ref($form) eq 'HASH') && (ref($cancreate) eq 'ARRAY'));
       my %domconfig =
           &Apache::lonnet::get_dom('configuration',['usercreation'],$form->{'udom'});
       if (&check_can_host($r,$form,'no_account_on_host',$domdesc)) {
           my $start_page =
               &Apache::loncommon::start_page('Create a user account in LON-CAPA',
                                              '',{'no_inline_link'   => 1,});
           my $lonhost = $r->dir_config('lonHostID');
           my $origmail = $Apache::lonnet::perlvar{'lonSupportEMail'};
           my $contacts =
               &Apache::loncommon::build_recipient_list(undef,'helpdeskmail',
                                                       $form->{'udom'},$origmail);
           my ($contact_email) = split(',',$contacts);
           my $output =
               &Apache::createaccount::username_check($uname,$form->{'udom'},
                                                      $domdesc,'',$lonhost,
                                                      $contact_email,$contact_name);
           &Apache::loncommon::content_type($r,'text/html');
           $r->send_http_header;
           &Apache::createaccount::print_header($r,$start_page);
           $r->print('<h3>'.&mt('Account creation').'</h3>'.
                     &mt('Although your username and password were authenticated, you do not currently have a LON-CAPA account at this institution.').'<br />'.
                     $output.&Apache::loncommon::end_page());
     } else {      } else {
  &success($r,$form{'uname'},$form{'udom'},$authhost,$firsturl,undef,          &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);
  \%form);  
     }      }
     return OK;      return;
 }  }
   
 1;  1;

Removed from v.1.101.4.2  
changed lines
  Added in v.1.101.8.9.2.2


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>