--- rat/lonpageflip.pm 2021/12/31 20:03:33 1.80.8.13.2.1 +++ rat/lonpageflip.pm 2013/11/28 02:23:25 1.83 @@ -2,7 +2,7 @@ # # Page flip handler # -# $Id: lonpageflip.pm,v 1.80.8.13.2.1 2021/12/31 20:03:33 raeburn Exp $ +# $Id: lonpageflip.pm,v 1.83 2013/11/28 02:23:25 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -36,9 +36,6 @@ use LONCAPA; use Apache::Constants qw(:common :http REDIRECT); use Apache::lonnet; use Apache::loncommon(); -use Apache::lonnavmaps(); -use Apache::lonuserstate; -use Apache::lonlocal; use HTML::TokeParser; use GDBM_File; @@ -84,29 +81,17 @@ 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), - $hash{'encrypted_'.$id},$anchor); + &Apache::lonenc::encrypted($symb)); } - return ($hash{'src_'.$id},$symb,$hash{'encrypted_'.$id},$anchor); + return ($hash{'src_'.$id},$symb); } sub move { - my ($next,$endupmap,$direction,$firstres) = @_; + my ($next,$endupmap,$direction) = @_; my $safecount=0; my $allowed=0; - my $deeplinkonly=0; - my $deeplinkchecked; - my $deeplink_login_pc; - my $prev=$next; - my ($prevmapid)=split(/\./,$next); do { ($next,$endupmap)=&get_next_possible_move($next,$endupmap,$direction); @@ -117,83 +102,9 @@ sub move { if ($url eq '' || $symb eq '') { $allowed = 0; } else { - my $nodeeplinkcheck = 0; - 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')); + my $priv = &Apache::lonnet::allowed('bre',$url,$symb); + $allowed = (($priv eq 'F') || ($priv eq '2')); } - $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++; } while ( ($next) && ($next!~/\,/) @@ -201,9 +112,7 @@ sub move { (!$hash{'src_'.$next}) || ( (!$env{'request.role.adv'}) - && (($hash{'randomout_'.$next}) - || ($deeplinkonly) - || ($hash{'deeplinkout_'.$next})) + && $hash{'randomout_'.$next} ) || (!$allowed) ) @@ -238,7 +147,7 @@ sub get_next_possible_move { } if ($thiscond>$mincond) { $mincond=$thiscond; } } - } + } foreach my $id (split(/\,/,$posnext)) { my ($linkid,$condval)=split(/\:/,$id); if ($condval>=$mincond) { @@ -280,7 +189,7 @@ sub get_next_possible_move { } if ($thiscond>$mincond) { $mincond=$thiscond; } } - } + } foreach my $id (split(/\,/,$posnext)) { my ($linkid,$condval)=split(/\:/,$id); if ($condval>=$mincond) { @@ -313,33 +222,23 @@ sub first_accessible_resource { if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'.db', &GDBM_READER(),0640)) { $furl=$hash{'first_url'}; - 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 %args; + my ($url,$args) = split(/\?/,$furl); + foreach my $pair (split(/\&/,$args)) { my ($name,$value) = split(/=/,$pair); $args{&unescape($name)} = &unescape($value); } - my $priv = &Apache::lonnet::allowed('bre',$url,$args{'symb'}); - my $allowed = (($priv eq 'F') || ($priv eq '2') || ($priv eq 'A')); - if (!$allowed) { + 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',1); + my ($newrid,$newmap)=&move($hash{'first_rid'},$hash{'first_mapurl'},'forward'); # Build the new URL - 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); - } - } - } + 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 { @@ -347,75 +246,6 @@ 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 -} - -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 sub handler { @@ -432,173 +262,81 @@ sub handler { my %cachehash=(); my $multichoice=0; my %multichoicehash=(); - my %prog_state=(); - my ($redirecturl,$redirectsymb,$enc,$anchor,$deeplinklevel); + my ($redirecturl,$redirectsymb); 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'})) { - my ($direction,$currenturl) = ($env{'form.postdata'}=~/(\w+)\:(.*)/); + $env{'form.postdata'}=~/(\w+)\:(.*)/; + my $direction=$1; + my $currenturl=$2; 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{'expupdate'}.'
'
- .$lt{'gonav'}.'
'.$lt{'deeplinkres'}.'
'); - } elsif ($deeplinklevel eq 'map') { - $r->print(''.$lt{'deeplinkmap'}.'
'); - } else { - $r->print(''.$lt{'explain'}.'
'); - } - } - } - if ($deeplinklevel) { $r->print( - &Apache::lonhtmlcommon::actionbox( - [''.$lt{'back'}.''])); - } elsif ((!@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()); - + &Apache::loncommon::start_page('No Resource') + .''.$lt{'explain'}.'
'); + } + $r->print( + &Apache::lonhtmlcommon::actionbox( + [''.$lt{'back'}.'', + ''.$lt{'nav'}.'' + ]) + .&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 - 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); - } + $r->internal_redirect('/adm/ambiguous'); return OK; } } else {