--- loncom/auth/switchserver.pm 2024/10/09 15:49:17 1.35.2.6.2.8 +++ loncom/auth/switchserver.pm 2024/10/09 15:23:35 1.67 @@ -1,7 +1,7 @@ # The LearningOnline Network # Switch Servers Handler # -# $Id: switchserver.pm,v 1.35.2.6.2.8 2024/10/09 15:49:17 raeburn Exp $ +# $Id: switchserver.pm,v 1.67 2024/10/09 15:23:35 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -32,7 +32,6 @@ use strict; use Apache::Constants qw(:common :remotehost); use Apache::lonnet; use Apache::loncommon; -use Apache::lonmenu; use Digest::MD5 qw(md5_hex); use CGI::Cookie(); use Apache::lonlocal; @@ -67,8 +66,7 @@ sub do_redirect { {'redirect' => [$delay,$url,'',$write_to_opener,1], 'only_body' => $only_body, 'switchserver' => 1, - 'links_disabled' => 1, - 'no_inline_link' => 1,}); + 'links_disabled' => 1,}); my $end_page = &Apache::loncommon::end_page(); $r->print($start_page.$extra_text.$end_page); unless ($env{'user.name'} eq 'public' && ($env{'user.domain'} eq 'public')) { @@ -160,8 +158,12 @@ sub handler { $skip_canhost_check = 1; } } elsif ($env{'form.role'} =~ m{^[ac]a\./($match_domain)/($match_username)$}) { - if (&Apache::lonnet::homeserver($2,$1) eq $env{'form.otherserver'}) { - $skip_canhost_check = 1; + my ($audom,$auname) = ($1,$2); + if (&Apache::lonnet::homeserver($auname,$audom) eq $env{'form.otherserver'}) { + if ((&Apache::lonnet::will_trust('othcoau',$env{'user.domain'},$audom)) && + (&Apache::lonnet::will_trust('coaurem',$audom,$env{'user.domain'}))) { + $skip_canhost_check = 1; + } } } } @@ -189,7 +191,12 @@ sub handler { if (exists($env{$rolekey})) { my ($start,$end) = split(/\./,$env{$rolekey}); unless (($start && $start > $now) || ($end && $end < $now)) { - $hasrole = $rolekey; + if ($rolekey eq "user.role.au./$audom/") { + $hasrole = $rolekey; + } elsif ((&Apache::lonnet::will_trust('othcoau',$env{'user.domain'},$audom)) && + (&Apache::lonnet::will_trust('coaurem',$audom,$env{'user.domain'}))) { + $hasrole = $rolekey; + } } if ($hasrole) { $hasrole =~ s/^\Quser.role.\E//; @@ -276,13 +283,11 @@ sub handler { } # -------------------------------------------------------- Menu script and info - my $windowinfo = &Apache::lonmenu::close(); - # ---------------------------------------------------------------- Get handover - my ($is_balancer,$setcookie,$newcookieid,$otherbalcookie); + my ($is_balancer,$setcookie,$newcookieid,$otherbalcookie,$offloadto,$dom_balancers); my $only_body = 0; - ($is_balancer,undef,$setcookie) = + ($is_balancer,undef,$setcookie,$offloadto,$dom_balancers) = &Apache::lonnet::check_loadbalancing($env{'user.name'},$env{'user.domain'},'switchserver'); if ($is_balancer && $setcookie && $env{'form.otherserver'}) { @@ -302,12 +307,25 @@ sub handler { $otherbalcookie = $env{'request.balancercookie'}; } - my %info=('ip' => $ip, - 'domain' => $env{'user.domain'}, - 'username' => $env{'user.name'}, - 'role' => $env{'form.role'}, - 'server' => $r->dir_config('lonHostID'), - 'balancer' => $is_balancer); + 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'), + 'balancer' => $is_balancer, + 'dom_balancers' => $dom_balancers, + 'offloadto' => ''); + if (ref($offloadto) eq 'HASH') { + foreach my $key (keys(%{$offloadto})) { + if (ref($offloadto->{$key}) eq 'ARRAY') { + $info{'offloadto'} .= $key.'='.join(',',@{$offloadto->{$key}}).'&'; + } + } + $info{'offloadto'} =~ s/\&$//; + } elsif (ref($offloadto) eq 'ARRAY') { + $info{'offloadto'} = join(',',@{$offloadto}); + } if ($newcookieid) { $info{'balcookie'} = $newcookieid; } elsif ($otherbalcookie) { @@ -332,7 +350,7 @@ sub handler { if (defined($r->dir_config("lonSSOUserLogoutScriptFile_$info{domain}"))) { if (open(my $fh,'<',$r->dir_config("lonSSOUserLogoutScriptFile_$info{domain}"))) { $ssologoutscript .= join('',<$fh>); - close($fh); + close($fh); } } if (defined($r->dir_config('lonSSOUserLogoutScriptFile'))) { @@ -403,8 +421,7 @@ sub handler { $url .= join('&',@args); } # --------------------------------------------------------------- Screen Output - return &do_redirect($r, $url, $only_body, $windowinfo.$ssologoutscript, - $env{'form.lcssowin'}); + return &do_redirect($r, $url, $only_body, $ssologoutscript, $env{'form.lcssowin'}); } 1;