Diff for /loncom/auth/lonauth.pm between versions 1.97 and 1.101.8.2

version 1.97, 2009/04/01 14:43:19 version 1.101.8.2, 2010/08/12 21:31:10
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 HTML::Entities;
     
 # ------------------------------------------------------------ Successful login  # ------------------------------------------------------------ Successful login
 sub success {  sub success {
Line 73  sub success { Line 74  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 $destination = $lowerurl;
   
       if (defined($form->{role})) {
           my $envkey = 'user.role.'.$form->{role};
           my $now=time;
           my $then=$env{'user.login.time'};
           my $refresh=$env{'user.refresh.time'};
           if (exists($env{$envkey})) {
               my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus);
               &Apache::lonnet::role_status($envkey,$then,$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;
           }
       }
   
     my $windowinfo=&Apache::lonmenu::open($env{'browser.os'});      my $windowinfo=&Apache::lonmenu::open($env{'browser.os'});
     my $startupremote=&Apache::lonmenu::startupremote($lowerurl);      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=\"$lowerurl\">".&mt('Continue')."</a>";  
     }      }
 # ------------------------------------------------- Output for successful login  # ------------------------------------------------- Output for successful login
   
Line 120  sub failed { Line 160  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,});      {'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 127  sub failed { Line 175  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 162  sub handler { Line 209  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 231  sub handler { Line 288  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 275  sub handler { Line 346  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 288  sub handler { Line 361  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 $domdesc = &Apache::lonnet::domain($form{'udom'},'description');
               &check_can_host($r,\%form,'no_account_on_host',$domdesc);
             my $start_page =               my $start_page = 
                 &Apache::loncommon::start_page('Create a user account in LON-CAPA',                  &Apache::loncommon::start_page('Create a user account in LON-CAPA',
                                                '',{'no_inline_link'   => 1,});                                                 '',{'no_inline_link'   => 1,});
             my $domdesc = &Apache::lonnet::domain($form{'udom'},'description');  
             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 341  sub handler { Line 415  sub handler {
  }   }
     }      }
   
       &check_can_host($r,\%form,$authhost);
   
     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::choose_server($form{'udom'});
    $r->internal_redirect('/adm/switchserver?otherserver='.$otherserver);
     } else {      } else {
  &success($r,$form{'uname'},$form{'udom'},$authhost,$firsturl,undef,   &success($r,$form{'uname'},$form{'udom'},$authhost,$firsturl,undef,
  \%form);   \%form);
Line 352  sub handler { Line 429  sub handler {
     return OK;      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 = &Apache::lonnet::get_internet_names($lonhost);
       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());
               }
               return OK;
           } else {
               &success($r,$form->{'uname'},$udom,$authhost,'noredirect',undef,
                        $form);
               my ($otherserver) = &Apache::lonnet::choose_server($udom);
               $r->internal_redirect('/adm/switchserver?otherserver='.$otherserver);
           }
       }
   }
   
 1;  1;
 __END__  __END__
   

Removed from v.1.97  
changed lines
  Added in v.1.101.8.2


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