Diff for /rat/lonpageflip.pm between versions 1.101 and 1.109

version 1.101, 2018/12/30 19:47:06 version 1.109, 2021/08/09 18:51:04
Line 99  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 $deeplinkonly=0;
       my $deeplinkchecked;
       my $deeplink_login_pc;
     my $prev=$next;      my $prev=$next;
     my ($prevmapid)=split(/\./,$next);      my ($prevmapid)=split(/\./,$next);
     do {      do {
Line 115  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;          $deeplinkonly = 0;
         if ($hash{'deeplinkonly_'.$next}) {          if ($hash{'deeplinkonly_'.$next}) {
             my ($value,$level) = split(/:/,$hash{'deeplinkonly_'.$next});              my ($value,$level) = split(/:/,$hash{'deeplinkonly_'.$next});
             if ($level eq 'resource') {              my ($state,$others,$listed,$scope,$protect) = split(/,/,$value);
                 $deeplinkonly = 1;              unless (($state eq 'both') || ($hash{'is_map_'.$next})) {
             } elsif ($level eq 'map') {                  if ($level eq 'resource') {
                 if ($mapid != $prevmapid) {  
                     $deeplinkonly = 1;                      $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}) {          } elsif (($hash{'deeplinkonly_'.$prev}) && (!$firstres)) {
             my ($value,$level) = split(/:/,$hash{'deeplinkonly_'.$prev});              my ($value,$level) = split(/:/,$hash{'deeplinkonly_'.$prev});
             if ($level eq 'resource') {              my ($state,$others,$listed,$scope,$protect) = split(/,/,$value);
                 $deeplinkonly = 1;              unless (($state eq 'both') || ($hash{'is_map_'.$prev})) {
             } elsif ($level eq 'map') {                  if ($level eq 'resource') {
                 if ($mapid != $prevmapid) {  
                     $deeplinkonly = 1;                      $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;
                           }
                       }
                 }                  }
             }              }
         }          }
Line 146  sub move { Line 202  sub move {
  || (   || (
                         (!$env{'request.role.adv'})                          (!$env{'request.role.adv'})
                      && (($hash{'randomout_'.$next})                       && (($hash{'randomout_'.$next})
                      ||  ($deeplinkonly))                       ||  ($deeplinkonly)
                        ||  ($hash{'deeplinkout_'.$next}))
     )      )
  || (!$allowed)   || (!$allowed)
  )   )
Line 181  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 223  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 256  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;
Line 304  sub first_answerable_ressymb { Line 371  sub first_answerable_ressymb {
 }  }
   
 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 313  sub check_http_req { Line 380  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 351  setTimeout(function() { Line 420  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 390  sub handler { Line 478  sub handler {
           }            }
       } elsif ($direction eq 'firstanswerable') {        } elsif ($direction eq 'firstanswerable') {
           my $furl = &first_answerable_ressymb();            my $furl = &first_answerable_ressymb();
           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 431  sub handler { Line 519  sub handler {
               my $preamble = '<div id="LC_update_'.$env{'request.course.id'}.'" class="LC_info">'.                my $preamble = '<div id="LC_update_'.$env{'request.course.id'}.'" class="LC_info">'.
                              '<br />'.                               '<br />'.
                              &mt('Your course session is being updated because of recent changes by course personnel.').                               &mt('Your course session is being updated because of recent changes by course personnel.').
                              ' '.&mt('Please be patient.').'<br /></div>'.                               ' '.&mt('Please be patient').'.<br /></div>'.
                              '<div style="padding:0;clear:both;margin:0;border:0"></div>';                               '<div style="padding:0;clear:both;margin:0;border:0"></div>';
               %prog_state = &Apache::lonhtmlcommon::Create_PrgWin($r,undef,$preamble);                %prog_state = &Apache::lonhtmlcommon::Create_PrgWin($r,undef,$preamble);
               &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,&mt('Updating course'));                &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,&mt('Updating course'));
               my ($furl,$ferr) = &Apache::lonuserstate::readmap("$cdom/$cnum");                my ($furl,$ferr) = &Apache::lonuserstate::readmap("$cdom/$cnum");
               &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,&mt('Finished'));                &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,&mt('Finished!'));
               if ($ferr) {                if ($ferr) {
                   &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);                    &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
                   my $requrl = $r->uri;                    my $requrl = $r->uri;
Line 455  sub handler { Line 543  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 481  sub handler { Line 569  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 525  sub handler { Line 613  sub handler {
              $last=$hash{'last_known'};               $last=$hash{'last_known'};
              untie(%hash);               untie(%hash);
          }           }
          my $newloc;  
          if ($last) {           if ($last) {
      $currenturl=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($last))[2]);       $currenturl=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($last))[2]);
  } else {   } else {
Line 598  sub handler { Line 685  sub handler {
       } else {        } else {
 # -------------------------------------------------------------- No place to go  # -------------------------------------------------------------- No place to go
                   $multichoice=-1;                    $multichoice=-1;
                   if ($hash{'deeplinkonly_'.$rid}) {                    if ($position && $env{'request.deeplink.login'}) {
                       (my $value,$deeplinklevel) = split(/:/,$hash{'deeplinkonly_'.$rid});                        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) = 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
Line 624  sub handler { Line 716  sub handler {
 # ------------------------------------- Check for and display critical messages  # ------------------------------------- Check for and display critical messages
                   my ($redirect, $url) = &Apache::loncommon::critical_redirect(300,'flip');                    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 691  $lt{'pick'}: Line 783  $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;
                         }                          }

Removed from v.1.101  
changed lines
  Added in v.1.109


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.