Diff for /loncom/auth/lonauth.pm between versions 1.98 and 1.113

version 1.98, 2009/05/27 16:54:52 version 1.113, 2011/06/10 01:21:36
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;
     
 # ------------------------------------------------------------ Successful login  # ------------------------------------------------------------ Successful login
 sub success {  sub success {
Line 73  sub success { Line 75  sub success {
 # ------------------------------------------------------------ Get cookie ready  # ------------------------------------------------------------ Get cookie ready
     $cookie="lonID=$cookie; path=/";      $cookie="lonID=$cookie; path=/";
 # -------------------------------------------------------- Menu script and info  # -------------------------------------------------------- Menu script and info
     my $windowinfo=&Apache::lonmenu::open($env{'browser.os'});      my $destination = $lowerurl;
     my $startupremote=&Apache::lonmenu::startupremote($lowerurl);  
     my $remoteinfo=&Apache::lonmenu::load_remote_msg($lowerurl);      if (defined($form->{role})) {
     my $setflags=&Apache::lonmenu::setflags();          my $envkey = 'user.role.'.$form->{role};
     my $maincall=&Apache::lonmenu::maincall();          my $now=time;
           my $then=$env{'user.login.time'};
           my $refresh=$env{'user.refresh.time'};
           my $update=$env{'user.update.time'};
           if (!$update) {
               $update = $then;
           }
           if (exists($env{$envkey})) {
               my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus);
               &Apache::lonnet::role_status($envkey,$update,$refresh,$now,\$role,\$where,
                                            \$trolecode,\$tstatus,\$tstart,\$tend);
               if ($tstatus eq 'is') {
                   $destination  .= ($destination =~ /\?/) ? '&' : '?';
                   my $newrole = &HTML::Entities::encode($form->{role},'"<>&');
                   $destination .= 'selectrole=1&'.$newrole.'=1';
               }
           }
       }
       if (defined($form->{symb})) {
           my $destsymb = $form->{symb};
           $destination  .= ($destination =~ /\?/) ? '&' : '?';
           if ($destsymb =~ /___/) {
               # FIXME Need to deal with encrypted symbs and urls as needed.
               my ($map,$resid,$desturl)=split(/___/,$destsymb);
               unless ($desturl=~/^(adm|uploaded|editupload|public)/) {
                   $desturl = &Apache::lonnet::clutter($desturl);
               }
               $desturl = &HTML::Entities::encode($desturl,'"<>&');
               $destsymb = &HTML::Entities::encode($destsymb,'"<>&');
               $destination .= '&destinationurl='.$desturl.
                               '&destsymb='.$destsymb;
           } else {
               $destsymb = &HTML::Entities::encode($destsymb,'"<>&');
               $destination .= '&destinationurl='.$destsymb;
           }
       }
       if ($destination =~ m{^/adm/roles}) {
           $destination  .= ($destination =~ /\?/) ? '&' : '?';
           $destination .= 'source=login';
       }
   
       my $windowinfo = Apache::lonhtmlcommon::scripttag('self.name="loncapaclient";');
       my $header = '<meta HTTP-EQUIV="Refresh" CONTENT="0; url='.$destination.'" />';
       my $brcrum = [{'href' => '',
                      'text' => 'Successful Login'},];
     my $start_page=&Apache::loncommon::start_page('Successful Login',      my $start_page=&Apache::loncommon::start_page('Successful Login',
   $startupremote,                                                    $header,
   {'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='<a href="'.$destination.'">'.&mt('Continue').'</a>';
     if ($env{'environment.remote'} eq 'off') {  
  $continuelink="<a href=\"$lowerurl\">".&mt('Continue')."</a>";  
     }  
 # ------------------------------------------------- Output for successful login  # ------------------------------------------------- Output for successful login
   
     &Apache::loncommon::content_type($r,'text/html');      &Apache::loncommon::content_type($r,'text/html');
Line 95  sub success { Line 138  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  
 $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  
 $maincall  
 $continuelink  $continuelink
 $end_page  $end_page
 ENDSUCCESS  ENDSUCCESS
Line 117  ENDSUCCESS Line 157  ENDSUCCESS
   
 sub failed {  sub failed {
     my ($r,$message,$form) = @_;      my ($r,$message,$form) = @_;
     my $start_page = &Apache::loncommon::start_page('Unsuccessful Login',undef,      my $start_page = &Apache::loncommon::start_page('Unsuccessful Login',undef);
     {'no_inline_link' => 1,});      my $retry = '/adm/login?username='.$form->{'uname'}.
                   '&domain='.$form->{'udom'};
       if (exists($form->{role})) {
           $retry .= '&role='.$form->{role};
       }
       if (exists($form->{symb})) {
           $retry .= '&symb='.$form->{symb};
       }
     my $end_page   = &Apache::loncommon::end_page();      my $end_page   = &Apache::loncommon::end_page();
     &Apache::loncommon::content_type($r,'text/html');      &Apache::loncommon::content_type($r,'text/html');
     $r->send_http_header;      $r->send_http_header;
Line 126  sub failed { Line 173  sub failed {
        $start_page         $start_page
       .'<h1>'.&mt('Sorry ...').'</h1>'        .'<h1>'.&mt('Sorry ...').'</h1>'
       .'<p class="LC_warning">'.&mt($message).'</p>'        .'<p class="LC_warning">'.&mt($message).'</p>'
       .'<p>'.&mt('Please [_1]log in again[_2].'        .'<p>'.&mt('Please [_1]log in again[_2].','<a href="'.$retry.'">','</a>')
                 ,"<a href=\"/adm/login?username=$form->{'uname'}&domain=$form->{'udom'}\">",'</a>')  
       .'</p>'        .'</p>'
       .'<p><a href="/adm/loginproblems.html">'.&mt('Login problems?').'</a></p>'        .'<p><a href="/adm/loginproblems.html">'.&mt('Login problems?').'</a></p>'
       .$end_page        .$end_page
Line 161  sub handler { Line 207  sub handler {
 # -------------------------------- Prevent users from attempting to login twice  # -------------------------------- Prevent users from attempting to login twice
     my $handle = &Apache::lonnet::check_for_valid_session($r);      my $handle = &Apache::lonnet::check_for_valid_session($r);
     if ($handle ne '') {      if ($handle ne '') {
           my $lonidsdir=$r->dir_config('lonIDsDir');
           if ($handle=~/^publicuser\_/) {
   # For "public user" - remove it, we apparently really want to login
               unlink($r->dir_config('lonIDsDir')."/$handle.id");
           } else {
 # Indeed, a valid token is found  # Indeed, a valid token is found
  &Apache::loncommon::content_type($r,'text/html');              &Apache::lonnet::transfer_profile_to_env($lonidsdir,$handle);
  $r->send_http_header;      &Apache::loncommon::content_type($r,'text/html');
  my $start_page =       $r->send_http_header;
     &Apache::loncommon::start_page('Already logged in');      my $start_page = 
  my $end_page =           &Apache::loncommon::start_page('Already logged in');
     &Apache::loncommon::end_page();      my $end_page = 
         $r->print(          &Apache::loncommon::end_page();
            $start_page              my $dest = '/adm/roles';
           .'<h1>'.&mt('You are already logged in!').'</h1>'              if ($env{'form.firsturl'} ne '') {
           .'<p>'.&mt('Please either [_1]continue the current session[_2] or [_3]log out[_4].'                  $dest = $env{'form.firsturl'};
                     ,'<a href="/adm/roles">','</a>','<a href="/adm/logout">','</a>')              }
           .'</p>'              $r->print(
           .'<p><a href="/adm/loginproblems.html">'.&mt('Login problems?').'</a></p>'                 $start_page
           .$end_page                .'<h1>'.&mt('You are already logged in!').'</h1>'
         );                .'<p>'.&mt('Please either [_1]continue the current session[_2] or [_3]log out[_4].'
         return OK;                      ,'<a href="'.$dest.'">','</a>','<a href="/adm/logout">','</a>')
                 .'</p>'
                 .$end_page
               );
               return OK;
           }
     }      }
   
 # ---------------------------------------------------- No valid token, continue  # ---------------------------------------------------- No valid token, continue
Line 230  sub handler { Line 286  sub handler {
     return OK;      return OK;
  }   }
     }      }
   
     if (!&Apache::lonnet::domain($form{'udom'})) {      if (!&Apache::lonnet::domain($form{'udom'})) {
         &failed($r,'The domain you provided is not a valid LON-CAPA domain.',\%form);          &failed($r,'The domain you provided is not a valid LON-CAPA domain.',\%form);
         return OK;          return OK;
     }      }
     my ($key,$firsturl)=split(/&/,$tmpinfo);  
       my ($key,$firsturl,$rolestr,$symbstr)=split(/&/,$tmpinfo);
       if ($rolestr) {
           $rolestr = &unescape($rolestr);
       }
       if ($symbstr) {
           $symbstr= &unescape($symbstr);
       }
       if ($rolestr =~ /^role=/) {
           (undef,$form{'role'}) = split('=',$rolestr);
       }
       if ($symbstr =~ /^symb=/) { 
           (undef,$form{'symb'}) = split('=',$symbstr);
       }
   
     my $keybin=pack("H16",$key);      my $keybin=pack("H16",$key);
   
Line 274  sub handler { Line 344  sub handler {
     if (grep(/^login$/,@cancreate)) {      if (grep(/^login$/,@cancreate)) {
         $defaultauth = 1;          $defaultauth = 1;
     }      }
       my $clientcancheckhost = 1;
     my $authhost=Apache::lonnet::authenticate($form{'uname'},$upass,      my $authhost=Apache::lonnet::authenticate($form{'uname'},$upass,
                                               $form{'udom'},$defaultauth);                                                $form{'udom'},$defaultauth,
                                                 $clientcancheckhost);
           
 # --------------------------------------------------------------------- Failed?  # --------------------------------------------------------------------- Failed?
   
Line 287  sub handler { Line 359  sub handler {
         my %domconfig =           my %domconfig = 
             &Apache::lonnet::get_dom('configuration',['usercreation'],$form{'udom'});              &Apache::lonnet::get_dom('configuration',['usercreation'],$form{'udom'});
         if (grep(/^login$/,@cancreate)) {          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 $domdesc = &Apache::lonnet::domain($form{'udom'},'description');
               unless (&check_can_host($r,\%form,'no_account_on_host',$domdesc)) {
                   return OK;
               }
               my $start_page = 
                   &Apache::loncommon::start_page('Create a user account in LON-CAPA');
             my $lonhost = $r->dir_config('lonHostID');              my $lonhost = $r->dir_config('lonHostID');
             my $origmail = $Apache::lonnet::perlvar{'lonSupportEMail'};              my $origmail = $Apache::lonnet::perlvar{'lonSupportEMail'};
             my $contacts =               my $contacts = 
Line 340  sub handler { Line 414  sub handler {
  }   }
     }      }
   
       unless (&check_can_host($r,\%form,$authhost)) {
           return OK;
       }
   
     if ($r->dir_config("lonBalancer") eq 'yes') {      if ($r->dir_config("lonBalancer") eq 'yes') {
  &success($r,$form{'uname'},$form{'udom'},$authhost,'noredirect',undef,   &success($r,$form{'uname'},$form{'udom'},$authhost,'noredirect',undef,
  \%form);   \%form);
  $r->internal_redirect('/adm/switchserver');          my $otherserver = &Apache::lonnet::spareserver(30000,undef,1,$form{'udom'});
    $r->internal_redirect('/adm/switchserver?otherserver='.$otherserver.'&origurl='.$firsturl);
           return OK;
     } else {      } else {
  &success($r,$form{'uname'},$form{'udom'},$authhost,$firsturl,undef,  # ------------------------------------------------------- Do the load balancing
  \%form);  
   # ---------------------------------------------------------- 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) {
                   &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 ($login_host,$hostname) = &Apache::lonnet::choose_server($udom);
               &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 OK;      return $canhost;
 }  }
   
 1;  1;

Removed from v.1.98  
changed lines
  Added in v.1.113


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