--- loncom/auth/lonauth.pm 2021/08/09 15:36:28 1.165 +++ loncom/auth/lonauth.pm 2021/08/10 15:28:13 1.166 @@ -1,7 +1,7 @@ # The LearningOnline Network # User Authentication Module # -# $Id: lonauth.pm,v 1.165 2021/08/09 15:36:28 raeburn Exp $ +# $Id: lonauth.pm,v 1.166 2021/08/10 15:28:13 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -386,18 +386,17 @@ sub handler { &Apache::lonnet::transfer_profile_to_env($lonidsdir,$handle); &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; - my $start_page = + my $start_page = &Apache::loncommon::start_page('Already logged in'); my $end_page = &Apache::loncommon::end_page(); my $dest = '/adm/roles'; if ($env{'form.firsturl'} ne '') { $dest = $env{'form.firsturl'}; - if (($env{'form.firsturl'} =~ m{^/tiny/$match_domain/\w+$}) && - ($env{'request.course.id'})) { + if (($dest =~ m{^/tiny/$match_domain/\w+$}) && ($env{'request.course.id'})) { my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - my $symb = &Apache::loncommon::symb_from_tinyurl($env{'form.firsturl'},$cnum,$cdom); + my $symb = &Apache::loncommon::symb_from_tinyurl($dest,$cnum,$cdom); if ($symb) { my $buffer; if ($r->header_in('Content-length') > 0) { @@ -801,11 +800,24 @@ sub handler { 'user.linkproturi' => $uri}; } } elsif ($form{'linkkey'}) { - $extra_env = {'user.deeplinkkey' => $form{'linkkey'}, + $extra_env = {'user.deeplinkkey' => $form{'linkkey'}, 'user.keyedlinkuri' => $form{'firsturl'}}; } if ($form{'firsturl'} =~ m{^/tiny/$match_domain/\w+$}) { &set_deeplink_login(%form); + if ($form{'linkprot'}) { + if (ref($extra_env) eq 'HASH') { + %{$extra_env} = ( %{$extra_env}, 'request.linkprot' => $form{'linkprot'} ); + } else { + $extra_env = {'request.linkprot' => $form{'linkprot'}}; + } + } elsif ($form{'linkkey'}) { + if (ref($extra_env) eq 'HASH') { + %{$extra_env} = ( %{$extra_env}, 'request.linkkey' => $form{'linkkey'} ); + } else { + $extra_env = {'request.linkkey' => $form{'linkkey'}}; + } + } if ($env{'request.deeplink.login'}) { if (ref($extra_env) eq 'HASH') { %{$extra_env} = ( %{$extra_env}, 'request.deeplink.login' => $form{'firsturl'} ); @@ -826,24 +838,36 @@ sub set_deeplink_login { my $cdom = $1; my ($cnum,$symb) = &Apache::loncommon::symb_from_tinyurl($form{'firsturl'},'',$cdom); if ($symb) { - my $disallow; - my $deeplink = &Apache::lonnet::EXT("resource.0.deeplink",$symb); - if ($deeplink ne '') { - my ($state,$others,$listed,$scope,$protect) = split(/,/,$deeplink); - if (($protect ne 'none') && ($protect ne '')) { - my ($acctype,$item) = split(/:/,$protect); - if (($acctype eq 'ltic') || ($acctype eq 'ltid')) { - unless ($form{'linkprot'} eq $protect) { - $disallow = 1; - } - } elsif ($acctype eq 'key') { - unless ($form{'linkkey'} eq $item) { - $disallow = 1; + if ($env{'request.course.id'} eq $cdom.'_'.$cnum) { + my ($disallow,$deeplink); + if ($symb =~ /\.(page|sequence)$/) { + my $mapname = &Apache::lonnet::deversion((&Apache::lonnet::decode_symb($symb))[2]); + my $navmap = Apache::lonnavmaps::navmap->new(); + if (ref($navmap)) { + $deeplink = $navmap->get_mapparam(undef,$mapname,'0.deeplink'); + } + } else { + $deeplink = &Apache::lonnet::EXT('resource.0.deeplink',$symb); + } + if ($deeplink ne '') { + my ($state,$others,$listed,$scope,$protect) = split(/,/,$deeplink); + if (($protect ne 'none') && ($protect ne '')) { + my ($acctype,$item) = split(/:/,$protect); + if ($acctype =~ /lti(c|d)$/) { + unless ($form{'linkprot'} eq $item.$1.':'.$env{'request.deeplink.login'}) { + $disallow = 1; + } + } elsif ($acctype eq 'key') { + unless ($form{'linkkey'} eq $item) { + $disallow = 1; + } } } } - } - unless ($disallow) { + unless ($disallow) { + $env{'request.deeplink.login'} = $form{'firsturl'}; + } + } else { $env{'request.deeplink.login'} = $form{'firsturl'}; } }