--- loncom/auth/lonlogin.pm 2018/12/27 18:14:38 1.178
+++ loncom/auth/lonlogin.pm 2020/10/16 23:27:45 1.180
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Login Screen
#
-# $Id: lonlogin.pm,v 1.178 2018/12/27 18:14:38 raeburn Exp $
+# $Id: lonlogin.pm,v 1.180 2020/10/16 23:27:45 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -47,7 +47,7 @@ sub handler {
(join('&',$ENV{'QUERY_STRING'},$env{'request.querystring'},
$ENV{'REDIRECT_QUERY_STRING'}),
['interface','username','domain','firsturl','localpath','localres',
- 'token','role','symb','iptoken','btoken','ltoken']);
+ 'token','role','symb','iptoken','btoken','ltoken','linkkey']);
if (!defined($env{'form.firsturl'})) {
&Apache::lonacc::get_posted_cgi($r,['firsturl']);
}
@@ -56,6 +56,10 @@ sub handler {
$env{'form.firsturl'} = $ENV{'REDIRECT_URL'};
}
}
+ if (($env{'form.firsturl'} =~ m{^/+tiny/+$LONCAPA::match_domain/+\w+$}) &&
+ (!$env{'form.ltoken'}) && (!$env{'form.linkkey'})) {
+ &Apache::lonacc::get_posted_cgi($r,['linkkey']);
+ }
# -- check if they are a migrating user
if (defined($env{'form.token'})) {
@@ -131,6 +135,9 @@ sub handler {
}
&Apache::lonnet::tmpdel($env{'form.ltoken'});
delete($env{'form.ltoken'});
+ } elsif ($env{'form.linkkey'}) {
+ $info{'linkkey'} = $env{'form.linkkey'};
+ delete($env{'form.linkkey'});
}
my $balancer_token = &Apache::lonnet::tmpput(\%info,$found_server);
if ($balancer_token) {
@@ -151,13 +158,15 @@ sub handler {
# it a balancer cookie for an active session on this server.
#
- my ($balcookie,$linkprot);
+ my ($balcookie,$linkprot,$linkkey);
if ($env{'form.btoken'}) {
my %info = &Apache::lonnet::tmpget($env{'form.btoken'});
$balcookie = $info{'balcookie'};
if ($balcookie) {
if ($info{'linkprot'}) {
$linkprot = $info{'linkprot'};
+ } elsif ($info{'linkkey'}) {
+ $linkkey = $info{'linkkey'};
}
}
&Apache::lonnet::tmpdel($env{'form.btoken'});
@@ -213,7 +222,7 @@ sub handler {
}
if ($env{'user.linkproturi'}) {
my @proturis = split(/,/,$env{'user.linkproturi'});
- unless(grep(/^\Q$deeplink\E$/,@proturis)) {
+ unless (grep(/^\Q$deeplink\E$/,@proturis)) {
push(@proturis,$deeplink);
@proturis = sort @proturis;
&Apache::lonnet::appenv({'user.linkproturi' => join(',',@proturis)});
@@ -222,6 +231,31 @@ sub handler {
&Apache::lonnet::appenv({'user.linkproturi' => $deeplink});
}
}
+ } elsif (($env{'form.linkkey'}) || ($linkkey)) {
+ if ($env{'form.firsturl'} =~ m{^/tiny/$match_domain/\w+$}) {
+ if ($linkkey eq '') {
+ $linkkey = $env{'form.linkkey'};
+ }
+ if ($env{'user.deeplinkkey'}) {
+ my @linkkeys = split(/,/,$env{'user.deeplinkkey'});
+ unless (grep(/^\Q$linkkey\E$/,@linkkeys)) {
+ push(@linkkeys,$linkkey);
+ &Apache::lonnet::appenv({'user.deeplinkkey' => join(',',sort(@linkkeys))});
+ }
+ } else {
+ &Apache::lonnet::appenv({'user.deeplinkkey' => $linkkey});
+ }
+ my $deeplink = $env{'form.firsturl'};
+ if ($env{'user.keyedlinkuri'}) {
+ my @keyeduris = split(/,/,$env{'user.keyedlinkuri'});
+ unless (grep(/^\Q$deeplink\E$/,@keyeduris)) {
+ push(@keyeduris,$deeplink);
+ &Apache::lonnet::appenv({'user.keyedlinkuri' => join(',',sort(@keyeduris))});
+ }
+ } else {
+ &Apache::lonnet::appenv({'user.keyedlinkuri' => $deeplink});
+ }
+ }
}
$r->print(
$start_page
@@ -373,6 +407,11 @@ sub handler {
}
$tokenextras .= '&linkprot='.&escape($info{'linkprot'});
}
+ } elsif ($env{'form.linkkey'}) {
+ if (!$tokenextras) {
+ $tokenextras = '&&&';
+ }
+ $tokenextras .= '&linkkey='.&escape($env{'form.linkkey'});
}
my $logtoken=Apache::lonnet::reply(
'tmpput:'.$ukey.$lkey.'&'.$firsturl.$tokenextras,
@@ -386,22 +425,36 @@ sub handler {
&Apache::lonnet::logthis('No valid logtoken for log-in page -- unable to determine hostname for hostID: '.$lonhost.'. Check entry in hosts.tab');
}
my $spares='';
- my $last;
- foreach my $hostid (sort
- {
- &Apache::lonnet::hostname($a) cmp
- &Apache::lonnet::hostname($b);
- }
- keys(%Apache::lonnet::spareid)) {
+ my (@sparehosts,%spareservers);
+ my $sparesref = &Apache::lonnet::this_host_spares($defdom);
+ if (ref($sparesref) eq 'HASH') {
+ foreach my $key (keys(%{$sparesref})) {
+ if (ref($sparesref->{$key}) eq 'ARRAY') {
+ my @sorted = sort { &Apache::lonnet::hostname($a) cmp
+ &Apache::lonnet::hostname($b);
+ } @{$sparesref->{$key}};
+ if (@sorted) {
+ if ($key eq 'primary') {
+ unshift(@sparehosts,@sorted);
+ } elsif ($key eq 'default') {
+ push(@sparehosts,@sorted);
+ }
+ }
+ }
+ }
+ }
+ foreach my $hostid (@sparehosts) {
next if ($hostid eq $lonhost);
my $hostname = &Apache::lonnet::hostname($hostid);
- next if (($last eq $hostname) || ($hostname eq ''));
- $spares.='
'.
$hostname.''.
- ' '.&mt('(preferred)').''.$/;
- $last=$hostname;
+ ' '.&mt('(preferred)').''.$/;
}
if ($spares) {
$spares.= '
';
@@ -413,23 +466,25 @@ sub handler {
&Apache::lonnet::hostname($b);
}
keys(%all_hostnames)) {
- next if ($hostid eq $lonhost || $Apache::lonnet::spareid{$hostid});
+ next if ($hostid eq $lonhost);
my $hostname = &Apache::lonnet::hostname($hostid);
- next if (($last eq $hostname) || ($hostname eq ''));
- $spares.='
'.
$hostname.'';
- $last=$hostname;
}
$r->print(
- ''
- .'
'.&mt('Please attempt to login to one of the following servers:')