[LON-CAPA-cvs] cvs: loncom(version_2_11_X) /auth switchserver.pm
raeburn
raeburn at source.lon-capa.org
Tue Jul 2 15:42:06 EDT 2024
raeburn Tue Jul 2 19:42:06 2024 EDT
Modified files: (Branch: version_2_11_X)
/loncom/auth switchserver.pm
Log:
- For 2.11
Backport 1.63 (part)
Index: loncom/auth/switchserver.pm
diff -u loncom/auth/switchserver.pm:1.35.2.6 loncom/auth/switchserver.pm:1.35.2.7
--- loncom/auth/switchserver.pm:1.35.2.6 Sun Dec 12 21:07:21 2021
+++ loncom/auth/switchserver.pm Tue Jul 2 19:42:06 2024
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Switch Servers Handler
#
-# $Id: switchserver.pm,v 1.35.2.6 2021/12/12 21:07:21 raeburn Exp $
+# $Id: switchserver.pm,v 1.35.2.7 2024/07/02 19:42:06 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -62,7 +62,7 @@
}
my $start_page =
&Apache::loncommon::start_page('Switching Server ...',undef,
- {'redirect' => [$delay,$url],
+ {'redirect' => [$delay,$url,'',1],
'only_body' => $only_body,});
my $end_page = &Apache::loncommon::end_page();
$r->print($start_page.$extra_text.$end_page);
@@ -102,7 +102,7 @@
if (!defined($handle)) { return FORBIDDEN; }
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
- ['otherserver','role','origurl','symb']);
+ ['otherserver','role','origurl','symb','edit']);
my $switch_to=&Apache::lonnet::hostname($env{'form.otherserver'});
if (! $env{'form.otherserver'}) {
@@ -163,26 +163,64 @@
}
unless ($skip_canhost_check) {
- my $canhost = 1;
- my $uprimary_id = &Apache::lonnet::domain($env{'user.domain'},'primary');
- my $uint_dom = &Apache::lonnet::internet_dom($uprimary_id);
- my @intdoms;
- my $internet_names = &Apache::lonnet::get_internet_names($env{'form.otherserver'});
- if (ref($internet_names) eq 'ARRAY') {
- @intdoms = @{$internet_names};
- }
- unless ($uint_dom ne '' && grep(/^\Q$uint_dom\E$/, at intdoms)) {
- my $serverhomeID = &Apache::lonnet::get_server_homeID($switch_to);
- my $serverhomedom = &Apache::lonnet::host_domain($serverhomeID);
- my %defdomdefaults = &Apache::lonnet::get_domain_defaults($serverhomedom);
- my %udomdefaults = &Apache::lonnet::get_domain_defaults($env{'user.domain'});
- my $remoterev = &Apache::lonnet::get_server_loncaparev($env{'user.domain'},$env{'form.otherserver'});
- $canhost =
- &Apache::lonnet::can_host_session($env{'user.domain'},
- $env{'form.otherserver'},
- $remoterev,
- $udomdefaults{'remotesessions'},
- $defdomdefaults{'hostedsessions'});
+ my $canhost = &Apache::lonnet::can_switchserver($env{'user.domain'},$env{'form.otherserver'});
+ unless ($canhost) {
+ if (($env{'request.course.id'}) && ($env{'form.symb'} ne '') &&
+ (&Apache::lonnet::allowed('mdc',$env{'request.course.id'}))) {
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ if (($cdom ne '') && ($cnum ne '') && ($env{'form.role'} =~ m{^([^.]+)\Q./$cdom/$cnum\E$})) {
+ my $symb = &Apache::lonnet::symbclean($env{'form.symb'});
+ my ($map,$idx,$url) = &Apache::lonnet::decode_symb($symb);
+ if (&Apache::lonnet::symbverify($symb,$url)) {
+ my $fileloc = &Apache::lonnet::declutter(&Apache::lonnet::filelocation("",$url));
+ my $resurl = &Apache::lonnet::clutter($url);
+ if ($resurl =~ m{^/res/($match_domain)/($match_username)/}) {
+ my ($audom,$auname) = ($1,$2);
+ if (&Apache::lonnet::homeserver($auname,$audom) eq $env{'form.otherserver'}) {
+ my @possroles = ("user.role.au./$audom/","user.role.ca./$audom/$auname","user.role.aa./$audom/$auname");
+ my $hasrole;
+ foreach my $rolekey (@possroles) {
+ if (exists($env{$rolekey})) {
+ my ($start,$end) = split(/\./,$env{$rolekey});
+ unless (($start && $start > $now) || ($end && $end < $now)) {
+ $hasrole = $rolekey;
+ }
+ if ($hasrole) {
+ $hasrole =~ s/^\Quser.role.\E//;
+ last;
+ }
+ }
+ }
+ if ($hasrole) {
+ $env{'form.role'} = $hasrole;
+ $env{'form.origurl'} = &Apache::lonnet::deversion($resurl);
+ $env{'form.origurl'} =~ s{^/res/}{/priv/};
+ delete($env{'form.symb'});
+ $canhost = 1;
+ if ($env{'form.edit'}) {
+ my $ip = &Apache::lonnet::get_requestor_ip($r,REMOTE_NOLOOKUP);
+ my %info=('ip' => $ip,
+ 'domain' => $env{'user.domain'},
+ 'username' => $env{'user.name'},
+ 'home' => $env{'user.home'},
+ 'role' => $env{'form.role'},
+ 'server' => $r->dir_config('lonHostID'),
+ 'origurl' => $env{'form.origurl'});
+ &Apache::loncommon::content_type($r,'text/html');
+ my $token = &Apache::lonnet::tmpput(\%info,$env{'form.otherserver'});
+ my $url = $protocol.'://'.$switch_to.'/adm/login?'.
+ 'domain='.$env{'user.domain'}.
+ '&username='.$env{'user.name'}.
+ '&token='.$token;
+ return &do_redirect($r,$url,0);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
}
unless ($canhost) { return FORBIDDEN; }
}
More information about the LON-CAPA-cvs
mailing list