--- loncom/auth/lonacc.pm 2013/12/13 02:10:27 1.149 +++ loncom/auth/lonacc.pm 2014/01/30 12:15:12 1.153 @@ -1,7 +1,7 @@ # The LearningOnline Network # Cookie Based Access Handler # -# $Id: lonacc.pm,v 1.149 2013/12/13 02:10:27 raeburn Exp $ +# $Id: lonacc.pm,v 1.153 2014/01/30 12:15:12 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -264,10 +264,13 @@ sub upload_size_allowed { =item sso_login() handle the case of the single sign on user, at this point $r->user - will be set and valid now need to find the loncapa user info, and possibly + will be set and valid; now need to find the loncapa user info, and possibly balance them. If $r->user() is set this means either it was either set by - SSO or by checkauthen.pm if a valid cookie was found. The latter case can - be identified by the third arg ($usename). + SSO or by checkauthen.pm, if a valid cookie was found. The latter case can + be identified by the third arg ($usename), except when lonacc is called in + an internal redirect to /adm/switchserver (e.g., load-balancing following + successful authentication) -- no cookie set yet. For that particular case + simply skip the call to sso_login(). returns OK if it was SSO and user was handled. returns undef if not SSO or no means to handle the user. @@ -361,6 +364,11 @@ sub sso_login { $info{$item} = $form{$item}; } } + unless ($info{'symb'}) { + unless (($r->uri eq '/adm/roles') || ($r->uri eq '/adm/sso')) { + $info{'origurl'} = $r->uri; + } + } if ($r->dir_config("ssodirecturl") == 1) { $info{'origurl'} = $r->uri; } @@ -394,11 +402,13 @@ sub sso_login { } } if (grep(/^sso$/,@cancreate)) { - $r->internal_redirect('/adm/createaccount'); + $r->set_handlers('PerlHandler'=> + [\&Apache::createaccount::handler]); + $r->handler('perl-script'); } else { $r->internal_redirect($r->dir_config('lonSSOUserUnknownRedirect')); + $r->set_handlers('PerlHandler'=> undef); } - $r->set_handlers('PerlHandler'=> undef); return OK; } return undef; @@ -419,9 +429,11 @@ sub handler { my %user; my $handle = &Apache::lonnet::check_for_valid_session($r,undef,\%user); - my $result = &sso_login($r,$handle,$user{'name'}); - if (defined($result)) { - return $result; + unless (($requrl eq '/adm/switchserver') && (!$r->is_initial_req())) { + my $result = &sso_login($r,$handle,$user{'name'}); + if (defined($result)) { + return $result; + } } my ($is_balancer,$otherserver); @@ -520,6 +532,10 @@ sub handler { if ($otherserver ne '') { $env{'form.otherserver'} = $otherserver; } + unless (($env{'form.origurl'}) || ($r->uri eq '/adm/roles') || + ($r->uri eq '/adm/switchserver') || ($r->uri eq '/adm/sso')) { + $env{'form.origurl'} = $r->uri; + } } # ---------------------------------------------------------------- Check access 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.