Diff for /rat/lonpageflip.pm between versions 1.80.8.12 and 1.80.8.13.2.2

version 1.80.8.12, 2021/03/04 01:33:43 version 1.80.8.13.2.2, 2022/01/05 00:54:45
Line 36  use LONCAPA; Line 36  use LONCAPA;
 use Apache::Constants qw(:common :http REDIRECT);  use Apache::Constants qw(:common :http REDIRECT);
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::loncommon();  use Apache::loncommon();
   use Apache::lonnavmaps();
 use Apache::lonuserstate;  use Apache::lonuserstate;
 use Apache::lonlocal;  use Apache::lonlocal;
 use HTML::TokeParser;  use HTML::TokeParser;
Line 98  sub hash_src { Line 99  sub hash_src {
 }  }
   
 sub move {  sub move {
     my ($next,$endupmap,$direction) = @_;      my ($next,$endupmap,$direction,$firstres) = @_;
     my $safecount=0;      my $safecount=0;
     my $allowed=0;      my $allowed=0;
       my $deeplinkonly=0;
       my $deeplinkchecked;
       my $deeplink_login_pc;
       my $prev=$next;
       my ($prevmapid)=split(/\./,$next);
     do {      do {
  ($next,$endupmap)=&get_next_possible_move($next,$endupmap,$direction);   ($next,$endupmap)=&get_next_possible_move($next,$endupmap,$direction);
   
Line 111  sub move { Line 117  sub move {
  if ($url eq '' || $symb eq '') {   if ($url eq '' || $symb eq '') {
     $allowed = 0;      $allowed = 0;
  } else {   } else {
     my $priv = &Apache::lonnet::allowed('bre',$url,$symb);              my $nodeeplinkcheck = 0;
     $allowed = (($priv eq 'F') || ($priv eq '2'));              if ($hash{'is_map_'.$next}) {
                   $nodeeplinkcheck = 1;
               }
               my $priv = &Apache::lonnet::allowed('bre',$url,$symb,'','','','',$nodeeplinkcheck);
               $allowed = (($priv eq 'F') || ($priv eq '2') || ($priv eq 'A'));
  }   }
           $deeplinkonly = 0;
           if ($hash{'deeplinkonly_'.$next}) {
               my ($value,$level) = map { &unescape($_); } split(/:/,$hash{'deeplinkonly_'.$next});
               my ($state,$others,$listed,$scope,$protect) = split(/,/,$value);
               unless (($state eq 'both') || ($hash{'is_map_'.$next})) {
                   if ($level eq 'resource') {
                       $deeplinkonly = 1;
                   } elsif ($level eq 'map') {
                       if ($scope eq 'rec') {
                           unless ($mapid == $prevmapid) {
                               unless ($deeplinkchecked) {
                                   $deeplink_login_pc = &get_deeplink_login_pc();
                                   $deeplinkchecked = 1;
                               }
                               if ($deeplink_login_pc) {
                                   my $poss_map_pc;
                                   if ($hash{'is_map_'.$next}) {
                                       $poss_map_pc = $hash{'map_pc_'.$url};
                                   } else {
                                       $poss_map_pc = $hash{'map_pc_'.$hash{'map_id_'.$mapid}};
                                   }
                                   unless ($deeplink_login_pc == $poss_map_pc) {
                                       unless (grep(/^$deeplink_login_pc$/,split(/,/,$hash{'map_hierarchy_'.$poss_map_pc}))) {
                                           $deeplinkonly = 1;
                                       }
                                   }
                               } else {
                                   $deeplinkonly = 1;
                               }
                           }
                       } elsif ($mapid != $prevmapid) {
                           $deeplinkonly = 1;
                       }
                   }
               }
           } elsif (($hash{'deeplinkonly_'.$prev}) && (!$firstres)) {
               my ($value,$level) = map { &unescape($_); } split(/:/,$hash{'deeplinkonly_'.$prev});
               my ($state,$others,$listed,$scope,$protect) = split(/,/,$value);
               unless (($state eq 'both') || ($hash{'is_map_'.$prev})) {
                   if ($level eq 'resource') {
                       $deeplinkonly = 1;
                   } elsif ($level eq 'map') {
                       if ($scope eq 'rec') {
                           unless ($mapid == $prevmapid) {
                               unless ($deeplinkchecked) {
                                   $deeplink_login_pc = &get_deeplink_login_pc();
                                   $deeplinkchecked = 1;
                               }
                               if ($deeplink_login_pc) {
                                   my $poss_map_pc;
                                   if ($hash{'is_map_'.$prev}) {
                                       $poss_map_pc = $hash{'map_pc_'.$url};
                                   } else {
                                       $poss_map_pc = $hash{'map_pc_'.$hash{'map_id_'.$mapid}};
                                   }
                                   unless ($deeplink_login_pc == $poss_map_pc) {
                                       unless (grep(/^$deeplink_login_pc$/,split(/,/,$hash{'map_hierarchy_'.$poss_map_pc}))) {
                                           $deeplinkonly = 1;
                                       }
                                   }
                               }
                           }
                       } else {
                           if ($mapid != $prevmapid) {
                               $deeplinkonly = 1;
                           }
                       }
                   }
               }
           }
  $safecount++;   $safecount++;
     } while (   ($next)      } while (   ($next)
      && ($next!~/\,/)       && ($next!~/\,/)
Line 121  sub move { Line 201  sub move {
     (!$hash{'src_'.$next})      (!$hash{'src_'.$next})
  || (   || (
         (!$env{'request.role.adv'})          (!$env{'request.role.adv'})
      &&  $hash{'randomout_'.$next}       && (($hash{'randomout_'.$next})
                        ||  ($deeplinkonly)
                        ||  ($hash{'deeplinkout_'.$next}))
     )      )
  || (!$allowed)   || (!$allowed)
  )   )
Line 156  sub get_next_possible_move { Line 238  sub get_next_possible_move {
           }            }
                           if ($thiscond>$mincond) { $mincond=$thiscond; }                            if ($thiscond>$mincond) { $mincond=$thiscond; }
               }                }
                   }                     }
   foreach my $id (split(/\,/,$posnext))  {    foreach my $id (split(/\,/,$posnext))  {
                       my ($linkid,$condval)=split(/\:/,$id);                        my ($linkid,$condval)=split(/\:/,$id);
                       if ($condval>=$mincond) {                        if ($condval>=$mincond) {
Line 198  sub get_next_possible_move { Line 280  sub get_next_possible_move {
  }   }
  if ($thiscond>$mincond) { $mincond=$thiscond; }   if ($thiscond>$mincond) { $mincond=$thiscond; }
      }       }
  }    }
  foreach my $id (split(/\,/,$posnext)) {   foreach my $id (split(/\,/,$posnext)) {
      my ($linkid,$condval)=split(/\:/,$id);       my ($linkid,$condval)=split(/\:/,$id);
      if ($condval>=$mincond) {       if ($condval>=$mincond) {
Line 231  sub first_accessible_resource { Line 313  sub first_accessible_resource {
     if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'.db',      if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'.db',
     &GDBM_READER(),0640)) {      &GDBM_READER(),0640)) {
  $furl=$hash{'first_url'};   $furl=$hash{'first_url'};
  my %args;   my (%args,$url,$argstr);
  my ($url,$args) = split(/\?/,$furl);   if ($furl =~ m{^/enc/}) {
  foreach my $pair (split(/\&/,$args)) {      ($url,$argstr) = split(/\?/,&Apache::lonenc::unencrypted($furl));
    } else {
       ($url,$argstr) = split(/\?/,$furl);
    }
    foreach my $pair (split(/\&/,$argstr)) {
     my ($name,$value) = split(/=/,$pair);      my ($name,$value) = split(/=/,$pair);
     $args{&unescape($name)} = &unescape($value);      $args{&unescape($name)} = &unescape($value);
  }   }
         if (!&Apache::lonnet::allowed('bre',$url,$args{'symb'})) {          my $priv = &Apache::lonnet::allowed('bre',$url,$args{'symb'});
           my $allowed = (($priv eq 'F') || ($priv eq '2') || ($priv eq 'A'));
           if (!$allowed) {
 # Wow, we cannot see this ... move forward to the next one that we can see  # Wow, we cannot see this ... move forward to the next one that we can see
     my ($newrid,$newmap)=&move($hash{'first_rid'},$hash{'first_mapurl'},'forward');      my ($newrid,$newmap)=&move($hash{'first_rid'},$hash{'first_mapurl'},'forward',1);
 # Build the new URL  # Build the new URL
     my ($newmapid,$newresid)=split(/\./,$newrid);              if ($newrid eq '') {
     my $symb=&Apache::lonnet::encode_symb($newmap,$newresid,$hash{'src_'.$newrid});                  $furl = '/adm/navmaps';
     $furl=&add_get_param($hash{'src_'.$newrid},{ 'symb' => $symb });              } else {
     if ($hash{'encrypted_'.$newrid}) {          my ($newmapid,$newresid)=split(/\./,$newrid);
  $furl=&Apache::lonenc::encrypted($furl);          my $symb=&Apache::lonnet::encode_symb($newmap,$newresid,$hash{'src_'.$newrid});
     }          $furl=&add_get_param($hash{'src_'.$newrid},{ 'symb' => $symb });
  }          if ($hash{'encrypted_'.$newrid}) {
       $furl=&Apache::lonenc::encrypted($furl);
                   }
               }
           }
  untie(%hash);   untie(%hash);
  return $furl;   return $furl;
     } else {      } else {
Line 256  sub first_accessible_resource { Line 348  sub first_accessible_resource {
 }  }
   
 sub check_http_req {  sub check_http_req {
     my ($srcref) = @_;      my ($srcref,$hostname) = @_;
     return unless (ref($srcref) eq 'SCALAR');      return unless (ref($srcref) eq 'SCALAR');
     my $usehttp;      my $usehttp;
     if ($env{'request.course.id'}) {      if ($env{'request.course.id'}) {
Line 265  sub check_http_req { Line 357  sub check_http_req {
         if (($$srcref =~ m{^\Q/public/$cdom/$cnum/syllabus\E($|\?)}) &&          if (($$srcref =~ m{^\Q/public/$cdom/$cnum/syllabus\E($|\?)}) &&
             ($ENV{'SERVER_PORT'} == 443) &&              ($ENV{'SERVER_PORT'} == 443) &&
             ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {              ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {
             unless (&Apache::lonnet::uses_sts()) {              unless ((&Apache::lonnet::uses_sts()) ||
                       (&Apache::lonnet::waf_allssl($hostname))) {
                 $$srcref .= (($$srcref =~/\?/)? '&':'?') . 'usehttp=1';                  $$srcref .= (($$srcref =~/\?/)? '&':'?') . 'usehttp=1';
                 $usehttp = 1;                  $usehttp = 1;
             }              }
         } elsif (($$srcref =~ m{^\Q/adm/wrapper/ext/\E(?!https:)}) &&          } elsif (($$srcref =~ m{^\Q/adm/wrapper/ext/\E(?!https:)}) &&
                  ($ENV{'SERVER_PORT'} == 443)) {                   ($ENV{'SERVER_PORT'} == 443)) {
             unless (&Apache::lonnet::uses_sts()) {              unless ((&Apache::lonnet::uses_sts()) ||
                       (&Apache::lonnet::waf_allssl($hostname))) {
                 my ($url,$anchor) = ($$srcref =~ /^([^\#]+)(?:|(\#[^\#]+))$/);                  my ($url,$anchor) = ($$srcref =~ /^([^\#]+)(?:|(\#[^\#]+))$/);
                 $$srcref = $url . (($$srcref =~/\?/)? '&':'?') . 'usehttp=1' .$anchor;                  $$srcref = $url . (($$srcref =~/\?/)? '&':'?') . 'usehttp=1' .$anchor;
                 $usehttp = 1;                  $usehttp = 1;
Line 303  setTimeout(function() { Line 397  setTimeout(function() {
 END  END
 }  }
   
   sub get_deeplink_login_pc {
       my $deeplink_login_pc;
       if (($env{'request.deeplink.login'}) && ($env{'request.course.id'})) {
           my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           my $deeplink_symb = &Apache::loncommon::deeplink_login_symb($cnum,$cdom);
           if ($deeplink_symb) {
               my $loginmap;
               if ($deeplink_symb =~ /\.(page|sequence)$/) {
                   $loginmap = &Apache::lonnet::clutter((&Apache::lonnet::decode_symb($deeplink_symb))[2]);
               } else {
                   $loginmap = &Apache::lonnet::clutter((&Apache::lonnet::decode_symb($deeplink_symb))[0]);
               }
               $deeplink_login_pc = $hash{'map_pc_'.$loginmap};
           }
       }
       return $deeplink_login_pc;
   }
   
 # ================================================================ Main Handler  # ================================================================ Main Handler
   
 sub handler {  sub handler {
Line 319  sub handler { Line 432  sub handler {
   my %cachehash=();     my %cachehash=(); 
   my $multichoice=0;    my $multichoice=0;
   my %multichoicehash=();    my %multichoicehash=();
   my %prog_state=();     my %prog_state=();
   my ($redirecturl,$redirectsymb,$enc,$anchor);    my ($redirecturl,$redirectsymb,$enc,$anchor,$deeplinklevel);
   my $next='';    my $next='';
   my $hostname = $r->hostname();    my $hostname = $r->hostname();
   my @possibilities=();    my @possibilities=();
Line 391  sub handler { Line 504  sub handler {
       }        }
       if ($direction eq 'firstres') {        if ($direction eq 'firstres') {
   my $furl=&first_accessible_resource();    my $furl=&first_accessible_resource();
           my $usehttp = &check_http_req(\$furl);            my $usehttp = &check_http_req(\$furl,$hostname);
           if (($usehttp) && ($hostname ne '')) {            if (($usehttp) && ($hostname ne '')) {
               $furl='http://'.$hostname.$furl;                $furl='http://'.$hostname.$furl;
           } else {            } else {
Line 417  sub handler { Line 530  sub handler {
     $id=$hash{'map_pc_'.&Apache::lonnet::clutter($murl)}.'.'.$id;      $id=$hash{'map_pc_'.&Apache::lonnet::clutter($murl)}.'.'.$id;
     $newloc=$hash{'src_'.$id};      $newloc=$hash{'src_'.$id};
     if ($newloc) {      if ($newloc) {
                 $usehttp = &check_http_req(\$newloc);                  $usehttp = &check_http_req(\$newloc,$hostname);
                 if ($hash{'encrypted_'.$id}) {                  if ($hash{'encrypted_'.$id}) {
                     $newloc=&Apache::lonenc::encrypted($newloc);                      $newloc=&Apache::lonenc::encrypted($newloc);
                 }                  }
Line 533  sub handler { Line 646  sub handler {
       } else {        } else {
 # -------------------------------------------------------------- No place to go  # -------------------------------------------------------------- No place to go
                   $multichoice=-1;                    $multichoice=-1;
                     if ($position && $env{'request.deeplink.login'}) {
                         my ($map,$resid,$url) = &Apache::lonnet::decode_symb($position);
                         my $mapid = $hash{'map_pc_'.&Apache::lonnet::clutter($map)};
                         my $position_deeplink = $hash{'deeplinkonly_'.$mapid.'.'.$resid};
                         if ($position_deeplink) {
                             (my $value,$deeplinklevel) = map { &unescape($_); }
                                                          split(/:/,$position_deeplink);
                         }
                     }
               }                }
 # ----------------- The program must come past this point to untie the big hash  # ----------------- The program must come past this point to untie the big hash
       untie(%hash);        untie(%hash);
Line 554  sub handler { Line 676  sub handler {
                      &Apache::lonnet::linklog($redirecturl,$currenturl);                       &Apache::lonnet::linklog($redirecturl,$currenturl);
   }    }
 # ------------------------------------- Check for and display critical messages  # ------------------------------------- Check for and display critical messages
                   my ($redirect, $url) = &Apache::loncommon::critical_redirect(300);                    my ($redirect, $url) = &Apache::loncommon::critical_redirect(300,'flip');
                   unless ($redirect) {                    unless ($redirect) {
                       my $usehttp = &check_http_req(\$redirecturl);                        my $usehttp = &check_http_req(\$redirecturl,$hostname);
                       if (($usehttp) && ($hostname ne '')) {                        if (($usehttp) && ($hostname ne '')) {
                           $url='http://'.$hostname.$redirecturl;                            $url='http://'.$hostname.$redirecturl;
                       } else {                        } else {
Line 587  sub handler { Line 709  sub handler {
                   &Apache::loncommon::content_type($r,'text/html');                    &Apache::loncommon::content_type($r,'text/html');
                   $r->send_http_header;                    $r->send_http_header;
   my %lt=&Apache::lonlocal::texthash('title' => 'End of Sequence',    my %lt=&Apache::lonlocal::texthash('title' => 'End of Sequence',
                                                        'deeplink' => 'No link available',
                                                        'deeplinkres' =>
                                                        'Navigation to other content is unavailable when accessing content via deep-linking',
                                                        'deeplinkmap' =>
                                                        'You have reached the end of the sequence of available materials for access via deep-linking',
      'explain' =>       'explain' =>
      'You have reached the end of the sequence of materials.',       'You have reached the end of the sequence of materials.',
      'back' => 'Go Back',       'back' => 'Go Back',
Line 617  $lt{'pick'}: Line 744  $lt{'pick'}:
 ENDSTART  ENDSTART
                      foreach my $id (@possibilities) {                       foreach my $id (@possibilities) {
                         my $src = $multichoicehash{'src_'.$id};                          my $src = $multichoicehash{'src_'.$id};
                         my $usehttp = &check_http_req(\$src);                          my $usehttp = &check_http_req(\$src,$hostname);
                         if (($usehttp) && ($hostname ne '')) {                          if (($usehttp) && ($hostname ne '')) {
                             $src = 'http://'.$hostname.$src;                              $src = 'http://'.$hostname.$src;
                         }                          }
Line 646  ENDSTART Line 773  ENDSTART
                                   .$lt{'gonav'}.'</p>');                                    .$lt{'gonav'}.'</p>');
                       } else {                        } else {
                           $r->print(                            $r->print(
                               &Apache::loncommon::start_page('No Resource')                                &Apache::loncommon::start_page('No Resource'));
                              .'<h2>'.$lt{'title'}.'</h2>'                            if ($deeplinklevel eq 'resource') {
                              .'<p>'.$lt{'explain'}.'</p>');                                $r->print('<h2>'.$lt{'deeplink'}.'</h2>'
                                          .'<p>'.$lt{'deeplinkres'}.'</p>');
                             } elsif ($deeplinklevel eq 'map') {
                                 $r->print('<h2>'.$lt{'title'}.'</h2>'
                                          .'<p>'.$lt{'deeplinkmap'}.'</p>');
                             } else {
                                 $r->print('<h2>'.$lt{'title'}.'</h2>'
                                          .'<p>'.$lt{'explain'}.'</p>');
                             }
                       }                        }
   }    }
                   if ((!@possibilities) && ($reinitcheck))  {                    if ($deeplinklevel) {
                         $r->print(
                             &Apache::lonhtmlcommon::actionbox(
                                 ['<a href="/adm/flip?postdata=return:">'.$lt{'back'}.'</a>']));
                     } elsif ((!@possibilities) && ($reinitcheck))  {
                       $r->print(                        $r->print(
                           &Apache::lonhtmlcommon::actionbox(                            &Apache::lonhtmlcommon::actionbox(
                               ['<a href="/adm/navmaps">'.$lt{'nav'}.'</a></li>'                                ['<a href="/adm/navmaps">'.$lt{'nav'}.'</a></li>'

Removed from v.1.80.8.12  
changed lines
  Added in v.1.80.8.13.2.2


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