--- rat/lonpageflip.pm 2018/11/13 03:59:17 1.98 +++ rat/lonpageflip.pm 2021/06/07 19:04:20 1.104 @@ -2,7 +2,7 @@ # # Page flip handler # -# $Id: lonpageflip.pm,v 1.98 2018/11/13 03:59:17 raeburn Exp $ +# $Id: lonpageflip.pm,v 1.104 2021/06/07 19:04:20 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -99,7 +99,7 @@ sub hash_src { } sub move { - my ($next,$endupmap,$direction) = @_; + my ($next,$endupmap,$direction,$firstres) = @_; my $safecount=0; my $allowed=0; my $deeplinkonly=0; @@ -116,7 +116,7 @@ sub move { $allowed = 0; } else { my $priv = &Apache::lonnet::allowed('bre',$url,$symb); - $allowed = (($priv eq 'F') || ($priv eq '2')); + $allowed = (($priv eq 'F') || ($priv eq '2') || ($priv eq 'A')); } $deeplinkonly = 0; if ($hash{'deeplinkonly_'.$next}) { @@ -128,7 +128,7 @@ sub move { $deeplinkonly = 1; } } - } elsif ($hash{'deeplinkonly_'.$prev}) { + } elsif (($hash{'deeplinkonly_'.$prev}) && (!$firstres)) { my ($value,$level) = split(/:/,$hash{'deeplinkonly_'.$prev}); if ($level eq 'resource') { $deeplinkonly = 1; @@ -262,9 +262,11 @@ sub first_accessible_resource { my ($name,$value) = split(/=/,$pair); $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 - 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 my ($newmapid,$newresid)=split(/\./,$newrid); my $symb=&Apache::lonnet::encode_symb($newmap,$newresid,$hash{'src_'.$newrid}); @@ -304,7 +306,7 @@ sub first_answerable_ressymb { } sub check_http_req { - my ($srcref) = @_; + my ($srcref,$hostname) = @_; return unless (ref($srcref) eq 'SCALAR'); my $usehttp; if ($env{'request.course.id'}) { @@ -313,11 +315,19 @@ sub check_http_req { if (($$srcref =~ m{^\Q/public/$cdom/$cnum/syllabus\E($|\?)}) && ($ENV{'SERVER_PORT'} == 443) && ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) { - $$srcref .= (($$srcref =~/\?/)? '&':'?') . 'usehttp=1'; - $usehttp = 1; + unless ((&Apache::lonnet::uses_sts()) || + (&Apache::lonnet::waf_allssl($hostname))) { + $$srcref .= (($$srcref =~/\?/)? '&':'?') . 'usehttp=1'; + $usehttp = 1; + } } elsif (($$srcref =~ m{^\Q/adm/wrapper/ext/\E(?!https:)}) && ($ENV{'SERVER_PORT'} == 443)) { - $usehttp = 1; + unless ((&Apache::lonnet::uses_sts()) || + (&Apache::lonnet::waf_allssl($hostname))) { + my ($url,$anchor) = ($$srcref =~ /^([^\#]+)(?:|(\#[^\#]+))$/); + $$srcref = $url . (($$srcref =~/\?/)? '&':'?') . 'usehttp=1' .$anchor; + $usehttp = 1; + } } } return $usehttp; @@ -384,7 +394,7 @@ sub handler { } } elsif ($direction eq 'firstanswerable') { my $furl = &first_answerable_ressymb(); - my $usehttp = &check_http_req(\$furl); + my $usehttp = &check_http_req(\$furl,$hostname); if (($usehttp) && ($hostname ne '')) { $furl='http://'.$hostname.$furl; } else { @@ -425,12 +435,12 @@ sub handler { my $preamble = '