--- rat/lonpageflip.pm 2014/06/26 18:21:24 1.80.8.5
+++ rat/lonpageflip.pm 2021/12/14 21:34:45 1.80.8.13
@@ -2,7 +2,7 @@
#
# Page flip handler
#
-# $Id: lonpageflip.pm,v 1.80.8.5 2014/06/26 18:21:24 raeburn Exp $
+# $Id: lonpageflip.pm,v 1.80.8.13 2021/12/14 21:34:45 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -36,6 +36,7 @@ use LONCAPA;
use Apache::Constants qw(:common :http REDIRECT);
use Apache::lonnet;
use Apache::loncommon();
+use Apache::lonuserstate;
use Apache::lonlocal;
use HTML::TokeParser;
use GDBM_File;
@@ -82,11 +83,18 @@ sub hash_src {
my ($mapid,$resid)=split(/\./,$id);
my $symb=&Apache::lonnet::encode_symb($hash{'map_id_'.$mapid},
$resid,$hash{'src_'.$id});
+ my $anchor;
+ if ($hash{'ext_'.$id} eq 'true:') {
+ if ($hash{'src_'.$id} =~ /(\#.+)$/) {
+ $anchor = $1;
+ }
+ }
if ($hash{'encrypted_'.$id}) {
return (&Apache::lonenc::encrypted($hash{'src_'.$id}),
- &Apache::lonenc::encrypted($symb));
+ &Apache::lonenc::encrypted($symb),
+ $hash{'encrypted_'.$id},$anchor);
}
- return ($hash{'src_'.$id},$symb);
+ return ($hash{'src_'.$id},$symb,$hash{'encrypted_'.$id},$anchor);
}
sub move {
@@ -218,49 +226,36 @@ sub get_next_possible_move {
return ($next,$mapurl);
}
-sub navlaunch {
- my ($r)=@_;
- &Apache::loncommon::content_type($r,'text/html');
- &Apache::loncommon::no_cache($r);
- $r->send_http_header;
- $r->print(&Apache::loncommon::start_page('Launched'));
- $r->print(<
Collapse external navigation window
-ENDNAV - $r->print(&Apache::loncommon::end_page()); -} - sub first_accessible_resource { my $furl; if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'.db', &GDBM_READER(),0640)) { $furl=$hash{'first_url'}; - my %args; - my ($url,$args) = split(/\?/,$furl); - foreach my $pair (split(/\&/,$args)) { + my (%args,$url,$argstr); + if ($furl =~ m{^/enc/}) { + ($url,$argstr) = split(/\?/,&Apache::lonenc::unencrypted($furl)); + } else { + ($url,$argstr) = split(/\?/,$furl); + } + foreach my $pair (split(/\&/,$argstr)) { my ($name,$value) = split(/=/,$pair); $args{&unescape($name)} = &unescape($value); } - if ((($env{'environment.remotenavmap'} eq 'on') && ($furl =~ m{^/adm/navmaps})) || - (!&Apache::lonnet::allowed('bre',$url,$args{'symb'}))) { + if (!&Apache::lonnet::allowed('bre',$url,$args{'symb'})) { # 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'); # Build the new URL - my ($newmapid,$newresid)=split(/\./,$newrid); - 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); + if ($newrid eq '') { + $furl = '/adm/navmaps'; + } else { + my ($newmapid,$newresid)=split(/\./,$newrid); + 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); return $furl; } else { @@ -268,6 +263,56 @@ sub first_accessible_resource { } } +sub check_http_req { + my ($srcref,$hostname) = @_; + return unless (ref($srcref) eq 'SCALAR'); + my $usehttp; + if ($env{'request.course.id'}) { + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + if (($$srcref =~ m{^\Q/public/$cdom/$cnum/syllabus\E($|\?)}) && + ($ENV{'SERVER_PORT'} == 443) && + ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) { + 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)) { + unless ((&Apache::lonnet::uses_sts()) || + (&Apache::lonnet::waf_allssl($hostname))) { + my ($url,$anchor) = ($$srcref =~ /^([^\#]+)(?:|(\#[^\#]+))$/); + $$srcref = $url . (($$srcref =~/\?/)? '&':'?') . 'usehttp=1' .$anchor; + $usehttp = 1; + } + } + } + return $usehttp; +} + +sub reinited_js { + my ($url,$cid,$timeout) = @_; + if (!$timeout) { + $timeout = 0; + } + return <<"END"; + +END +} + # ================================================================ Main Handler sub handler { @@ -284,43 +329,114 @@ sub handler { my %cachehash=(); my $multichoice=0; my %multichoicehash=(); - my ($redirecturl,$redirectsymb); + my %prog_state=(); + my ($redirecturl,$redirectsymb,$enc,$anchor); my $next=''; + my $hostname = $r->hostname(); my @possibilities=(); &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['postdata']); if (($env{'form.postdata'})&&($env{'request.course.fn'})) { - $env{'form.postdata'}=~/(\w+)\:(.*)/; - my $direction=$1; - my $currenturl=$2; + my ($direction,$currenturl) = ($env{'form.postdata'}=~/(\w+)\:(.*)/); if ($currenturl=~m|^/enc/|) { - $currenturl=&Apache::lonenc::unencrypted($currenturl); + $currenturl=&Apache::lonenc::unencrypted($currenturl); } $currenturl=~s/\.\d+\.(\w+)$/\.$1/; + $currenturl=~s/^https?\:\/\///; + $currenturl=~s/^[^\/]+//; + my ($preupdatepos,$last,$reinitcheck); + if ($direction eq 'return') { + if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db', + &GDBM_READER(),0640)) { + $last=$hash{'last_known'}; + untie(%hash); + } + } + if ($env{'request.course.id'}) { + # Check if course needs to be re-initialized + my $loncaparev = $r->dir_config('lonVersion'); + ($reinitcheck,my @reinit) = &Apache::loncommon::needs_coursereinit($loncaparev); + if ($reinitcheck eq 'switch') { + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; + $r->print(&Apache::loncommon::check_release_result(@reinit)); + return OK; + } elsif ($reinitcheck eq 'update') { + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + $preupdatepos = &Apache::lonnet::symbread($currenturl); + unless ($direction eq 'return') { + if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db', + &GDBM_READER(),0640)) { + $last=$hash{'last_known'}; + untie(%hash); + } + } + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; + $r->print(&Apache::loncommon::start_page('Content Changed')); + my $preamble = ''.$lt{'explain'}.'
'); + if ($reinitcheck) { + if (&Apache::loncommon::course_type() eq 'Community') { + $r->print( + &Apache::loncommon::start_page('Community Contents Updated')); + } else { + $r->print( + &Apache::loncommon::start_page('Course Contents Updated')); + } + $r->print(''.$lt{'expupdate'}.'
'
+ .$lt{'gonav'}.'
'.$lt{'explain'}.'
'); + } } - $r->print( - &Apache::lonhtmlcommon::actionbox( - [''.$lt{'back'}.'', - ''.$lt{'nav'}.'' - ]) - .&Apache::loncommon::end_page()); + if ((!@possibilities) && ($reinitcheck)) { + $r->print( + &Apache::lonhtmlcommon::actionbox( + [''.$lt{'nav'}.'' + ])); + } else { + $r->print( + &Apache::lonhtmlcommon::actionbox( + [''.$lt{'back'}.'', + ''.$lt{'nav'}.'' + ])); + } + $r->print(&Apache::loncommon::end_page()); + return OK; } } else { # ------------------------------------------------- Problem, could not tie hash + if ($reinitcheck eq 'update') { + &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); + $r->print(&Apache::loncommon::end_page()); + } $env{'user.error.msg'}="/adm/flip:bre:0:1:Course Data Missing"; return HTTP_NOT_ACCEPTABLE; } } else { # ---------------------------------------- No, could not determine where we are - $r->internal_redirect('/adm/ambiguous'); + my $newloc = '/adm/ambiguous'; + if ($reinitcheck eq 'update') { + &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); + $r->print(&reinited_js($newloc,$env{'request.course.id'},100)); + $r->print(&Apache::loncommon::end_page()); + } else { + $r->internal_redirect($newloc); + } return OK; } } else { @@ -552,8 +739,6 @@ described at http://www.lon-capa.org. =item get_next_possible_move() -=item navlaunch() - =item first_accessible_resource() =item handler()