[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