--- rat/lonpageflip.pm 2006/03/06 23:41:07 1.66 +++ rat/lonpageflip.pm 2025/02/07 20:46:01 1.115 @@ -2,7 +2,7 @@ # # Page flip handler # -# $Id: lonpageflip.pm,v 1.66 2006/03/06 23:41:07 albertel Exp $ +# $Id: lonpageflip.pm,v 1.115 2025/02/07 20:46:01 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -27,11 +27,18 @@ # http://www.lon-capa.org/ # + + package Apache::lonpageflip; use strict; +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; @@ -77,36 +84,135 @@ 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); } -# Inputs are a url, adn a hash ref of -# form name => value pairs -# takes care of properly adding the form name elements and values to the -# the url doing proper escaping of the values and joining with ? or & as -# needed - -sub add_get_param { - my ($url,$form_data) = @_; - my $needs_question_mark = ($url !~ /\?/); - - while (my ($name,$value) = each(%$form_data)) { - if ($needs_question_mark) { - $url.='?'; - $needs_question_mark = 0; - } else { - $url.='&'; +sub move { + my ($next,$endupmap,$direction,$firstres) = @_; + 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); + + my $url = $hash{'src_'.$next}; + my ($mapid,$resid)=split(/\./,$next); + my $symb = &Apache::lonnet::encode_symb($hash{'map_id_'.$mapid}, + $resid,$url); + 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')); } - $url.=$name.'='.&Apache::lonnet::escape($form_data->{$name}); - } - return $url; + $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!~/\,/) + && ( + (!$hash{'src_'.$next}) + || ( + (!$env{'request.role.adv'}) + && (($hash{'randomout_'.$next}) + || ($deeplinkonly) + || ($hash{'deeplinkout_'.$next})) + ) + || (!$allowed) + ) + && ($safecount<10000)); + + return ($next,$endupmap); } -sub move { +sub get_next_possible_move { my ($rid,$mapurl,$direction)=@_; my $startoutrid=$rid; @@ -132,7 +238,7 @@ sub move { } if ($thiscond>$mincond) { $mincond=$thiscond; } } - } + } foreach my $id (split(/\,/,$posnext)) { my ($linkid,$condval)=split(/\:/,$id); if ($condval>=$mincond) { @@ -174,7 +280,7 @@ sub move { } if ($thiscond>$mincond) { $mincond=$thiscond; } } - } + } foreach my $id (split(/\,/,$posnext)) { my ($linkid,$condval)=split(/\:/,$id); if ($condval>=$mincond) { @@ -202,28 +308,137 @@ sub move { return ($next,$mapurl); } -sub navlaunch { - my ($r)=@_; - &Apache::loncommon::content_type($r,'text/html'); - &Apache::loncommon::no_cache($r); - $r->send_http_header; - my $html=&Apache::lonxml::xmlbegin(); - $r->print("$html
\n"); - $r->print(''. - &Apache::loncommon::bodytag('Launched')); - $r->print(<