[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