SL::Menu: Negierung (!) beim access_string erlauben
authorBernd Bleßmann <bernd@kivitendo-premium.de>
Wed, 1 Aug 2018 14:12:42 +0000 (16:12 +0200)
committerBernd Bleßmann <bernd@kivitendo-premium.de>
Mon, 13 Aug 2018 09:37:53 +0000 (11:37 +0200)
und Tests hierzu

SL/Menu.pm
menus/user/00-erp.yaml
t/menu/parse_access_string.t

index 0e92cc5..42b08de 100644 (file)
@@ -180,7 +180,7 @@ sub parse_access_string {
 
   my $access = $node->{access};
 
-  while ($access =~ m/^([a-z_\/]+|\||\&|\(|\)|\s+)/) {
+  while ($access =~ m/^([a-z_\/]+|\!|\||\&|\(|\)|\s+)/) {
     my $token = $1;
     substr($access, 0, length($1)) = "";
 
@@ -199,7 +199,7 @@ sub parse_access_string {
       }
       $cur_ary = $stack[-1];
 
-    } elsif (($token eq "|") || ($token eq "&")) {
+    } elsif (($token eq "|") || ($token eq "&") || ($token eq "!")) {
       push @{$cur_ary}, $token;
 
     } else {
@@ -273,4 +273,3 @@ sub set_access {
 }
 
 1;
-
index 3264c3f..d3c006c 100644 (file)
@@ -11,7 +11,9 @@
 #          ( ) & | are supported.  if binary operator is missing the last
 #          operator in same scope is repeated, or "|" if none used in scope
 #          yet. client config entries can be used as rights by prefixing them
-#          with "client/". If missing, access will be granted.
+#          with "client/".
+#          ! is supported to negate the subsequent expression.
+#          If missing, access will be granted.
 #
 #          Example:
 #            client/feature_default_enabled | ( feature & system )
index f1cbd42..fd6e790 100644 (file)
@@ -57,6 +57,24 @@ ok(!$menu->parse_access_string(\%node), 'parenthesis 2');
 $node{access} = 'sales_quotation_edit & client/feature_experimental';
 ok($menu->parse_access_string(\%node), 'client');
 
+$node{access} = '!no_such_right';
+ok($menu->parse_access_string(\%node), 'simple negation 1');
+
+$node{access} = '!sales_order_edit';
+ok(!$menu->parse_access_string(\%node), 'simple negation 2');
+
+$node{access} = '!!sales_order_edit';
+ok($menu->parse_access_string(\%node), 'double negation');
+
+$node{access} = '(no_such_right & sales_order_edit | !(no_such_right & sales_order_edit))';
+ok($menu->parse_access_string(\%node), 'parenthesis with negation 1');
+
+$node{access} = '(no_such_right & sales_order_edit | (!no_such_right | !sales_order_edit))';
+ok($menu->parse_access_string(\%node), 'parenthesis with negation 2');
+
+$node{access} = 'sales_quotation_edit & !client/feature_experimental';
+ok(!$menu->parse_access_string(\%node), 'client negation');
+
 done_testing;
 
 1;