--- loncom/interface/loncommon.pm	2021/01/29 02:28:32	1.1353
+++ loncom/interface/loncommon.pm	2021/05/07 20:07:02	1.1358
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.1353 2021/01/29 02:28:32 raeburn Exp $
+# $Id: loncommon.pm,v 1.1358 2021/05/07 20:07:02 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -6144,12 +6144,24 @@ sub bodytag {
     if ($realm) {
         $realm = '/'.$realm;
     }
-    if ($role  eq 'ca') {
+    if ($role eq 'ca') {
         my ($rdom,$rname) = ($realm =~ m{^/($match_domain)/($match_username)$});
         $realm = &plainname($rname,$rdom);
     } 
 # realm
+    my ($cid,$sec);
     if ($env{'request.course.id'}) {
+        $cid = $env{'request.course.id'};
+        if ($env{'request.course.sec'}) {
+            $sec = $env{'request.course.sec'};
+        }
+    } elsif ($realm =~ m{^/($match_domain)/($match_courseid)(?:|/(\w+))$}) {
+        if (&Apache::lonnet::is_course($1,$2)) {
+            $cid = $1.'_'.$2;
+            $sec = $3;
+        }
+    }
+    if ($cid) {
         if ($env{'request.role'} !~ /^cr/) {
             $role = &Apache::lonnet::plaintext($role,&course_type());
         } elsif ($role =~ m{^cr/($match_domain)/\1-domainconfig/(\w+)$}) {
@@ -6161,10 +6173,10 @@ sub bodytag {
         } else {
             $role = (split(/\//,$role,4))[-1]; 
         }
-        if ($env{'request.course.sec'}) {
-            $role .= (' 'x2).'- '.&mt('section:').' '.$env{'request.course.sec'};
+        if ($sec) {
+            $role .= (' 'x2).'- '.&mt('section:').' '.$sec;
         }   
-	$realm = $env{'course.'.$env{'request.course.id'}.'.description'};
+	$realm = $env{'course.'.$cid.'.description'};
     } else {
         $role = &Apache::lonnet::plaintext($role);
     }
@@ -6187,7 +6199,7 @@ sub bodytag {
 	undef($role);
     }
 
-    if (($env{'request.course.id'}) && ($env{'request.lti.login'})) {
+    if (($cid) && ($env{'request.lti.login'})) {
         if (ref($ltimenu) eq 'HASH') {
             unless ($ltimenu->{'role'}) {
                 undef($role);
@@ -6202,17 +6214,15 @@ sub bodytag {
     #
     # Extra info if you are the DC
     my $dc_info = '';
-    if ($env{'user.adv'} && exists($env{'user.role.dc./'.
-                        $env{'course.'.$env{'request.course.id'}.
-                                 '.domain'}.'/'})) {
-        my $cid = $env{'request.course.id'};
+    if (($env{'user.adv'}) && ($env{'request.course.id'}) &&
+        (exists($env{'user.role.dc./'.$env{'course.'.$cid.'.domain'}.'/'}))) {
         $dc_info = $cid.' '.$env{'course.'.$cid.'.internal.coursecode'};
         $dc_info =~ s/\s+$//;
     }
 
     my $crstype;
-    if ($env{'request.course.id'}) {
-        $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
+    if ($cid) {
+        $crstype = $env{'course.'.$cid.'.type'};
     } elsif ($args->{'crstype'}) {
         $crstype = $args->{'crstype'};
     }
@@ -8627,7 +8637,7 @@ ADDMETA
                         }
                     }
                     if ($offload) {
-                        my $newserver = &Apache::lonnet::spareserver(30000,undef,1,$dom_in_use);
+                        my $newserver = &Apache::lonnet::spareserver(undef,30000,undef,1,$dom_in_use);
                         if (($newserver eq '') && ($offloadoth)) {
                             my @domains = &Apache::lonnet::current_machine_domains();
                             if (($dom_in_use ne '') && (!grep(/^\Q$dom_in_use\E$/,@domains))) { 
@@ -8647,7 +8657,7 @@ ADDMETA
                             }
                             if ($locknum) {
                                 my @lockinfo = sort(values(%locks));
-                                $msg = &mt('Once the following tasks are complete: ')."\n".
+                                $msg = &mt('Once the following tasks are complete:')." \n".
                                        join(", ",sort(values(%locks)))."\n";
                                 if (&show_course()) {
                                     $msg .= &mt('your session will be transferred to a different server, after you click "Courses".');
@@ -16223,8 +16233,7 @@ sub construct_course {
                    'plc.users.denied',
                    'hidefromcat',
                    'checkforpriv',
-                   'categories',
-                   'internal.uniquecode'],
+                   'categories'],
                    $$crsudom,$$crsunum);
         if ($args->{'textbook'}) {
             $cenv{'internal.textbook'} = $args->{'textbook'};
@@ -18256,6 +18265,9 @@ sub cleanup_html {
 # $context is the calling context -- roles, grades, contents, menu or flip. 
 sub critical_redirect {
     my ($interval,$context) = @_;
+    unless (($env{'user.domain'} ne '') && ($env{'user.name'} ne '')) {
+        return ();
+    }
     if ((time-$env{'user.criticalcheck.time'})>$interval) {
         if (($env{'request.course.id'}) && (($context eq 'flip') || ($context eq 'contents'))) {
             my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
@@ -18277,7 +18289,7 @@ sub critical_redirect {
         &Apache::lonnet::appenv({'user.criticalcheck.time'=>time});
         my $redirecturl;
         if ($what[0]) {
-	    if (($what[0] ne 'con_lost') && ($what[0]!~/^error\:/)) {
+	    if (($what[0] ne 'con_lost') && ($what[0] ne 'no_such_host') && ($what[0]!~/^error\:/)) {
 	        $redirecturl='/adm/email?critical=display';
 	        my $url=&Apache::lonnet::absolute_url().$redirecturl;
                 return (1, $url);