Diff for /loncom/interface/loncommon.pm between versions 1.1348 and 1.1376

version 1.1348, 2020/10/01 10:16:33 version 1.1376, 2022/02/14 01:15:24
Line 1416  sub help_open_menu { Line 1416  sub help_open_menu {
 }  }
   
 sub top_nav_help {  sub top_nav_help {
     my ($text) = @_;      my ($text,$linkattr) = @_;
     $text = &mt($text);      $text = &mt($text);
     my $stay_on_page = 1;      my $stay_on_page = 1;
   
Line 1430  sub top_nav_help { Line 1430  sub top_nav_help {
     if ($link) {      if ($link) {
         return <<"END";          return <<"END";
 $banner_link  $banner_link
 <a href="$link" title="$title">$text</a>  <a href="$link" title="$title" $linkattr>$text</a>
 END  END
     } else {      } else {
         return '&nbsp;'.$text.'&nbsp;';          return '&nbsp;'.$text.'&nbsp;';
Line 3648  sub check_passwd_rules { Line 3648  sub check_passwd_rules {
     return $warning;      return $warning;
 }  }
   
   sub passwd_validation_js {
       my ($currpasswdval,$domain) = @_;
       my %passwdconf = &Apache::lonnet::get_passwdconf($domain);
       my ($min,$max,@chars,$numrules,$intargjs,%alert);
       $numrules = 0;
       $min = $Apache::lonnet::passwdmin;
       if (ref($passwdconf{'chars'}) eq 'ARRAY') {
           if ($passwdconf{'min'} =~ /^\d+$/) {
               if ($passwdconf{'min'} > $min) {
                   $min = $passwdconf{'min'};
               }
           }
           if ($passwdconf{'max'} =~ /^\d+$/) {
               $max = $passwdconf{'max'};
               $numrules ++;
           }
           @chars = @{$passwdconf{'chars'}};
           if (@chars) {
               $numrules ++;
           }
       }
       if ($min > 0) {
           $numrules ++;
       }
       if (($min > 0) || ($max ne '') || (@chars > 0)) {
           my $alertmsg = &mt('Initial password did not satisfy requirement(s):').'\n\n';
           if ($min) {
               $alert{'min'} = &mt('minimum [quant,_1,character]',$min).'\n';
           }
           if ($max) {
               $alert{'max'} = &mt('maximum [quant,_1,character]',$max).'\n';
           }
           my (@charalerts,@charrules);
           if (@chars) {
               if (grep(/^uc$/,@chars)) {
                   push(@charalerts,&mt('contain at least one upper case letter'));
                   push(@charrules,'uc');
               }
               if (grep(/^lc$/,@chars)) {
                   push(@charalerts,&mt('contain at least one lower case letter'));
                   push(@charrules,'lc');
               }
               if (grep(/^num$/,@chars)) {
                   push(@charalerts,&mt('contain at least one number'));
                   push(@charrules,'num');
               }
               if (grep(/^spec$/,@chars)) {
                   push(@charalerts,&mt('contain at least one non-alphanumeric'));
                   push(@charrules,'spec');
               }
           }
           $intargjs = qq|            var rulesmsg = '';\n|.
                       qq|            var currpwval = $currpasswdval;\n|;
               if ($min) {
                   $intargjs .= qq|
               if (currpwval.length < $min) {
                   rulesmsg += ' - $alert{min}';
               }
   |;
               }
               if ($max) {
                   $intargjs .= qq|
               if (currpwval.length > $max) {
                   rulesmsg += ' - $alert{max}';
               }
   |;
               }
               if (@chars > 0) {
                   my $charrulestr = '"'.join('","',@charrules).'"';
                   my $charalertstr = '"'.join('","',@charalerts).'"';
                   $intargjs .= qq|            var brokerules = new Array();\n|.
                                qq|            var charrules = new Array($charrulestr);\n|.
                                qq|            var charalerts = new Array($charalertstr);\n|;
                   my %rules;
                   map { $rules{$_} = 1; } @chars;
                   if ($rules{'uc'}) {
                       $intargjs .= qq|
               var ucRegExp = /[A-Z]/;
               if (!ucRegExp.test(currpwval)) {
                   brokerules.push('uc');
               }
   |;
                   }
                   if ($rules{'lc'}) {
                       $intargjs .= qq|
               var lcRegExp = /[a-z]/;
               if (!lcRegExp.test(currpwval)) {
                   brokerules.push('lc');
               }
   |;
                   }
                   if ($rules{'num'}) {
                        $intargjs .= qq|
               var numRegExp = /[0-9]/;
               if (!numRegExp.test(currpwval)) {
                   brokerules.push('num');
               }
   |;
                   }
                   if ($rules{'spec'}) {
                        $intargjs .= q|
               var specRegExp = /[!"#$%&'()*+,\-.\/:;<=>?@[\\^\]_`{\|}~]/;
               if (!specRegExp.test(currpwval)) {
                   brokerules.push('spec');
               }
   |;
                   }
                   $intargjs .= qq|
               if (brokerules.length > 0) {
                   for (var i=0; i<brokerules.length; i++) {
                       for (var j=0; j<charrules.length; j++) {
                           if (brokerules[i] == charrules[j]) {
                               rulesmsg += ' - '+charalerts[j]+'\\n';
                               break;
                           }
                       }
                   }
               }
   |;
               }
               $intargjs .= qq|
               if (rulesmsg != '') {
                   rulesmsg = '$alertmsg'+rulesmsg;
                   alert(rulesmsg);
                   return false;
               }
   |;
       }
       return ($numrules,$intargjs);
   }
   
 ###############################################################  ###############################################################
 ##    Get Kerberos Defaults for Domain                 ##  ##    Get Kerberos Defaults for Domain                 ##
 ###############################################################  ###############################################################
Line 4893  sub get_student_view_with_retries { Line 5024  sub get_student_view_with_retries {
     }      }
 }  }
   
   sub css_links {
       my ($currsymb,$level) = @_;
       my ($links,@symbs,%cssrefs,%httpref);
       if ($level eq 'map') {
           my $navmap = Apache::lonnavmaps::navmap->new();
           if (ref($navmap)) {
               my ($map,undef,$url)=&Apache::lonnet::decode_symb($currsymb);
               my @resources = $navmap->retrieveResources($map,sub { $_[0]->is_problem() },0,0);
               foreach my $res (@resources) {
                   if (ref($res) && $res->symb()) {
                       push(@symbs,$res->symb());
                   }
               }
           }
       } else {
           @symbs = ($currsymb);
       }
       foreach my $symb (@symbs) {
           my $css_href = &Apache::lonnet::EXT('resource.0.cssfile',$symb);
           if ($css_href =~ /\S/) {
               unless ($css_href =~ m{https?://}) {
                   my $url = (&Apache::lonnet::decode_symb($symb))[-1];
                   my $proburl =  &Apache::lonnet::clutter($url);
                   my ($probdir) = ($proburl =~ m{(.+)/[^/]+$});
                   unless ($css_href =~ m{^/}) {
                       $css_href = &Apache::lonnet::hreflocation($probdir,$css_href);
                   }
                   if ($css_href =~ m{^/(res|uploaded)/}) {
                       unless (($httpref{'httpref.'.$css_href}) ||
                               (&Apache::lonnet::is_on_map($css_href))) {
                           my $thisurl = $proburl;
                           if ($env{'httpref.'.$proburl}) {
                               $thisurl = $env{'httpref.'.$proburl};
                           }
                           $httpref{'httpref.'.$css_href} = $thisurl;
                       }
                   }
               }
               $cssrefs{$css_href} = 1;
           }
       }
       if (keys(%httpref)) {
           &Apache::lonnet::appenv(\%httpref);
       }
       if (keys(%cssrefs)) {
           foreach my $css_href (keys(%cssrefs)) {
               next unless ($css_href =~ m{^(/res/|/uploaded/|https?://)});
               $links .= '<link rel="stylesheet" type="text/css" href="'.$css_href.'" />'."\n";
           }
       }
       return $links;
   }
   
 =pod  =pod
   
 =item * &get_student_answers()   =item * &get_student_answers() 
Line 5148  sub findallcourses { Line 5332  sub findallcourses {
 ###############################################  ###############################################
   
 sub blockcheck {  sub blockcheck {
     my ($setters,$activity,$uname,$udom,$url,$is_course,$symb,$caller) = @_;      my ($setters,$activity,$clientip,$uname,$udom,$url,$is_course,$symb,$caller) = @_;
       unless (($activity eq 'docs') || ($activity eq 'reinit') || ($activity eq 'alert')) {
           my ($has_evb,$check_ipaccess);
           my $dom = $env{'user.domain'};
           if ($env{'request.course.id'}) {
               my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
               my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
               my $checkrole = "cm./$cdom/$cnum";
               my $sec = $env{'request.course.sec'};
               if ($sec ne '') {
                   $checkrole .= "/$sec";
               }
               if ((&Apache::lonnet::allowed('evb',undef,undef,$checkrole)) &&
                   ($env{'request.role'} !~ /^st/)) {
                   $has_evb = 1;
               }
               unless ($has_evb) {
                   if (($activity eq 'printout') || ($activity eq 'grades') || ($activity eq 'search') ||
                       ($activity eq 'boards') || ($activity eq 'groups') || ($activity eq 'chat')) {
                       if ($udom eq $cdom) {
                           $check_ipaccess = 1;
                       }
                   }
               }
           } elsif (($activity eq 'com') || ($activity eq 'port') || ($activity eq 'blogs') ||
                   ($activity eq 'about') || ($activity eq 'wishlist') || ($activity eq 'passwd')) {
               my $checkrole;
               if ($env{'request.role.domain'} eq '') {
                   $checkrole = "cm./$env{'user.domain'}/";
               } else {
                   $checkrole = "cm./$env{'request.role.domain'}/";
               }
               if (($checkrole) && (&Apache::lonnet::allowed('evb',undef,undef,$checkrole))) {
                   $has_evb = 1;
               }
           }
           unless ($has_evb || $check_ipaccess) {
               my @machinedoms = &Apache::lonnet::current_machine_domains();
               if (($dom eq 'public') && ($activity eq 'port')) {
                   $dom = $udom;
               }
               if (($dom ne '') && (grep(/^\Q$dom\E$/,@machinedoms))) {
                   $check_ipaccess = 1;
               } else {
                   my $lonhost = $Apache::lonnet::perlvar{'lonHostID'};
                   my $internet_names = &Apache::lonnet::get_internet_names($lonhost);
                   my $prim = &Apache::lonnet::domain($dom,'primary');
                   my $intdom = &Apache::lonnet::internet_dom($prim);
                   if (($intdom ne '') && (ref($internet_names) eq 'ARRAY')) {
                       if (grep(/^\Q$intdom\E$/,@{$internet_names})) {
                           $check_ipaccess = 1;
                       }
                   }
               }
           }
           if ($check_ipaccess) {
               my ($ipaccessref,$cached)=&Apache::lonnet::is_cached_new('ipaccess',$dom);
               unless (defined($cached)) {
                   my %domconfig =
                       &Apache::lonnet::get_dom('configuration',['ipaccess'],$dom);
                   $ipaccessref = &Apache::lonnet::do_cache_new('ipaccess',$dom,$domconfig{'ipaccess'},1800);
               }
               if ((ref($ipaccessref) eq 'HASH') && ($clientip)) {
                   foreach my $id (keys(%{$ipaccessref})) {
                       if (ref($ipaccessref->{$id}) eq 'HASH') {
                           my $range = $ipaccessref->{$id}->{'ip'};
                           if ($range) {
                               if (&Apache::lonnet::ip_match($clientip,$range)) {
                                   if (ref($ipaccessref->{$id}->{'commblocks'}) eq 'HASH') {
                                       if ($ipaccessref->{$id}->{'commblocks'}->{$activity} eq 'on') {
                                           return ('','','',$id,$dom);
                                           last;
                                       }
                                   }
                               }
                           }
                       }
                   }
               }
           }
           if (($activity eq 'wishlist') || ($activity eq 'annotate')) {
               return ();
           }
       }
     if (defined($udom) && defined($uname)) {      if (defined($udom) && defined($uname)) {
         # If uname and udom are for a course, check for blocks in the course.          # If uname and udom are for a course, check for blocks in the course.
         if (($is_course) || (&Apache::lonnet::is_course($udom,$uname))) {          if (($is_course) || (&Apache::lonnet::is_course($udom,$uname))) {
Line 5165  sub blockcheck { Line 5431  sub blockcheck {
     my $startblock = 0;      my $startblock = 0;
     my $endblock = 0;      my $endblock = 0;
     my $triggerblock = '';      my $triggerblock = '';
     my %live_courses = &findallcourses(undef,$uname,$udom);      my %live_courses;
       unless (($activity eq 'wishlist') || ($activity eq 'annotate')) {
           %live_courses = &findallcourses(undef,$uname,$udom);
       }
   
     # If uname is for a user, and activity is course-specific, i.e.,      # If uname is for a user, and activity is course-specific, i.e.,
     # boards, chat or groups, check for blocking in current course only.      # boards, chat or groups, check for blocking in current course only.
Line 5450  sub parse_block_record { Line 5719  sub parse_block_record {
 }  }
   
 sub blocking_status {  sub blocking_status {
     my ($activity,$uname,$udom,$url,$is_course,$symb,$caller) = @_;      my ($activity,$clientip,$uname,$udom,$url,$is_course,$symb,$caller) = @_;
     my %setters;      my %setters;
   
 # check for active blocking  # check for active blocking
     my ($startblock,$endblock,$triggerblock) =       if ($clientip eq '') {
         &blockcheck(\%setters,$activity,$uname,$udom,$url,$is_course,$symb,$caller);          $clientip = &Apache::lonnet::get_requestor_ip();
       }
       my ($startblock,$endblock,$triggerblock,$by_ip,$blockdom) = 
           &blockcheck(\%setters,$activity,$clientip,$uname,$udom,$url,$is_course,$symb,$caller);
     my $blocked = 0;      my $blocked = 0;
     if ($startblock && $endblock) {      if (($startblock && $endblock) || ($by_ip)) {
         $blocked = 1;          $blocked = 1;
     }      }
   
Line 5466  sub blocking_status { Line 5738  sub blocking_status {
   
 # build a link to a popup window containing the details  # build a link to a popup window containing the details
     my $querystring  = "?activity=$activity";      my $querystring  = "?activity=$activity";
 # $uname and $udom decide whose portfolio the user is trying to look at  # $uname and $udom decide whose portfolio (or information page) the user is trying to look at
     if (($activity eq 'port') || ($activity eq 'passwd')) {      if (($activity eq 'port') || ($activity eq 'about') || ($activity eq 'passwd')) {
         $querystring .= "&amp;udom=$udom"      if ($udom =~ /^$match_domain$/);           $querystring .= "&amp;udom=$udom"      if ($udom =~ /^$match_domain$/); 
         $querystring .= "&amp;uname=$uname"    if ($uname =~ /^$match_username$/);          $querystring .= "&amp;uname=$uname"    if ($uname =~ /^$match_username$/);
     } elsif ($activity eq 'docs') {      } elsif ($activity eq 'docs') {
Line 5509  END_MYBLOCK Line 5781  END_MYBLOCK
         $text = &mt('Checking Critical Messages Blocked');          $text = &mt('Checking Critical Messages Blocked');
     } elsif ($activity eq 'reinit') {      } elsif ($activity eq 'reinit') {
         $text = &mt('Checking Course Update Blocked');          $text = &mt('Checking Course Update Blocked');
       } elsif ($activity eq 'about') {
           $text = &mt('Access to User Information Pages Blocked');
       } elsif ($activity eq 'wishlist') {
           $text = &mt('Access to Stored Links Blocked');
       } elsif ($activity eq 'annotate') {
           $text = &mt('Access to Annotations Blocked');
     }      }
     $output .= <<"END_BLOCK";      $output .= <<"END_BLOCK";
 <div class='$class'>  <div class='$class'>
Line 5537  sub check_ip_acc { Line 5815  sub check_ip_acc {
         ($ENV{'REMOTE_ADDR'} eq &Apache::lonnet::get_host_ip($Apache::lonnet::perlvar{'lonHostID'}))) {          ($ENV{'REMOTE_ADDR'} eq &Apache::lonnet::get_host_ip($Apache::lonnet::perlvar{'lonHostID'}))) {
         $ip = $env{'request.host'} || $ENV{'REMOTE_ADDR'} || $clientip;          $ip = $env{'request.host'} || $ENV{'REMOTE_ADDR'} || $clientip;
     } else {      } else {
         $ip = $ENV{'REMOTE_ADDR'} || $env{'request.host'} || $clientip;          my $remote_ip = &Apache::lonnet::get_requestor_ip();
           $ip = $remote_ip || $env{'request.host'} || $clientip;
     }      }
   
     my $name;      my $name;
Line 5689  sub get_domainconf { Line 5968  sub get_domainconf {
                                     }                                      }
                                 }                                  }
                             }                              }
                           } elsif ($key eq 'saml') {
                               if (ref($domconfig{'login'}{$key}) eq 'HASH') {
                                   foreach my $host (keys(%{$domconfig{'login'}{$key}})) {
                                       if (ref($domconfig{'login'}{$key}{$host}) eq 'HASH') {
                                           $designhash{$udom.'.login.'.$key.'_'.$host} = 1;
                                           foreach my $item ('text','img','alt','url','title','notsso') {
                                               $designhash{$udom.'.login.'.$key.'_'.$item.'_'.$host} = $domconfig{'login'}{$key}{$host}{$item};
                                           }
                                       }
                                   }
                               }
                         } else {                          } else {
                             foreach my $img (keys(%{$domconfig{'login'}{$key}})) {                              foreach my $img (keys(%{$domconfig{'login'}{$key}})) {
                                 $designhash{$udom.'.login.'.$key.'_'.$img} =                                   $designhash{$udom.'.login.'.$key.'_'.$img} = 
Line 5793  sub domainlogo { Line 6083  sub domainlogo {
  &Apache::lonnet::repcopy($local_name);   &Apache::lonnet::repcopy($local_name);
     }      }
    $imgsrc = &lonhttpdurl($imgsrc);     $imgsrc = &lonhttpdurl($imgsrc);
         }           }
         return '<img src="'.$imgsrc.'" alt="'.$domain.'" />';          my $alttext = $domain;
           if ($designhash{$domain.'.login.alttext_domlogo'} ne '') {
               $alttext = $designhash{$domain.'.login.alttext_domlogo'};
           }
           return '<img src="'.$imgsrc.'" alt="'.$alttext.'" id="lclogindomlogo" />';
     } elsif (defined(&Apache::lonnet::domain($domain,'description'))) {      } elsif (defined(&Apache::lonnet::domain($domain,'description'))) {
         return &Apache::lonnet::domain($domain,'description');          return &Apache::lonnet::domain($domain,'description');
     } else {      } else {
Line 6059  other decorations will be returned. Line 6353  other decorations will be returned.
   
 sub bodytag {  sub bodytag {
     my ($title,$function,$addentries,$bodyonly,$domain,$forcereg,      my ($title,$function,$addentries,$bodyonly,$domain,$forcereg,
         $no_nav_bar,$bgcolor,$args,$advtoolsref,$ltiscope,$ltiuri,$ltimenu)=@_;          $no_nav_bar,$bgcolor,$args,$advtoolsref,$ltiscope,$ltiuri,
           $ltimenu,$menucoll,$menuref)=@_;
   
     my $public;      my $public;
     if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public'))      if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public'))
Line 6088  sub bodytag { Line 6383  sub bodytag {
     if ($realm) {      if ($realm) {
         $realm = '/'.$realm;          $realm = '/'.$realm;
     }      }
     if ($role  eq 'ca') {      if ($role eq 'ca') {
         my ($rdom,$rname) = ($realm =~ m{^/($match_domain)/($match_username)$});          my ($rdom,$rname) = ($realm =~ m{^/($match_domain)/($match_username)$});
         $realm = &plainname($rname,$rdom);          $realm = &plainname($rname,$rdom);
     }       } 
 # realm  # realm
       my ($cid,$sec);
     if ($env{'request.course.id'}) {      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/) {          if ($env{'request.role'} !~ /^cr/) {
             $role = &Apache::lonnet::plaintext($role,&course_type());              $role = &Apache::lonnet::plaintext($role,&course_type());
         } elsif ($role =~ m{^cr/($match_domain)/\1-domainconfig/(\w+)$}) {          } elsif ($role =~ m{^cr/($match_domain)/\1-domainconfig/(\w+)$}) {
Line 6105  sub bodytag { Line 6412  sub bodytag {
         } else {          } else {
             $role = (split(/\//,$role,4))[-1];               $role = (split(/\//,$role,4))[-1]; 
         }          }
         if ($env{'request.course.sec'}) {          if ($sec) {
             $role .= ('&nbsp;'x2).'-&nbsp;'.&mt('section:').'&nbsp;'.$env{'request.course.sec'};              $role .= ('&nbsp;'x2).'-&nbsp;'.&mt('section:').'&nbsp;'.$sec;
         }             }   
  $realm = $env{'course.'.$env{'request.course.id'}.'.description'};   $realm = $env{'course.'.$cid.'.description'};
     } else {      } else {
         $role = &Apache::lonnet::plaintext($role);          $role = &Apache::lonnet::plaintext($role);
     }      }
Line 6131  sub bodytag { Line 6438  sub bodytag {
  undef($role);   undef($role);
     }      }
   
     if (($env{'request.course.id'}) && ($env{'request.lti.login'})) {      my $showcrstitle = 1;
       if (($cid) && ($env{'request.lti.login'})) {
         if (ref($ltimenu) eq 'HASH') {          if (ref($ltimenu) eq 'HASH') {
             unless ($ltimenu->{'role'}) {              unless ($ltimenu->{'role'}) {
                 undef($role);                  undef($role);
             }              }
             unless ($ltimenu->{'coursetitle'}) {              unless ($ltimenu->{'coursetitle'}) {
                 $realm='&nbsp;';                  $realm='&nbsp;';
                   $showcrstitle = 0;
               }
           }
       } elsif (($cid) && ($menucoll)) {
           if (ref($menuref) eq 'HASH') {
               unless ($menuref->{'role'}) {
                   undef($role);
               }
               unless ($menuref->{'crs'}) {
                   $realm='&nbsp;';
                   $showcrstitle = 0;
             }              }
         }          }
     }      }
Line 6146  sub bodytag { Line 6465  sub bodytag {
     #      #
     # Extra info if you are the DC      # Extra info if you are the DC
     my $dc_info = '';      my $dc_info = '';
     if ($env{'user.adv'} && exists($env{'user.role.dc./'.      if (($env{'user.adv'}) && ($env{'request.course.id'}) && $showcrstitle &&
                         $env{'course.'.$env{'request.course.id'}.          (exists($env{'user.role.dc./'.$env{'course.'.$cid.'.domain'}.'/'}))) {
                                  '.domain'}.'/'})) {  
         my $cid = $env{'request.course.id'};  
         $dc_info = $cid.' '.$env{'course.'.$cid.'.internal.coursecode'};          $dc_info = $cid.' '.$env{'course.'.$cid.'.internal.coursecode'};
         $dc_info =~ s/\s+$//;          $dc_info =~ s/\s+$//;
     }      }
   
     my $crstype;      my $crstype;
     if ($env{'request.course.id'}) {      if ($cid) {
         $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};          $crstype = $env{'course.'.$cid.'.type'};
     } elsif ($args->{'crstype'}) {      } elsif ($args->{'crstype'}) {
         $crstype = $args->{'crstype'};          $crstype = $args->{'crstype'};
     }      }
Line 6176  sub bodytag { Line 6493  sub bodytag {
             Apache::lonmenu::utilityfunctions($httphost), 'start');              Apache::lonmenu::utilityfunctions($httphost), 'start');
   
         unless ($args->{'no_primary_menu'}) {          unless ($args->{'no_primary_menu'}) {
             my ($left,$right) = Apache::lonmenu::primary_menu($crstype,$ltimenu);              my ($left,$right) = Apache::lonmenu::primary_menu($crstype,$ltimenu,$menucoll,$menuref,
                                                                 $args->{'links_disabled'});
   
             if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) {              if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) {
                 if ($dc_info) {                  if ($dc_info) {
Line 6207  sub bodytag { Line 6525  sub bodytag {
         if (!$public){          if (!$public){
             unless ($args->{'no_inline_menu'}) {              unless ($args->{'no_inline_menu'}) {
                 $bodytag .= Apache::lonmenu::secondary_menu($httphost,$ltiscope,$ltimenu,                  $bodytag .= Apache::lonmenu::secondary_menu($httphost,$ltiscope,$ltimenu,
                                                             $args->{'no_primary_menu'});                                                              $args->{'no_primary_menu'},
                                                               $menucoll,$menuref,
                                                               $args->{'links_disabled'});
             }              }
             $bodytag .= Apache::lonmenu::serverform();              $bodytag .= Apache::lonmenu::serverform();
             $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end');              $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end');
Line 8284  ul.LC_funclist li { Line 8604  ul.LC_funclist li {
  cursor:pointer;   cursor:pointer;
 }  }
   
   .LCisDisabled {
     cursor: not-allowed;
     opacity: 0.5;
   }
   
   a[aria-disabled="true"] {
     color: currentColor;
     display: inline-block;  /* For IE11/ MS Edge bug */
     pointer-events: none;
     text-decoration: none;
   }
   
 pre.LC_wordwrap {  pre.LC_wordwrap {
   white-space: pre-wrap;    white-space: pre-wrap;
   white-space: -moz-pre-wrap;    white-space: -moz-pre-wrap;
Line 8543  ADDMETA Line 8875  ADDMETA
                 unless (&Apache::lonnet::allowed('mau',$dom_in_use)) {                  unless (&Apache::lonnet::allowed('mau',$dom_in_use)) {
                     my %domdefs = &Apache::lonnet::get_domain_defaults($dom_in_use);                      my %domdefs = &Apache::lonnet::get_domain_defaults($dom_in_use);
                     my $lonhost = $Apache::lonnet::perlvar{'lonHostID'};                      my $lonhost = $Apache::lonnet::perlvar{'lonHostID'};
                     my $offload;                      my ($offload,$offloadoth);
                     if (ref($domdefs{'offloadnow'}) eq 'HASH') {                      if (ref($domdefs{'offloadnow'}) eq 'HASH') {
                         if ($domdefs{'offloadnow'}{$lonhost}) {                          if ($domdefs{'offloadnow'}{$lonhost}) {
                             $offload = 1;                              $offload = 1;
                               if (($env{'user.domain'} ne '') && ($env{'user.domain'} ne $dom_in_use) &&
                                   (!(($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public')))) {
                                   unless (&Apache::lonnet::shared_institution($env{'user.domain'})) {
                                       $offloadoth = 1;
                                       $dom_in_use = $env{'user.domain'};
                                   }
                               }
                         }                          }
                     }                      }
                     unless ($offload) {                      unless ($offload) {
Line 8556  ADDMETA Line 8895  ADDMETA
                                     (!(($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public')))) {                                      (!(($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public')))) {
                                     unless (&Apache::lonnet::shared_institution($env{'user.domain'})) {                                      unless (&Apache::lonnet::shared_institution($env{'user.domain'})) {
                                         $offload = 1;                                          $offload = 1;
                                           $offloadoth = 1;
                                         $dom_in_use = $env{'user.domain'};                                          $dom_in_use = $env{'user.domain'};
                                     }                                      }
                                 }                                  }
Line 8563  ADDMETA Line 8903  ADDMETA
                         }                          }
                     }                      }
                     if ($offload) {                      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))) { 
                                   ($newserver) = &Apache::lonnet::choose_server($dom_in_use);
                               }
                           }
                         if (($newserver) && ($newserver ne $lonhost)) {                          if (($newserver) && ($newserver ne $lonhost)) {
                             my $numsec = 5;                              my $numsec = 5;
                             my $timeout = $numsec * 1000;                              my $timeout = $numsec * 1000;
Line 8577  ADDMETA Line 8923  ADDMETA
                             }                              }
                             if ($locknum) {                              if ($locknum) {
                                 my @lockinfo = sort(values(%locks));                                  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";                                         join(", ",sort(values(%locks)))."\n";
                                 if (&show_course()) {                                  if (&show_course()) {
                                     $msg .= &mt('your session will be transferred to a different server, after you click "Courses".');                                      $msg .= &mt('your session will be transferred to a different server, after you click "Courses".');
Line 8739  sub print_suppression { Line 9085  sub print_suppression {
         }          }
         my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};          my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
         my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};          my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
         my $blocked = &blocking_status('printout',$cnum,$cdom,undef,1);          my $clientip = &Apache::lonnet::get_requestor_ip();
           my $blocked = &blocking_status('printout',$clientip,$cnum,$cdom,undef,1);
         if ($blocked) {          if ($blocked) {
             my $checkrole = "cm./$cdom/$cnum";              my $checkrole = "cm./$cdom/$cnum";
             if ($env{'request.course.sec'} ne '') {              if ($env{'request.course.sec'} ne '') {
Line 8858  $args - additional optional args support Line 9205  $args - additional optional args support
                                will contain https://<hostname> if server uses                                 will contain https://<hostname> if server uses
                                https (as per hosts.tab), but request is for http                                 https (as per hosts.tab), but request is for http
              hostname       -> hostname, originally from $r->hostname(), (optional).               hostname       -> hostname, originally from $r->hostname(), (optional).
                links_disabled -> Links in primary and secondary menus are disabled
                                  (Can enable them once page has loaded - see lonroles.pm
                                  for an example).
   
 =back  =back
   
Line 8870  sub start_page { Line 9220  sub start_page {
     #&Apache::lonnet::logthis("start_page ".join(':',caller(0)));      #&Apache::lonnet::logthis("start_page ".join(':',caller(0)));
   
     $env{'internal.start_page'}++;      $env{'internal.start_page'}++;
     my ($result,@advtools,$ltiscope,$ltiuri,%ltimenu);      my ($result,@advtools,$ltiscope,$ltiuri,%ltimenu,$menucoll,%menu);
   
     if (! exists($args->{'skip_phases'}{'head'}) ) {      if (! exists($args->{'skip_phases'}{'head'}) ) {
         $result .= &xml_begin($args->{'frameset'}) . &headtag($title, $head_extra, $args);          $result .= &xml_begin($args->{'frameset'}) . &headtag($title, $head_extra, $args);
Line 8905  sub start_page { Line 9255  sub start_page {
         ($ltiscope,$ltiuri) = &LONCAPA::ltiutils::lti_provider_scope($env{'request.lti.uri'},          ($ltiscope,$ltiuri) = &LONCAPA::ltiutils::lti_provider_scope($env{'request.lti.uri'},
                                   $env{'course.'.$env{'request.course.id'}.'.domain'},                                    $env{'course.'.$env{'request.course.id'}.'.domain'},
                                   $env{'course.'.$env{'request.course.id'}.'.num'});                                    $env{'course.'.$env{'request.course.id'}.'.num'});
       } elsif ($env{'request.course.id'}) {
           my $expiretime=600;
           if ((time-$env{'course.'.$env{'request.course.id'}.'.last_cache'}) > $expiretime) {
               &Apache::lonnet::coursedescription($env{'request.course.id'},{'freshen_cache' => 1});
           }
           my ($deeplinkmenu,$menuref);
           ($menucoll,$deeplinkmenu,$menuref) = &menucoll_in_effect();
           if ($menucoll) {
               if (ref($menuref) eq 'HASH') {
                   %menu = %{$menuref};
               }
               if ($menu{'top'} eq 'n') {
                   $args->{'no_primary_menu'} = 1;
               }
               if ($menu{'inline'} eq 'n') {
                   unless (&Apache::lonnet::allowed('opa')) {
                       my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                       my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                       my $crstype = &course_type();
                       my $now = time;
                       my $ccrole;
                       if ($crstype eq 'Community') {
                           $ccrole = 'co';
                       } else {
                           $ccrole = 'cc';
                       }
                       if ($env{'user.role.'.$ccrole.'./'.$cdom.'/'.$cnum}) {
                           my ($start,$end) = split(/\./,$env{'user.role.'.$ccrole.'./'.$cdom.'/'.$cnum});
                           if ((($start) && ($start<0)) ||
                               (($end) && ($end<$now))  ||
                               (($start) && ($now<$start))) {
                               $args->{'no_inline_menu'} = 1;
                           }
                       } else {
                           $args->{'no_inline_menu'} = 1;
                       }
                   }
               }
           }
     }      }
       
     if (! exists($args->{'skip_phases'}{'body'}) ) {      if (! exists($args->{'skip_phases'}{'body'}) ) {
  if ($args->{'frameset'}) {   if ($args->{'frameset'}) {
     my $attr_string = &make_attr_string($args->{'force_register'},      my $attr_string = &make_attr_string($args->{'force_register'},
Line 8919  sub start_page { Line 9308  sub start_page {
                          $args->{'only_body'},      $args->{'domain'},                           $args->{'only_body'},      $args->{'domain'},
                          $args->{'force_register'}, $args->{'no_nav_bar'},                           $args->{'force_register'}, $args->{'no_nav_bar'},
                          $args->{'bgcolor'},        $args,                           $args->{'bgcolor'},        $args,
                          \@advtools,$ltiscope,$ltiuri,\%ltimenu);                           \@advtools,$ltiscope,$ltiuri,\%ltimenu,$menucoll,\%menu);
         }          }
     }      }
   
Line 9005  sub end_page { Line 9394  sub end_page {
     return $result;      return $result;
 }  }
   
   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'}) {
               my ($deeplink_symb,$deeplink,$check_login_symb);
               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 {
                           $check_login_symb = 1;
                       }
                   } else {
                       my $symb = &Apache::lonnet::symbread();
                       if ($symb) {
                           $deeplink = &Apache::lonnet::EXT('resource.0.deeplink',$symb);
                       } else {
                           $check_login_symb = 1;
                       }
                   }
               } else {
                   $check_login_symb = 1;
               }
               if ($check_login_symb) {
                   $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 ($state,$others,$listed,$scope,$protect,$display) = split(/,/,$deeplink);
                   if ($display =~ /^\d+$/) {
                       $deeplinkmenu = 1;
                       $menucoll = $display;
                   }
               }
           }
           if ($menucoll) {
               %menu = &page_menu($env{'course.'.$env{'request.course.id'}.'.menucollections'},$menucoll);
           }
       }
       return ($menucoll,$deeplinkmenu,\%menu);
   }
   
   sub deeplink_login_symb {
       my ($cnum,$cdom) = @_;
       my $login_symb;
       if ($env{'request.deeplink.login'}) {
           $login_symb = &symb_from_tinyurl($env{'request.deeplink.login'},$cnum,$cdom);
       }
       return $login_symb;
   }
   
   sub symb_from_tinyurl {
       my ($url,$cnum,$cdom) = @_;
       if ($url =~ 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,$symb) = split(/\&/,$tinyurl);
               if (wantarray) {
                   return ($cnumreq,$symb);
               } elsif ($cnumreq eq $cnum) {
                   return $symb;
               }
           }
       }
       if (wantarray) {
           return ();
       } else {
           return;
       }
   }
   
 sub wishlist_window {  sub wishlist_window {
     return(<<'ENDWISHLIST');      return(<<'ENDWISHLIST');
 <script type="text/javascript">  <script type="text/javascript">
Line 9094  ENDLINK Line 9580  ENDLINK
 }  }
   
 sub modal_adhoc_script {  sub modal_adhoc_script {
     my ($funcname,$width,$height,$content)=@_;      my ($funcname,$width,$height,$content,$possmathjax)=@_;
       my $mathjax;
       if ($possmathjax) {
           $mathjax = <<'ENDJAX';
                  if (typeof MathJax == 'object') {
                      MathJax.Hub.Queue(["Typeset",MathJax.Hub]);
                  }
   ENDJAX
       }
     return (<<ENDADHOC);      return (<<ENDADHOC);
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
Line 9105  sub modal_adhoc_script { Line 9599  sub modal_adhoc_script {
                 modalWindow.height = $height;                  modalWindow.height = $height;
                 modalWindow.content = '$content';                  modalWindow.content = '$content';
                 modalWindow.open();                  modalWindow.open();
                   $mathjax
         };            };  
 // ]]>  // ]]>
 </script>  </script>
Line 9112  ENDADHOC Line 9607  ENDADHOC
 }  }
   
 sub modal_adhoc_inner {  sub modal_adhoc_inner {
     my ($funcname,$width,$height,$content)=@_;      my ($funcname,$width,$height,$content,$possmathjax)=@_;
     my $innerwidth=$width-20;      my $innerwidth=$width-20;
     $content=&js_ready(      $content=&js_ready(
                  &start_page('Dialog',undef,{'only_body'=>1,'bgcolor'=>'#FFFFFF'}).                   &start_page('Dialog',undef,{'only_body'=>1,'bgcolor'=>'#FFFFFF'}).
Line 9121  sub modal_adhoc_inner { Line 9616  sub modal_adhoc_inner {
                  &end_scrollbox().                   &end_scrollbox().
                  &end_page()                   &end_page()
              );               );
     return &modal_adhoc_script($funcname,$width,$height,$content);      return &modal_adhoc_script($funcname,$width,$height,$content,$possmathjax);
 }  }
   
 sub modal_adhoc_window {  sub modal_adhoc_window {
     my ($funcname,$width,$height,$content,$linktext)=@_;      my ($funcname,$width,$height,$content,$linktext,$possmathjax)=@_;
     return &modal_adhoc_inner($funcname,$width,$height,$content).      return &modal_adhoc_inner($funcname,$width,$height,$content,$possmathjax).
            "<a href=\"javascript:$funcname();void(0);\">".$linktext."</a>";             "<a href=\"javascript:$funcname();void(0);\">".$linktext."</a>";
 }  }
   
Line 11001  sub sorted_inst_types { Line 11496  sub sorted_inst_types {
 }  }
   
 sub get_institutional_codes {  sub get_institutional_codes {
     my ($settings,$allcourses,$LC_code) = @_;      my ($cdom,$crs,$settings,$allcourses,$LC_code) = @_;
 # Get complete list of course sections to update  # Get complete list of course sections to update
     my @currsections = ();      my @currsections = ();
     my @currxlists = ();      my @currxlists = ();
       my (%unclutteredsec,%unclutteredlcsec);
     my $coursecode = $$settings{'internal.coursecode'};      my $coursecode = $$settings{'internal.coursecode'};
       my $crskey = $crs.':'.$coursecode;
       @{$unclutteredsec{$crskey}} = ();
       @{$unclutteredlcsec{$crskey}} = ();
   
     if ($$settings{'internal.sectionnums'} ne '') {      if ($$settings{'internal.sectionnums'} ne '') {
         @currsections = split(/,/,$$settings{'internal.sectionnums'});          @currsections = split(/,/,$$settings{'internal.sectionnums'});
Line 11016  sub get_institutional_codes { Line 11515  sub get_institutional_codes {
     }      }
   
     if (@currxlists > 0) {      if (@currxlists > 0) {
         foreach (@currxlists) {          foreach my $xl (@currxlists) {
             if (m/^([^:]+):(\w*)$/) {              if ($xl =~ /^([^:]+):(\w*)$/) {
                 unless (grep/^$1$/,@{$allcourses}) {                  unless (grep/^$1$/,@{$allcourses}) {
                     push(@{$allcourses},$1);                      push(@{$allcourses},$1);
                     $$LC_code{$1} = $2;                      $$LC_code{$1} = $2;
Line 11025  sub get_institutional_codes { Line 11524  sub get_institutional_codes {
             }              }
         }          }
     }      }
    
     if (@currsections > 0) {      if (@currsections > 0) {
         foreach (@currsections) {          foreach my $sec (@currsections) {
             if (m/^(\w+):(\w*)$/) {              if ($sec =~ m/^(\w+):(\w*)$/ ) {
                 my $sec = $coursecode.$1;                  my $instsec = $1;
                 my $lc_sec = $2;                  my $lc_sec = $2;
                 unless (grep/^$sec$/,@{$allcourses}) {                  unless (grep/^\Q$instsec\E$/,@{$unclutteredsec{$crskey}}) {
                       push(@{$unclutteredsec{$crskey}},$instsec);
                       push(@{$unclutteredlcsec{$crskey}},$lc_sec);
                   }
               }
           }
       }
   
       if (@{$unclutteredsec{$crskey}} > 0) {
           my %formattedsec = &Apache::lonnet::auto_instsec_reformat($cdom,'clutter',\%unclutteredsec);
           if ((ref($formattedsec{$crskey}) eq 'ARRAY') && (ref($unclutteredlcsec{$crskey}) eq 'ARRAY')) {
               for (my $i=0; $i<@{$formattedsec{$crskey}}; $i++) {
                   my $sec = $coursecode.$formattedsec{$crskey}[$i];
                   unless (grep/^\Q$sec\E$/,@{$allcourses}) {
                     push(@{$allcourses},$sec);                      push(@{$allcourses},$sec);
                     $$LC_code{$sec} = $lc_sec;                      $$LC_code{$sec} = $unclutteredlcsec{$crskey}[$i];
                 }                  }
             }              }
         }          }
Line 16153  sub construct_course { Line 16665  sub construct_course {
                    'plc.users.denied',                     'plc.users.denied',
                    'hidefromcat',                     'hidefromcat',
                    'checkforpriv',                     'checkforpriv',
                    'categories',                     'categories'],
                    'internal.uniquecode'],  
                    $$crsudom,$$crsunum);                     $$crsudom,$$crsunum);
         if ($args->{'textbook'}) {          if ($args->{'textbook'}) {
             $cenv{'internal.textbook'} = $args->{'textbook'};              $cenv{'internal.textbook'} = $args->{'textbook'};
Line 16169  sub construct_course { Line 16680  sub construct_course {
     if ($args->{'crstype'}) {      if ($args->{'crstype'}) {
         $cenv{'type'}=$args->{'crstype'};          $cenv{'type'}=$args->{'crstype'};
     }      }
       if ($args->{'lti'}) {
           $cenv{'internal.lti'}=$args->{'lti'};
       }
     if ($args->{'crsid'}) {      if ($args->{'crsid'}) {
         $cenv{'courseid'}=$args->{'crsid'};          $cenv{'courseid'}=$args->{'crsid'};
     }      }
Line 16748  sub init_user_environment { Line 17262  sub init_user_environment {
 # --------------------------------------------------------- Write first profile  # --------------------------------------------------------- Write first profile
   
     {      {
           my $ip = &Apache::lonnet::get_requestor_ip($r);
  my %initial_env =    my %initial_env = 
     ("user.name"          => $username,      ("user.name"          => $username,
      "user.domain"        => $domain,       "user.domain"        => $domain,
Line 16766  sub init_user_environment { Line 17281  sub init_user_environment {
      "request.course.sec" => '',       "request.course.sec" => '',
      "request.role"       => 'cm',       "request.role"       => 'cm',
      "request.role.adv"   => $env{'user.adv'},       "request.role.adv"   => $env{'user.adv'},
      "request.host"       => $ENV{'REMOTE_ADDR'},);       "request.host"       => $ip,);
   
         if ($form->{'localpath'}) {          if ($form->{'localpath'}) {
     $initial_env{"browser.localpath"}  = $form->{'localpath'};      $initial_env{"browser.localpath"}  = $form->{'localpath'};
Line 17667  sub needs_coursereinit { Line 18182  sub needs_coursereinit {
     }      }
     if (($now-$env{'request.course.timechecked'})>$interval) {      if (($now-$env{'request.course.timechecked'})>$interval) {
         &Apache::lonnet::appenv({'request.course.timechecked'=>$now});          &Apache::lonnet::appenv({'request.course.timechecked'=>$now});
         my $blocked = &blocking_status('reinit',$cnum,$cdom,undef,1);          my $blocked = &blocking_status('reinit',undef,$cnum,$cdom,undef,1);
         if ($blocked) {          if ($blocked) {
             return ();              return ();
         }          }
Line 18039  sub create_captcha { Line 18554  sub create_captcha {
   
         if (-e $Apache::lonnet::perlvar{'lonCaptchaDir'}.'/'.$md5sum.'.png') {          if (-e $Apache::lonnet::perlvar{'lonCaptchaDir'}.'/'.$md5sum.'.png') {
             $output = '<input type="hidden" name="crypt" value="'.$md5sum.'" />'."\n".              $output = '<input type="hidden" name="crypt" value="'.$md5sum.'" />'."\n".
                         '<span class="LC_nobreak">'.
                       &mt('Type in the letters/numbers shown below').'&nbsp;'.                        &mt('Type in the letters/numbers shown below').'&nbsp;'.
                       '<input type="text" size="5" name="code" value="" autocomplete="off" />'.                        '<input type="text" size="5" name="code" value="" autocomplete="off" />'.
                       '<br />'.                        '</span><br />'.
                       '<img src="'.$captcha_params{'www_output_dir'}.'/'.$md5sum.'.png" alt="captcha" />';                        '<img src="'.$captcha_params{'www_output_dir'}.'/'.$md5sum.'.png" alt="captcha" />';
             last;              last;
         }          }
Line 18087  sub check_captcha { Line 18603  sub check_captcha {
 sub create_recaptcha {  sub create_recaptcha {
     my ($pubkey,$version) = @_;      my ($pubkey,$version) = @_;
     if ($version >= 2) {      if ($version >= 2) {
         return '<div class="g-recaptcha" data-sitekey="'.$pubkey.'"></div>';          return '<div class="g-recaptcha" data-sitekey="'.$pubkey.'"></div>'.
                  '<div style="padding:0;clear:both;margin:0;border:0"></div>';
     } else {      } else {
         my $use_ssl;          my $use_ssl;
         if ($ENV{'SERVER_PORT'} == 443) {          if ($ENV{'SERVER_PORT'} == 443) {
Line 18105  sub create_recaptcha { Line 18622  sub create_recaptcha {
 sub check_recaptcha {  sub check_recaptcha {
     my ($privkey,$version) = @_;      my ($privkey,$version) = @_;
     my $captcha_chk;      my $captcha_chk;
       my $ip = &Apache::lonnet::get_requestor_ip();
     if ($version >= 2) {      if ($version >= 2) {
         my %info = (          my %info = (
                      secret   => $privkey,                        secret   => $privkey, 
                      response => $env{'form.g-recaptcha-response'},                       response => $env{'form.g-recaptcha-response'},
                      remoteip => $ENV{'REMOTE_ADDR'},                       remoteip => $ip,
                    );                     );
         my $request=new HTTP::Request('POST','https://www.google.com/recaptcha/api/siteverify');          my $request=new HTTP::Request('POST','https://www.google.com/recaptcha/api/siteverify');
         $request->content(join('&',map {          $request->content(join('&',map {
Line 18132  sub check_recaptcha { Line 18650  sub check_recaptcha {
         my $captcha_result =          my $captcha_result =
             $captcha->check_answer(              $captcha->check_answer(
                                     $privkey,                                      $privkey,
                                     $ENV{'REMOTE_ADDR'},                                      $ip,
                                     $env{'form.recaptcha_challenge_field'},                                      $env{'form.recaptcha_challenge_field'},
                                     $env{'form.recaptcha_response_field'},                                      $env{'form.recaptcha_response_field'},
                                   );                                    );
Line 18184  sub cleanup_html { Line 18702  sub cleanup_html {
 # $context is the calling context -- roles, grades, contents, menu or flip.   # $context is the calling context -- roles, grades, contents, menu or flip. 
 sub critical_redirect {  sub critical_redirect {
     my ($interval,$context) = @_;      my ($interval,$context) = @_;
       unless (($env{'user.domain'} ne '') && ($env{'user.name'} ne '')) {
           return ();
       }
     if ((time-$env{'user.criticalcheck.time'})>$interval) {      if ((time-$env{'user.criticalcheck.time'})>$interval) {
         if (($env{'request.course.id'}) && (($context eq 'flip') || ($context eq 'contents'))) {          if (($env{'request.course.id'}) && (($context eq 'flip') || ($context eq 'contents'))) {
             my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};              my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
             my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};              my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
             my $blocked = &blocking_status('alert',$cnum,$cdom,undef,1);              my $blocked = &blocking_status('alert',undef,$cnum,$cdom,undef,1);
             if ($blocked) {              if ($blocked) {
                 my $checkrole = "cm./$cdom/$cnum";                  my $checkrole = "cm./$cdom/$cnum";
                 if ($env{'request.course.sec'} ne '') {                  if ($env{'request.course.sec'} ne '') {
Line 18205  sub critical_redirect { Line 18726  sub critical_redirect {
         &Apache::lonnet::appenv({'user.criticalcheck.time'=>time});          &Apache::lonnet::appenv({'user.criticalcheck.time'=>time});
         my $redirecturl;          my $redirecturl;
         if ($what[0]) {          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';          $redirecturl='/adm/email?critical=display';
         my $url=&Apache::lonnet::absolute_url().$redirecturl;          my $url=&Apache::lonnet::absolute_url().$redirecturl;
                 return (1, $url);                  return (1, $url);
Line 18567  sub is_nonframeable { Line 19088  sub is_nonframeable {
     return $uselink;      return $uselink;
 }  }
   
   sub page_menu {
       my ($menucolls,$menunum) = @_;
       my %menu;
       foreach my $item (split(/;/,$menucolls)) {
           my ($num,$value) = split(/\%/,$item);
           if ($num eq $menunum) {
               my @entries = split(/\&/,$value);
               foreach my $entry (@entries) {
                   my ($name,$fields) = split(/=/,$entry);
                   if (($name eq 'top') || ($name eq 'inline') || ($name eq 'foot') || ($name eq 'main')) {
                       $menu{$name} = $fields;
                   } else {
                       my @shown;
                       if ($fields =~ /,/) {
                           @shown = split(/,/,$fields);
                       } else {
                           @shown = ($fields);
                       }
                       if (@shown) {
                           foreach my $field (@shown) {
                               next if ($field eq '');
                               $menu{$field} = 1;
                           }
                       }
                   }
               }
           }
       }
       return %menu;
   }
   
 1;  1;
 __END__;  __END__;
   

Removed from v.1.1348  
changed lines
  Added in v.1.1376


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>