--- loncom/interface/loncommon.pm	2021/06/15 20:52:26	1.1361
+++ loncom/interface/loncommon.pm	2021/08/04 19:59:10	1.1363
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.1361 2021/06/15 20:52:26 raeburn Exp $
+# $Id: loncommon.pm,v 1.1363 2021/08/04 19:59:10 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -9142,11 +9142,35 @@ sub menucoll_in_effect {
     my ($menucoll,$deeplinkmenu,%menu);
     if ($env{'request.course.id'}) {
         $menucoll = $env{'course.'.$env{'request.course.id'}.'.menudefault'};
-        if (($env{'request.deeplink.login'}) &&
-            ($env{'request.noversionuri'} =~ m{^/(res|uploaded)/})) {
-            my $deeplink = &Apache::lonnet::EXT('resource.0.deeplink');
+        if ($env{'request.deeplink.login'}) {
+            my ($deeplink_symb,$deeplink);
+            my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+            my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+            if ($env{'request.noversionuri'} =~ m{^/(res|uploaded)/}) {
+                if ($env{'request.noversionuri'} =~ /\.(page|sequence)$/) {
+                    my $navmap = Apache::lonnavmaps::navmap->new();
+                    if (ref($navmap)) {
+                        $deeplink = $navmap->get_mapparam(undef,
+                                                          &Apache::lonnet::declutter($env{'request.noversionuri'}),
+                                                          '0.deeplink');
+                    }
+                } else {
+                    $deeplink = &Apache::lonnet::EXT('resource.0.deeplink');
+                }
+            } else {
+                $deeplink_symb = &deeplink_login_symb($cnum,$cdom);
+                if ($deeplink_symb =~ /\.(page|sequence)$/) {
+                    my $mapname = &Apache::lonnet::deversion((&Apache::lonnet::decode_symb($deeplink_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',$deeplink_symb);
+                }
+            }
             if ($deeplink ne '') {
-                my ($listed,$scope,$access,$display) = split(/,/,$deeplink);
+                my ($state,$others,$listed,$scope,$protect,$display) = split(/,/,$deeplink);
                 if ($display =~ /^\d+$/) {
                     $deeplinkmenu = 1;
                     $menucoll = $display;
@@ -9160,6 +9184,35 @@ sub menucoll_in_effect {
     return ($menucoll,$deeplinkmenu,\%menu);
 }
 
+sub deeplink_login_symb {
+    my ($cnum,$cdom) = @_;
+    my $login_symb;
+    if ($env{'request.deeplink.login'}) {
+        if ($env{'request.deeplink.login'} =~ m{^\Q/tiny/$cdom/\E(\w+)$}) {
+            my $key = $1;
+            my ($tinyurl,$login);
+            my ($result,$cached)=&Apache::lonnet::is_cached_new('tiny',$cdom."\0".$key);
+            if (defined($cached)) {
+                $tinyurl = $result;
+            } else {
+                my $configuname = &Apache::lonnet::get_domainconfiguser($cdom);
+                my %currtiny = &Apache::lonnet::get('tiny',[$key],$cdom,$configuname);
+                if ($currtiny{$key} ne '') {
+                    $tinyurl = $currtiny{$key};
+                    &Apache::lonnet::do_cache_new('tiny',$cdom."\0".$key,$currtiny{$key},600);
+                }
+            }
+            if ($tinyurl ne '') {
+                my ($cnumreq,$posslogin) = split(/\&/,$tinyurl);
+                if ($cnumreq eq $cnum) {
+                    $login_symb = $posslogin;
+                }
+            }
+        }
+    }
+    return $login_symb;
+}
+
 sub wishlist_window {
     return(<<'ENDWISHLIST');
 <script type="text/javascript">