Annotation of loncom/auth/migrateuser.pm, revision 1.22

1.1       albertel    1: # The LearningOnline Network
                      2: # Starts a user off based of an existing token.
                      3: #
1.22    ! raeburn     4: # $Id: migrateuser.pm,v 1.21 2014/10/04 02:59:32 raeburn Exp $
1.1       albertel    5: #
                      6: # Copyright Michigan State University Board of Trustees
                      7: #
                      8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
                      9: #
                     10: # LON-CAPA is free software; you can redistribute it and/or modify
                     11: # it under the terms of the GNU General Public License as published by
                     12: # the Free Software Foundation; either version 2 of the License, or
                     13: # (at your option) any later version.
                     14: #
                     15: # LON-CAPA is distributed in the hope that it will be useful,
                     16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
                     17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     18: # GNU General Public License for more details.
                     19: #
                     20: # You should have received a copy of the GNU General Public License
                     21: # along with LON-CAPA; if not, write to the Free Software
                     22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     23: #
                     24: # /home/httpd/html/adm/gpl.txt
                     25: #
                     26: # http://www.lon-capa.org/
                     27: #
                     28: 
1.2       albertel   29: package Apache::migrateuser;
1.1       albertel   30: 
                     31: use strict;
1.19      raeburn    32: use LONCAPA qw(:DEFAULT :match);
1.1       albertel   33: use Apache::Constants qw(:common :http :methods);
                     34: use Apache::lonauth;
                     35: use Apache::lonnet;
1.6       albertel   36: use Apache::lonlocal;
1.18      raeburn    37: use Apache::lonlogin();
1.1       albertel   38: 
                     39: sub goto_login {
1.2       albertel   40:     my ($r) = @_;
                     41:     &Apache::loncommon::content_type($r,'text/html');
                     42:     $r->send_http_header;
1.5       albertel   43:     $r->print(&Apache::loncommon::start_page('Going to login',undef,
                     44: 					     {'redirect' =>
                     45: 						  [0,'/adm/login'],}).
                     46: 	      '<h1>'.&mt('One moment please...').'</h1>'.
                     47: 	      '<p>'.&mt('Transferring to login page.').'</p>'.
                     48: 	      &Apache::loncommon::end_page());
1.2       albertel   49:     return OK;
1.1       albertel   50: }
                     51: 
