--- loncom/auth/lonauth.pm 2018/12/26 20:10:21 1.156 +++ loncom/auth/lonauth.pm 2020/03/15 23:04:10 1.159 @@ -1,7 +1,7 @@ # The LearningOnline Network # User Authentication Module # -# $Id: lonauth.pm,v 1.156 2018/12/26 20:10:21 raeburn Exp $ +# $Id: lonauth.pm,v 1.159 2020/03/15 23:04:10 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -46,7 +46,7 @@ use Digest::MD5; # ------------------------------------------------------------ Successful login sub success { my ($r, $username, $domain, $authhost, $lowerurl, $extra_env, - $form,$skipcritical) = @_; + $form,$skipcritical,$cid) = @_; # ------------------------------------------------------------ Get cookie ready my $cookie = @@ -108,6 +108,7 @@ sub success { } $r->send_http_header; if (ref($form) eq 'HASH') { + $form->{'lti.login'} = $env{'request.lti.login'}; $form->{'lti.reqcrs'} = $env{'request.lti.reqcrs'}; $form->{'lti.reqrole'} = $env{'request.lti.reqrole'}; $form->{'lti.sourcecrs'} = $env{'request.lti.sourcecrs'}; @@ -147,16 +148,26 @@ sub success { } if (defined($form->{symb})) { my $destsymb = $form->{symb}; + my $encrypted; + if ($destsymb =~ m{^/enc/}) { + $encrypted = 1; + if ($cid) { + $destsymb = &Apache::lonenc::unencrypted($destsymb,$cid); + } + } $destination .= ($destination =~ /\?/) ? '&' : '?'; if ($destsymb =~ /___/) { - # FIXME Need to deal with encrypted symbs and urls as needed. my ($map,$resid,$desturl)=split(/___/,$destsymb); $desturl = &Apache::lonnet::clutter($desturl); + if ($encrypted) { + $desturl = &Apache::lonenc::encrypted($desturl,1,$cid); + $destsymb = $form->{symb}; + } $desturl = &HTML::Entities::encode($desturl,'"<>&'); $destsymb = &HTML::Entities::encode($destsymb,'"<>&'); $destination .= 'destinationurl='.$desturl. '&destsymb='.$destsymb; - } else { + } elsif (!$encrypted) { $destsymb = &HTML::Entities::encode($destsymb,'"<>&'); $destination .= 'destinationurl='.$destsymb; } @@ -302,6 +313,13 @@ sub failed { my $firsturl = &Apache::loncommon::cleanup_html($form->{firsturl}); if ($firsturl ne '') { $retry .= (($retry=~/\?/)?'&':'?').'firsturl='.$firsturl; + if ($firsturl =~ m{^/tiny/$match_domain/\w+$}) { + unless (exists($form->{linkprot})) { + if (exists($form->{linkkey})) { + $retry .= 'linkkey='.$form->{linkkey}; + } + } + } } } if (exists($form->{linkprot})) { @@ -374,6 +392,9 @@ sub handler { my $dest = '/adm/roles'; if ($env{'form.firsturl'} ne '') { $dest = $env{'form.firsturl'}; + if ($env{'form.firsturl'} =~ m{^/tiny/$match_domain/\w+$}) { + &Apache::lonnet::appenv({'request.deeplink.login' => $env{'form.firsturl'}}); + } } $r->print( $start_page @@ -445,7 +466,7 @@ sub handler { return OK; } - my ($key,$firsturl,$rolestr,$symbstr,$iptokenstr,$linkprotstr)=split(/&/,$tmpinfo); + my ($key,$firsturl,$rolestr,$symbstr,$iptokenstr,$linkstr)=split(/&/,$tmpinfo); if ($rolestr) { $rolestr = &unescape($rolestr); } @@ -455,8 +476,8 @@ sub handler { if ($iptokenstr) { $iptokenstr = &unescape($iptokenstr); } - if ($linkprotstr) { - $linkprotstr = &unescape($linkprotstr); + if ($linkstr) { + $linkstr = &unescape($linkstr); } if ($firsturl =~ m{^/tiny/$match_domain/\w+$}) { $form{'firsturl'} = $firsturl; @@ -470,8 +491,10 @@ sub handler { if ($iptokenstr =~ /^iptoken=/) { (undef,$form{'iptoken'}) = split('=',$iptokenstr); } - if ($linkprotstr =~ /^linkprot=/) { - (undef,$form{'linkprot'}) = split('=',$linkprotstr); + if ($linkstr =~ /^linkprot=/) { + (undef,$form{'linkprot'}) = split('=',$linkstr); + } elsif ($linkstr =~ /^linkkey=/) { + (undef,$form{'linkkey'}) = split('=',$linkstr); } my $upass = $ENV{HTTPS} ? $form{'upass0'} @@ -655,6 +678,11 @@ sub handler { } if ($form{'linkprot'}) { $env{'request.linkprot'} = $form{'linkprot'}; + } elsif ($form{'firsturl'} =~ m{^/tiny/$match_domain/\w+$}) { + if ($form{'linkkey'}) { + $env{'request.linkkey'} = $form{'linkkey'}; + } + $env{'request.deeplink.login'} = $form{'firsturl'}; } $r->internal_redirect($switchto); } else { @@ -679,6 +707,12 @@ sub handler { } if ($form{'linkprot'}) { $env{'request.linkprot'} = $form{'linkprot'}; + } elsif ($form{'firsturl'} =~ m{^/tiny/$match_domain/\w+$}) { + if ($form{'linkkey'}) { + $env{'request.linkkey'} = $form{'linkkey'}; + } + $env{'request.deeplink.login'} = $form{'firsturl'}; + } $r->internal_redirect($switchto); } else { @@ -711,6 +745,11 @@ sub handler { undef,\%form); if ($form{'linkprot'}) { $env{'request.linkprot'} = $form{'linkprot'}; + } elsif ($form{'firsturl'} =~ m{^/tiny/$match_domain/\w+$}) { + if ($form{'linkkey'}) { + $env{'request.linkkey'} = $form{'linkkey'}; + } + $env{'request.deeplink.login'} = $form{'firsturl'}; } $r->internal_redirect('/adm/switchserver?otherserver='.$unloaded.'&origurl='.$firsturl); return OK; @@ -726,6 +765,14 @@ sub handler { $extra_env = {'user.linkprotector' => $linkprotector, 'user.linkproturi' => $uri,}; } + } elsif ($form{'firsturl'} =~ m{^/tiny/$match_domain/\w+$}) { + if ($form{'linkkey'}) { + $extra_env = {'user.deeplinkkey' => $form{'linkkey'}, + 'user.keyedlinkuri' => $form{'firsturl'}, + 'request.deeplink.login' => $form{'firsturl'}}; + } else { + $extra_env = {'request.deeplink.login' => $form{'firsturl'}}; + } } &success($r,$form{'uname'},$form{'udom'},$authhost,$firsturl,$extra_env, \%form); @@ -793,6 +840,11 @@ sub check_can_host { $form); if ($form->{'linkprot'}) { $env{'request.linkprot'} = $form->{'linkprot'}; + } elsif ($form->{'firsturl'} =~ m{^/tiny/$match_domain/\w+$}) { + if ($form->{'linkkey'}) { + $env{'request.linkkey'} = $form->{'linkkey'}; + } + $env{'request.deeplink.login'} = $form->{'firsturl'}; } my ($otherserver) = &Apache::lonnet::choose_server($udom); $r->internal_redirect('/adm/switchserver?otherserver='.$otherserver);