[LON-CAPA-cvs] cvs: loncom(version_2_10_X) /auth lonauth.pm

raeburn raeburn@source.lon-capa.org
Thu, 12 Aug 2010 21:31:10 -0000


raeburn		Thu Aug 12 21:31:10 2010 EDT

  Modified files:              (Branch: version_2_10_X)
    /loncom/auth	lonauth.pm 
  Log:
  - Backport 1.105, 1.106, 1.107.
  
  
Index: loncom/auth/lonauth.pm
diff -u loncom/auth/lonauth.pm:1.101.8.1 loncom/auth/lonauth.pm:1.101.8.2
--- loncom/auth/lonauth.pm:1.101.8.1	Thu May 27 22:05:47 2010
+++ loncom/auth/lonauth.pm	Thu Aug 12 21:31:10 2010
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # User Authentication Module
 #
-# $Id: lonauth.pm,v 1.101.8.1 2010/05/27 22:05:47 raeburn Exp $
+# $Id: lonauth.pm,v 1.101.8.2 2010/08/12 21:31:10 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -346,8 +346,10 @@
     if (grep(/^login$/,@cancreate)) {
         $defaultauth = 1;
     }
+    my $clientcancheckhost = 1;
     my $authhost=Apache::lonnet::authenticate($form{'uname'},$upass,
-                                              $form{'udom'},$defaultauth);
+                                              $form{'udom'},$defaultauth,
+                                              $clientcancheckhost);
     
 # --------------------------------------------------------------------- Failed?
 
@@ -359,10 +361,11 @@
         my %domconfig = 
             &Apache::lonnet::get_dom('configuration',['usercreation'],$form{'udom'});
         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 = 
                 &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 = 
@@ -412,10 +415,13 @@
 	}
     }
 
+    &check_can_host($r,\%form,$authhost);
+
     if ($r->dir_config("lonBalancer") eq 'yes') {
 	&success($r,$form{'uname'},$form{'udom'},$authhost,'noredirect',undef,
 		 \%form);
-	$r->internal_redirect('/adm/switchserver');
+        my ($otherserver) = &Apache::lonnet::choose_server($form{'udom'});
+	$r->internal_redirect('/adm/switchserver?otherserver='.$otherserver);
     } else {
 	&success($r,$form{'uname'},$form{'udom'},$authhost,$firsturl,undef,
 		 \%form);
@@ -423,6 +429,64 @@
     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;
 __END__