--- rat/lonpageflip.pm 2021/07/19 14:26:40 1.105 +++ rat/lonpageflip.pm 2021/07/19 15:48:25 1.106 @@ -2,7 +2,7 @@ # # Page flip handler # -# $Id: lonpageflip.pm,v 1.105 2021/07/19 14:26:40 raeburn Exp $ +# $Id: lonpageflip.pm,v 1.106 2021/07/19 15:48:25 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -103,6 +103,8 @@ sub move { my $safecount=0; my $allowed=0; my $deeplinkonly=0; + my $deeplinkchecked; + my $deeplink_login_pc; my $prev=$next; my ($prevmapid)=split(/\./,$next); do { @@ -115,26 +117,81 @@ sub move { if ($url eq '' || $symb eq '') { $allowed = 0; } else { - my $priv = &Apache::lonnet::allowed('bre',$url,$symb); + 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')); } $deeplinkonly = 0; if ($hash{'deeplinkonly_'.$next}) { my ($value,$level) = split(/:/,$hash{'deeplinkonly_'.$next}); - if ($level eq 'resource') { - $deeplinkonly = 1; - } elsif ($level eq 'map') { - if ($mapid != $prevmapid) { + my ($listed,$scope,$access) = split(/,/,$value); + unless (($access eq 'any') || ($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) = split(/:/,$hash{'deeplinkonly_'.$prev}); - if ($level eq 'resource') { - $deeplinkonly = 1; - } elsif ($level eq 'map') { - if ($mapid != $prevmapid) { + my ($listed,$scope,$access) = split(/,/,$value); + unless (($access eq 'any') || ($hash{'is_map_'.$prev})) { + if ($level eq 'resource') { $deeplinkonly = 1; + } elsif ($level eq 'map') { + my ($listed,$scope,$access) = split(/,/,$value); + 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; + } + } } } } @@ -146,7 +203,8 @@ sub move { || ( (!$env{'request.role.adv'}) && (($hash{'randomout_'.$next}) - || ($deeplinkonly)) + || ($deeplinkonly) + || ($hash{'deeplinkout_'.$next}) ) || (!$allowed) ) @@ -181,7 +239,7 @@ sub get_next_possible_move { } if ($thiscond>$mincond) { $mincond=$thiscond; } } - } + } foreach my $id (split(/\,/,$posnext)) { my ($linkid,$condval)=split(/\:/,$id); if ($condval>=$mincond) { @@ -223,7 +281,7 @@ sub get_next_possible_move { } if ($thiscond>$mincond) { $mincond=$thiscond; } } - } + } foreach my $id (split(/\,/,$posnext)) { my ($linkid,$condval)=split(/\:/,$id); if ($condval>=$mincond) { @@ -281,8 +339,8 @@ sub first_accessible_resource { if ($hash{'encrypted_'.$newrid}) { $furl=&Apache::lonenc::encrypted($furl); } - } - } + { + } untie(%hash); return $furl; } else { @@ -363,6 +421,29 @@ setTimeout(function() { 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'}; + if ($env{'request.deeplink.login'}) { + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + 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 { @@ -609,8 +690,13 @@ sub handler { } else { # -------------------------------------------------------------- No place to go $multichoice=-1; - if ($hash{'deeplinkonly_'.$rid}) { - (my $value,$deeplinklevel) = split(/:/,$hash{'deeplinkonly_'.$rid}); + if ($position && $env{'request.deeplink.login'}) { + 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