1.2       albertel   52: 
1.7       albertel   53: sub sso_check {
                     54:     my ($data) = @_;
1.8       albertel   55:     my %extra_env;
1.18      raeburn    56:     if (ref($data) eq 'HASH') {
                     57:         if ($data->{'sso.login'}) {
                     58:             $extra_env{'request.sso.login'} = $data->{'sso.login'};
                     59:         }
                     60:         if ($data->{'sso.reloginserver'}) {
                     61:             $extra_env{'request.sso.reloginserver'} = 
                     62:                 $data->{'sso.reloginserver'};
                     63:         }
1.7       albertel   64:     }
1.18      raeburn    65:     return \%extra_env;
                     66: }
                     67: 
                     68: sub ip_changed {
                     69:     my ($r,$udom,$camefrom,$dataref) = @_;
                     70:     &Apache::loncommon::content_type($r,'text/html');
                     71:     $r->send_http_header;
                     72:     if (ref($dataref) eq 'HASH') {
                     73:         my $title = 'LON-CAPA Session redirected';
                     74:         my $message = &mt('Your internet address has changed since you logged in.');  
                     75:         my $rule_in_effect;
1.22    ! raeburn    76:         if ($dataref->{'balancer'}) {
        !            77:             my $baldom = &Apache::lonnet::host_domain($camefrom);
        !            78:             my $balprimaryid = &Apache::lonnet::domain($baldom,'primary');
        !            79:             my $balintdom = &Apache::lonnet::internet_dom($balprimaryid);
        !            80:             my $uprimaryid = &Apache::lonnet::domain($udom,'primary'); 
        !            81:             my $uintdom = &Apache::lonnet::internet_dom($uprimaryid);
        !            82:             my $dom_in_use;
        !            83:             if (($uintdom ne '') && ($uintdom eq $balintdom)) {
        !            84:                 $dom_in_use = $udom;
        !            85:             } else {
        !            86:                 $dom_in_use = $baldom;
1.21      raeburn    87:             }
1.22    ! raeburn    88:             my ($result,$cached)=&Apache::lonnet::is_cached_new('loadbalancing',$dom_in_use);
1.18      raeburn    89:             unless (defined($cached)) {
                     90:                 my $cachetime = 60*60*24; 
                     91:                 my %domconfig =
1.22    ! raeburn    92:                     &Apache::lonnet::get_dom('configuration',['loadbalancing'],$dom_in_use);
1.18      raeburn    93:                 if (ref($domconfig{'loadbalancing'}) eq 'HASH') {
1.22    ! raeburn    94:                     $result = &Apache::lonnet::do_cache_new('loadbalancing',$dom_in_use,
1.18      raeburn    95:                                                             $domconfig{'loadbalancing'},$cachetime);
                     96:                 }
                     97:             }
                     98:             if (ref($result) eq 'HASH') {
                     99:                 (undef,my $currtargets,my $currrules) =
                    100:                     &Apache::lonnet::check_balancer_result($result,$dataref->{'server'});
                    101:                 if (ref($currrules) eq 'HASH') {
                    102:                     if ($dataref->{'sso.login'}) {
                    103:                         if ($currrules->{'_LC_ipchangesso'} ne '') {
                    104:                             $rule_in_effect = $currrules->{'_LC_ipchangesso'};
                    105:                         }
                    106:                     } else {
                    107:                         if ($currrules->{'_LC_ipchange'} ne '') {
                    108:                             $rule_in_effect = $currrules->{'_LC_ipchange'};
                    109:                         }
                    110:                     }
                    111:                 }
                    112:             }
                    113:         }
                    114:         my $url;
                    115:         my $lonhost= $r->dir_config('lonHostID');
                    116:         my $switchto = $lonhost;
                    117:         if ($rule_in_effect eq 'balancer') {
                    118:             my $hosthere;
                    119:             if ($dataref->{'role'}) {
                    120:                 my ($adom,$aname);
                    121:                 if ($dataref->{'role'} =~ m{^au\./($match_domain)/$}) {
                    122:                     $adom = $1;
                    123:                     $aname = $dataref->{'username'};
                    124:                 } elsif ($dataref->{'role'} =~ m{^(?:ca|aa)\./($match_domain)/($match_username)$}) {
                    125:                     $adom = $1;
                    126:                     $aname = $2;
                    127:                 }
                    128:                 if ($adom ne '' && $aname ne '') {
                    129:                     my $ahome = &Apache::lonnet::homeserver($aname,$adom);
                    130:                     unless ($ahome eq 'no_host') {
                    131:                         my @ids=&Apache::lonnet::current_machine_ids();
                    132:                         if ($ahome && grep(/^\Q$ahome\E$/,@ids)) {
                    133:                             $hosthere = 1;
                    134:                         }
                    135:                     }
                    136:                 }
                    137:             }
                    138:             unless ($hosthere) { 
                    139:                 my $hostname = &Apache::lonnet::hostname($dataref->{'server'});
                    140:                 if ($hostname) {
                    141:                     $switchto = $dataref->{'server'};
                    142:                     my $protocol = $Apache::lonnet::protocol{$switchto};
                    143:                     $protocol = 'http' if ($protocol ne 'https');
                    144:                     $url = $protocol.'://'.$hostname;
                    145:                     $message .= '<br />'.
                    146:                                 &mt('As a result, your LON-CAPA session is being redirected to the server where you originally logged in.');
                    147:                 }
                    148:             }
                    149:         }
                    150:         if ($dataref->{'sso.login'}) {
1.21      raeburn   151:             $url .= '/adm/roles';
1.18      raeburn   152:         } else {
1.21      raeburn   153:             $url .= '/adm/login';
1.20      raeburn   154:             $message .= '<br />'.&mt('You will need to provide your password one more time.');
1.18      raeburn   155:         }
                    156:         my %info= (
                    157:                     'domain'          => $dataref->{'domain'},
                    158:                     'username'        => $dataref->{'username'},
                    159:                     'role'            => $dataref->{'role'},
                    160:                     'sessionserver'   => $lonhost,
                    161:                   );
                    162:         if ($dataref->{'origurl'}) {
                    163:             $info{'origurl'} = $dataref->{'origurl'};
                    164:         }
                    165:         if ($dataref->{'symb'}) {
                    166:             $info{'symb'} = $dataref->{'symb'};
                    167:         }
                    168:         my $iptoken = &Apache::lonnet::tmpput(\%info,$switchto);
                    169:         unless ($iptoken eq 'conlost') {
1.21      raeburn   170:             $url .= '?iptoken='.$iptoken;
1.18      raeburn   171:         }
                    172:         $r->print(&Apache::loncommon::start_page($title,undef,
                    173:                                                  {'redirect' =>
                    174:                                                   [2,$url],}).
                    175:                   '<h1>'.&mt('One moment please...').'</h1>'.
                    176:                   '<p class="LC_warning">'.$message.'</p>'.
                    177:                   &Apache::loncommon::end_page());
                    178:     } else {
                    179:         return &goto_login($r);
1.10      raeburn   180:     }
1.18      raeburn   181:     return OK;
1.7       albertel  182: }
                    183: 
