[LON-CAPA-cvs] cvs: loncom(version_2_11_X) /auth lonlogin.pm
raeburn
raeburn at source.lon-capa.org
Thu Aug 1 10:21:38 EDT 2019
raeburn Thu Aug 1 14:21:38 2019 EDT
Modified files: (Branch: version_2_11_X)
/loncom/auth lonlogin.pm
Log:
- For 2.11
Backport 1.174, 1.175, 1.176, 1.178
Index: loncom/auth/lonlogin.pm
diff -u loncom/auth/lonlogin.pm:1.158.2.7 loncom/auth/lonlogin.pm:1.158.2.8
--- loncom/auth/lonlogin.pm:1.158.2.7 Tue Sep 4 01:10:29 2018
+++ loncom/auth/lonlogin.pm Thu Aug 1 14:21:37 2019
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Login Screen
#
-# $Id: lonlogin.pm,v 1.158.2.7 2018/09/04 01:10:29 raeburn Exp $
+# $Id: lonlogin.pm,v 1.158.2.8 2019/08/01 14:21:37 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -37,7 +37,7 @@
use Apache::lonlocal;
use Apache::migrateuser();
use lib '/home/httpd/lib/perl/';
-use LONCAPA;
+use LONCAPA qw(:DEFAULT :match);
use CGI::Cookie();
sub handler {
@@ -47,7 +47,7 @@
(join('&',$ENV{'QUERY_STRING'},$env{'request.querystring'},
$ENV{'REDIRECT_QUERY_STRING'}),
['interface','username','domain','firsturl','localpath','localres',
- 'token','role','symb','iptoken']);
+ 'token','role','symb','iptoken','btoken']);
if (!defined($env{'form.firsturl'})) {
&Apache::lonacc::get_posted_cgi($r,['firsturl']);
}
@@ -59,10 +59,10 @@
# For "public user" - remove any exising "public" cookie, as user really wants to log-in
my ($handle,$lonidsdir,$expirepub,$userdom);
+ $lonidsdir=$r->dir_config('lonIDsDir');
unless ($r->header_only) {
$handle = &Apache::lonnet::check_for_valid_session($r,'lonID',undef,\$userdom);
if ($handle ne '') {
- $lonidsdir=$r->dir_config('lonIDsDir');
if ($handle=~/^publicuser\_/) {
unlink($r->dir_config('lonIDsDir')."/$handle.id");
undef($handle);
@@ -97,6 +97,51 @@
return OK;
}
+ my $lonhost = $r->dir_config('lonHostID');
+ $env{'form.firsturl'} =~ s/(`)/'/g;
+
+# Check if browser sent a LON-CAPA load balancer cookie (and this is a balancer)
+
+ my ($found_server,$balancer_cookie) = &Apache::lonnet::check_for_balancer_cookie($r,1);
+ if ($found_server) {
+ my $hostname = &Apache::lonnet::hostname($found_server);
+ if ($hostname ne '') {
+ my $protocol = $Apache::lonnet::protocol{$found_server};
+ $protocol = 'http' if ($protocol ne 'https');
+ my $dest = '/adm/roles';
+ if ($env{'form.firsturl'} ne '') {
+ $dest = $env{'form.firsturl'};
+ }
+ my %info = (
+ balcookie => $lonhost.':'.$balancer_cookie,
+ );
+ my $balancer_token = &Apache::lonnet::tmpput(\%info,$found_server);
+ if ($balancer_token) {
+ $dest .= (($dest=~/\?/)?'&;':'?') . 'btoken='.$balancer_token;
+ }
+ my $url = $protocol.'://'.$hostname.$dest;
+ my $start_page =
+ &Apache::loncommon::start_page('Switching Server ...',undef,
+ {'redirect' => [0,$url],});
+ my $end_page = &Apache::loncommon::end_page();
+ $r->print($start_page.$end_page);
+ return OK;
+ }
+ }
+
+#
+# Check if a LON-CAPA load balancer sent user here because user's browser sent
+# it a balancer cookie for an active session on this server.
+#
+
+ my $balcookie;
+ if ($env{'form.btoken'}) {
+ my %info = &Apache::lonnet::tmpget($env{'form.btoken'});
+ $balcookie = $info{'balcookie'};
+ &Apache::lonnet::tmpdel($env{'form.btoken'});
+ delete($env{'form.btoken'});
+ }
+
#
# If browser sent an old cookie for which the session file had been removed
# check if configuration for user's domain has a portal URL set. If so
@@ -163,12 +208,11 @@
my $iconpath=
&Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL'));
- my $lonhost = $r->dir_config('lonHostID');
my $domain = &Apache::lonnet::default_login_domain();
my $defdom = $domain;
if ($lonhost ne '') {
unless ($sessiondata{'sessionserver'}) {
- my $redirect = &check_loginvia($domain,$lonhost);
+ my $redirect = &check_loginvia($domain,$lonhost,$lonidsdir,$balcookie);
if ($redirect) {
$r->print($redirect);
return OK;
@@ -177,7 +221,7 @@
}
if (($sessiondata{'domain'}) &&
- (&Apache::lonnet::domain($env{'form.domain'},'description'))) {
+ (&Apache::lonnet::domain($sessiondata{'domain'},'description'))) {
$domain=$sessiondata{'domain'};
} elsif (($env{'form.domain'}) &&
(&Apache::lonnet::domain($env{'form.domain'},'description'))) {
@@ -671,8 +715,8 @@
}
sub check_loginvia {
- my ($domain,$lonhost) = @_;
- if ($domain eq '' || $lonhost eq '') {
+ my ($domain,$lonhost,$lonidsdir,$balcookie) = @_;
+ if ($domain eq '' || $lonhost eq '' || $lonidsdir eq '') {
return;
}
my %domconfhash = &Apache::loncommon::get_domainconf($domain);
@@ -701,6 +745,36 @@
}
if ($newhost ne $lonhost) {
if (&Apache::lonnet::hostname($newhost) ne '') {
+ if ($balcookie) {
+ my ($balancer,$cookie) = split(/:/,$balcookie);
+ if ($cookie =~ /^($match_domain)_($match_username)_([a-f0-9]+)$/) {
+ my ($udom,$uname,$cookieid) = ($1,$2,$3);
+ unless (&Apache::lonnet::delbalcookie($cookie,$balancer) eq 'ok') {
+ if ((-d $lonidsdir) && (opendir(my $dh,$lonidsdir))) {
+ while (my $filename=readdir($dh)) {
+ if ($filename=~/^(\Q$uname\E_\d+_\Q$udom\E_$match_lonid)\.id$/) {
+ my $handle = $1;
+ my %hash =
+ &Apache::lonnet::get_sessionfile_vars($handle,$lonidsdir,
+ ['request.balancercookie',
+ 'user.linkedenv']);
+ if ($hash{'request.balancercookie'} eq "$balancer:$cookieid") {
+ if (unlink("$lonidsdir/$filename")) {
+ if (($hash{'user.linkedenv'} =~ /^[a-f0-9]+_linked$/) &&
+ (-l "$lonidsdir/$hash{'user.linkedenv'}.id") &&
+ (readlink("$lonidsdir/$hash{'user.linkedenv'}.id") eq "$lonidsdir/$filename")) {
+ unlink("$lonidsdir/$hash{'user.linkedenv'}.id");
+ }
+ }
+ }
+ last;
+ }
+ }
+ closedir($dh);
+ }
+ }
+ }
+ }
$output = &redirect_page($newhost,$path);
}
}
@@ -711,12 +785,13 @@
sub redirect_page {
my ($desthost,$path) = @_;
+ my $hostname = &Apache::lonnet::hostname($desthost);
my $protocol = $Apache::lonnet::protocol{$desthost};
$protocol = 'http' if ($protocol ne 'https');
unless ($path =~ m{^/}) {
$path = '/'.$path;
}
- my $url = $protocol.'://'.&Apache::lonnet::hostname($desthost).$path;
+ my $url = $protocol.'://'.$hostname.$path;
if ($env{'form.firsturl'} ne '') {
$url .='?firsturl='.$env{'form.firsturl'};
}
More information about the LON-CAPA-cvs
mailing list