[LON-CAPA-cvs] cvs: loncom(version_2_11_X) /auth switchserver.pm

raeburn raeburn at source.lon-capa.org
Thu Aug 1 11:20:06 EDT 2019


raeburn		Thu Aug  1 15:20:06 2019 EDT

  Modified files:              (Branch: version_2_11_X)
    /loncom/auth	switchserver.pm 
  Log:
  - For 2.11
    Backport 1.42, 1.44, 1.45
  
  
Index: loncom/auth/switchserver.pm
diff -u loncom/auth/switchserver.pm:1.35 loncom/auth/switchserver.pm:1.35.2.1
--- loncom/auth/switchserver.pm:1.35	Fri Dec 16 15:31:11 2016
+++ loncom/auth/switchserver.pm	Thu Aug  1 15:20:06 2019
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Switch Servers Handler
 #
-# $Id: switchserver.pm,v 1.35 2016/12/16 15:31:11 raeburn Exp $
+# $Id: switchserver.pm,v 1.35.2.1 2019/08/01 15:20:06 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -31,7 +31,7 @@
 use strict;
 use Apache::Constants qw(:common);
 use Apache::lonnet;
-use Apache::lonmenu;
+use Digest::MD5 qw(md5_hex);
 use CGI::Cookie();
 use Apache::lonlocal;
 use LONCAPA qw(:DEFAULT :match);
@@ -49,16 +49,20 @@
     }
     my $lonidsdir=$r->dir_config('lonIDsDir');
     &Apache::lonnet::transfer_profile_to_env($lonidsdir,$handle);
-    
+
     return $r->dir_config('lonIDsDir')."/$handle.id";
 }
 
 sub do_redirect {
     my ($r,$url,$only_body,$extra_text) = @_;
     $r->send_http_header;
+    my $delay = 0.5;
+    if ($only_body) {
+        $delay = 0;
+    }
     my $start_page = 
 	&Apache::loncommon::start_page('Switching Server ...',undef,
-				       {'redirect'       => [0.5,$url],
+				       {'redirect'       => [$delay,$url],
 					'only_body'      => $only_body,});
     my $end_page   = &Apache::loncommon::end_page();
     $r->print($start_page.$extra_text.$end_page);
@@ -68,6 +72,24 @@
     return OK;
 }
 
+sub balancer_cookieid {
+    my ($r,$desthost,$uname,$udom) = @_;
+    my @hosts = &Apache::lonnet::current_machine_ids();
+    my $newcookieid;
+    unless (grep(/^\Q$desthost\E$/, at hosts)) {
+        my $balancedir=$r->dir_config('lonBalanceDir');
+        $newcookieid = &md5_hex(&md5_hex(time.{}.rand().$$));
+        my $cookie = $udom.'_'.$uname.'_'.$newcookieid;
+        my $balcookie = "balanceID=$cookie; path=/; HttpOnly;";
+        if (open(my $fh,'>',"$balancedir/$cookie.id")) {
+            print $fh $desthost;
+            close($fh);
+            $r->headers_out->add('Set-cookie' => $balcookie);
+        }
+    }
+    return $newcookieid;
+}
+
 sub flush_course_logs {
     &Apache::lonnet::flushcourselogs();
     return OK;
@@ -101,7 +123,7 @@
         if ($Apache::lonnet::protocol{$env{'form.otherserver'}} eq 'https') {
             $protocol = $Apache::lonnet::protocol{$env{'form.otherserver'}};
         }
-    } 
+    }
 
     if ($env{'user.name'} eq 'public'
 	&& $env{'user.domain'} eq 'public') {
@@ -110,11 +132,11 @@
     }
 
     my $skip_canhost_check = '';
+    my $now = time;
     if ($env{'form.role'}) {
         if (!exists($env{'user.role.'.$env{'form.role'}})) {
             delete($env{'form.role'});
         } else {
-            my $now = time;
             my ($start,$end) = split(/\./,$env{'user.role.'.$env{'form.role'}});
             if (($start && $start > $now) || ($end && $end < $now)) {
                 delete($env{'form.role'});
@@ -157,7 +179,7 @@
 
     #remove session env, and log event
     unlink($handle);
-    my %temp=('switchserver' => time.':'.$env{'form.otherserver'},
+    my %temp=('switchserver' => $now.':'.$env{'form.otherserver'},
 	      $env{'form.role'});
     &Apache::lonnet::put('email_status',\%temp);
     my $logmsg = "Switch Server to $env{'form.otherserver'}";
@@ -186,13 +208,33 @@
 	   
 # ---------------------------------------------------------------- Get handover
 
-    my ($is_balancer) = &Apache::lonnet::check_loadbalancing($env{'user.name'},$env{'user.domain'});
+    my $newcookieid;
+    my $only_body = 0;
+    my ($is_balancer,$posshost,$setcookie) =
+        &Apache::lonnet::check_loadbalancing($env{'user.name'},$env{'user.domain'});
+    if ($is_balancer && $setcookie && $env{'form.otherserver'}) {
+        # Set a balancer cookie unless browser already sent LON-CAPA load balancer
+        # cookie which points at the target server
+        my ($found_server,$balancer_cookie) = &Apache::lonnet::check_for_balancer_cookie($r,1);
+
+        if (($found_server eq $env{'form.otherserver'}) &&
+            ($balancer_cookie =~ /^\Q$env{'user.domain'}\E_\Q$env{'user.name'}\E_/)) {
+            $only_body = 1;
+        } else {
+            $newcookieid = &balancer_cookieid($r,$env{'form.otherserver'},
+                                              $env{'user.name'},$env{'user.domain'});
+        }
+    }
+
     my %info=('ip'       => $ENV{'REMOTE_ADDR'},
 	      'domain'   => $env{'user.domain'},
 	      'username' => $env{'user.name'},
 	      'role'     => $env{'form.role'},
 	      'server'   => $r->dir_config('lonHostID'),
 	      'balancer' => $is_balancer);
+    if ($newcookieid) {
+        $info{'balcookie'} = $newcookieid;
+    }
     if ($env{'form.origurl'}) {
         $info{'origurl'} = $env{'form.origurl'};
     }
@@ -211,7 +253,7 @@
 	'&username='.$env{'user.name'}.
 	'&token='.$token;
 # --------------------------------------------------------------- Screen Output
-    return &do_redirect($r, $url, 0);
+    return &do_redirect($r, $url, $only_body);
 }
 
 1;




More information about the LON-CAPA-cvs mailing list