1.1       albertel  184: sub handler {
                    185:     my ($r) = @_;
                    186:     
                    187:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['token']);
1.4       albertel  188:     my %data =   &Apache::lonnet::tmpget($env{'form.token'});
1.13      raeburn   189:     if (keys(%data) == 0) {
                    190:         return &goto_login($r);
                    191:     }
1.4       albertel  192:     my $delete = &Apache::lonnet::tmpdel($env{'form.token'});
                    193: 
1.6       albertel  194:     &Apache::lonlocal::get_language_handle($r);
                    195: 
1.4       albertel  196:     if ($delete ne 'ok') {
                    197: 	return &goto_login($r);
                    198:     }
1.2       albertel  199: 
1.18      raeburn   200:     if (!defined($data{'username'}) || !defined($data{'domain'})) {
                    201:         return &goto_login($r);
                    202:     }
                    203:     if ($data{'ip'} ne $ENV{'REMOTE_ADDR'}) {
                    204: 	return &ip_changed($r,$data{'domain'},$data{'server'},\%data);
1.2       albertel  205:     }
                    206: 
1.17      raeburn   207:     &Apache::lonnet::logthis("Allowing access for $data{'username'}:$data{'domain'} to $data{'role'}");
1.2       albertel  208:     my $home=&Apache::lonnet::homeserver($data{'username'},$data{'domain'});
                    209:     if ($home =~ /(con_lost|no_such_host)/) { return &goto_login($r); }
                    210: 
1.8       albertel  211:     my $extra_env = &sso_check(\%data);
                    212: 
1.16      raeburn   213:     my %form;
                    214:     if ($data{'symb'} ne '') {
                    215:         $form{'symb'} = $data{'symb'};
                    216:     }
1.21      raeburn   217:     if ($data{'iptoken'} ne '') {
                    218:         $form{'iptoken'} = $data{'iptoken'};
                    219:     }
1.16      raeburn   220: 
1.3       albertel  221:     if (!$data{'role'}) {
1.12      albertel  222: 	my $handle = &Apache::lonnet::check_for_valid_session($r);
                    223: 	if ($handle) {
1.11      albertel  224: 	    &Apache::lonnet::transfer_profile_to_env($r->dir_config('lonIDsDir'),
                    225: 						     $handle);
1.14      raeburn   226:             if ($data{'origurl'} ne '') {
                    227:                 $r->internal_redirect($data{'origurl'});
                    228:             } elsif ($env{'request.course.id'}) {
                    229:                 $r->internal_redirect('/adm/navmaps');
1.11      albertel  230: 	    } else {
                    231: 		$r->internal_redirect('/adm/roles');
                    232: 	    }
                    233: 	} else {
1.14      raeburn   234:             my $desturl = '/adm/roles';
                    235:             if ($data{'origurl'} ne '') {
                    236:                 $desturl = $data{'origurl'};
                    237:             }
1.11      albertel  238: 	    &Apache::lonauth::success($r,$data{'username'},$data{'domain'},
1.16      raeburn   239: 				      $home,$desturl,$extra_env,\%form);
1.11      albertel  240: 
                    241: 	}
1.1       albertel  242: 	return OK;
1.11      albertel  243: 
1.1       albertel  244:     }
1.6       albertel  245: 
                    246:     my $next_url='/adm/roles?selectrole=1&amp;'.&escape($data{'role'}).'=1';
1.15      raeburn   247:     if ($data{'origurl'} ne '') {
                    248:         $next_url .= '&amp;orgurl='.&escape($data{'origurl'});
                    249:     }
1.6       albertel  250:     &Apache::lonauth::success($r,$data{'username'},$data{'domain'},$home,
1.16      raeburn   251: 			      $next_url,$extra_env,\%form);
1.6       albertel  252:     return OK;
1.1       albertel  253: }
                    254: 
                    255: 1;
                    256: __END__

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.