--- loncom/lonnet/perl/lonnet.pm 2021/06/06 23:18:59 1.1457 +++ loncom/lonnet/perl/lonnet.pm 2021/06/15 20:52:28 1.1460 @@ -1,7 +1,7 @@ # The LearningOnline Network # TCP networking package # -# $Id: lonnet.pm,v 1.1457 2021/06/06 23:18:59 raeburn Exp $ +# $Id: lonnet.pm,v 1.1460 2021/06/15 20:52:28 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -8441,7 +8441,10 @@ sub allowed { =~/\Q$priv\E\&([^\:]*)/) { my $value = $1; if ($priv eq 'bre') { - if ($noblockcheck) { + my $deeplinkblock = &deeplink_check($priv,$symb,$uri); + if ($deeplinkblock) { + $thisallowed = 'D'; + } elsif ($noblockcheck) { $thisallowed.=$value; } else { my @blockers = &has_comm_blocking($priv,$symb,$uri,$ignorecache); @@ -9062,10 +9065,19 @@ sub deeplink_check { if ($symb eq $login) { $allow = 1; } - } elsif ($scope eq 'map') { -#FIXME Compare map for $env{'request.deeplink.login'} with map for $symb - } elsif ($scope eq 'rec') { -#FIXME Recurse up for $env{'request.deeplink.login'} with map for $symb + } elsif (($scope eq 'map') || ($scope eq 'rec')) { + my ($map_from_symb) = &deversion((&decode_symb($symb))[0]); + my ($map_from_login) = &deversion((&decode_symb($login))[0]); + if (($map_from_symb) && ($map_from_login)) { + if ($map_from_symb eq $map_from_login) { + $allow = 1; + } elsif ($scope eq 'rec') { + my @recurseup = &get_map_hierarchy($map_from_symb,$env{'request.course.id'}); + if (grep(/^\Q$map_from_login\E$/,@recurseup)) { + $allow = 1; + } + } + } } } else { my ($acctype,$item) = split(/:/,$access); @@ -9776,6 +9788,38 @@ sub auto_validate_class_sec { return $response; } +sub auto_instsec_reformat { + my ($cdom,$action,$instsecref) = @_; + return unless(($action eq 'clutter') || ($action eq 'declutter')); + my @homeservers; + if (defined(&domain($cdom,'primary'))) { + push(@homeservers,&domain($cdom,'primary')); + } else { + my %servers = &get_servers($cdom,'library'); + foreach my $tryserver (keys(%servers)) { + if (!grep(/^\Q$tryserver\E$/,@homeservers)) { + push(@homeservers,$tryserver); + } + } + } + my $response; + my %reformatted = %{$instsecref}; + foreach my $server (@homeservers) { + if (ref($instsecref) eq 'HASH') { + my $info = &freeze_escape($instsecref); + my $response=&reply('autoinstsecreformat:'.$cdom.':'. + $action.':'.$info,$server); + next if ($response =~ /(con_lost|error|no_such_host|refused|unknown_command)/); + my @items = split(/&/,$response); + foreach my $item (@items) { + my ($key,$value) = split(/=/,$item); + $reformatted{&unescape($key)} = &thaw_unescape($value); + } + } + } + return %reformatted; +} + sub auto_validate_instclasses { my ($cdom,$cnum,$owners,$classesref) = @_; my ($homeserver,%validations);