--- loncom/auth/migrateuser.pm 2016/12/05 00:51:43 1.25 +++ loncom/auth/migrateuser.pm 2021/12/12 18:34:48 1.25.2.5 @@ -1,7 +1,7 @@ # The LearningOnline Network # Starts a user off based of an existing token. # -# $Id: migrateuser.pm,v 1.25 2016/12/05 00:51:43 raeburn Exp $ +# $Id: migrateuser.pm,v 1.25.2.5 2021/12/12 18:34:48 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -30,7 +30,7 @@ package Apache::migrateuser; use strict; use LONCAPA qw(:DEFAULT :match); -use Apache::Constants qw(:common :http :methods); +use Apache::Constants qw(:common :http :methods :remotehost); use Apache::lonauth; use Apache::lonnet; use Apache::lonlocal; @@ -161,6 +161,8 @@ sub ip_changed { if ($hostname) { my $protocol = $Apache::lonnet::protocol{$switchto}; $protocol = 'http' if ($protocol ne 'https'); + my $alias = &Apache::lonnet::use_proxy_alias($r,$switchto); + $hostname = $alias if ($alias ne ''); $url = $protocol.'://'.$hostname; if ($rule_in_effect eq 'balancer') { $message .= '
'. @@ -171,6 +173,11 @@ sub ip_changed { } } } + unless ($hosthere) { + if (($dataref->{'balancer'}) && ($dataref->{'balcookie'})) { + &Apache::lonnet::delbalcookie($dataref->{'balcookie'},$dataref->{'balancer'}); + } + } } if ($dataref->{'sso.login'}) { $url .= '/adm/roles'; @@ -184,19 +191,17 @@ sub ip_changed { my %info= ( 'domain' => $udom, 'username' => $dataref->{'username'}, - 'role' => $dataref->{'role'}, 'sessionserver' => $lonhost, ); - if ($dataref->{'origurl'}) { - $info{'origurl'} = $dataref->{'origurl'}; - } - if ($dataref->{'symb'}) { - $info{'symb'} = $dataref->{'symb'}; + my @names = ('origurl','symb','role'); + foreach my $name (@names) { + if ($dataref->{$name} ne '') { + $info{$name} = $dataref->{$name}; + } } - my $iptoken = &Apache::lonnet::tmpput(\%info,$switchto); + my $iptoken = &Apache::lonnet::tmpput(\%info,$switchto,'link'); unless ($iptoken eq 'conlost') { - $url .= ($url =~ /\?/) ? '&' : '?'; - $url .= 'iptoken='.$iptoken; + $url .= (($url =~ /\?/) ? '&' : '?') . 'iptoken='.$iptoken; } $r->print(&Apache::loncommon::start_page($title,undef, {'redirect' => @@ -229,9 +234,10 @@ sub handler { if (!defined($data{'username'}) || !defined($data{'domain'})) { return &goto_login($r); } - if ($data{'ip'} ne $ENV{'REMOTE_ADDR'}) { + my $ip = &Apache::lonnet::get_requestor_ip($r,REMOTE_NOLOOKUP); + if ($data{'ip'} ne $ip) { &Apache::lonnet::logthis('IP change when session migration requested -- was: '. - $data{'ip'}.'; now: '.$ENV{'REMOTE_ADDR'}.' for '.$data{'username'}.':'.$data{'domain'}); + $data{'ip'}.'; now: '.$ip.' for '.$data{'username'}.':'.$data{'domain'}); return &ip_changed($r,$data{'domain'},$data{'server'},\%data); } @@ -244,8 +250,29 @@ sub handler { if ($home =~ /(con_lost|no_such_host)/) { return &goto_login($r,$udom); } my $extra_env = &sso_check(\%data); + if (($data{'balancer'}) && ($data{'server'}) && ($data{'balcookie'})) { + if (ref($extra_env) eq 'HASH') { + $extra_env->{'request.balancercookie'} = $data{'server'}.':'.$data{'balcookie'}; + } else { + $extra_env = { 'request.balancercookie' => $data{'server'}.':'.$data{'balcookie'} }; + } + } elsif (($data{'server'}) && ($data{'otherbalcookie'})) { + my ($balancer,$balcookie) = split(/:/,$data{'otherbalcookie'}); + if (defined(&Apache::lonnet::hostname($balancer)) && $balcookie =~ /^[a-f0-9]{32}$/) { + my $baldom = &Apache::lonnet::host_domain($balancer); + if (&Apache::lonnet::shared_institution($baldom)) { + my $cookieid = join('_',$udom,$data{'username'},$balcookie); + &Apache::lonnet::updatebalcookie($cookieid,$balancer,$data{'server'}); + if (ref($extra_env) eq 'HASH') { + $extra_env->{'request.balancercookie'} = $data{'otherbalcookie'}; + } else { + $extra_env = { 'request.balancercookie' => $data{'otherbalcookie'} }; + } + } + } + } - my %form; + my (%form,$cid); if ($data{'symb'} ne '') { $form{'symb'} = $data{'symb'}; } @@ -255,9 +282,27 @@ sub handler { if ($data{'noloadbalance'} ne '') { $form{'noloadbalance'} = $data{'noloadbalance'}; } + if ($data{'role'}) { + if ($data{'role'} =~ m{\./($match_domain)/($match_courseid)(?:/\w+|$)}) { + unless (&Apache::lonnet::homeserver($2,$1) eq 'no_host') { + $cid = $1.'_'.$2; + } + } + } else { + my ($handle,$expirepub); + $handle = &Apache::lonnet::check_for_valid_session($r); - if (!$data{'role'}) { - my $handle = &Apache::lonnet::check_for_valid_session($r); +# For "public user" - remove any existing "public" cookie so actual user is logged in. + if ($handle) { + if ($handle=~/^publicuser\_/) { + my $lonidsdir=$r->dir_config('lonIDsDir'); + if ($lonidsdir ne '') { + unlink("$lonidsdir/$handle.id"); + } + undef($handle); + $expirepub = 1; + } + } if ($handle) { &Apache::lonnet::transfer_profile_to_env($r->dir_config('lonIDsDir'), $handle); @@ -274,7 +319,8 @@ sub handler { $desturl = $data{'origurl'}; } &Apache::lonauth::success($r,$data{'username'},$data{'domain'}, - $home,$desturl,$extra_env,\%form); + $home,$desturl,$extra_env,\%form,'', + $expirepub); } return OK; @@ -286,7 +332,7 @@ sub handler { $next_url .= '&orgurl='.&escape($data{'origurl'}); } &Apache::lonauth::success($r,$data{'username'},$data{'domain'},$home, - $next_url,$extra_env,\%form); + $next_url,$extra_env,\%form,$cid); return OK; }