SL::Auth: evaluate_rights_ary: Negierung (!) ermöglichen
authorBernd Bleßmann <bernd@kivitendo-premium.de>
Fri, 3 Aug 2018 12:23:09 +0000 (14:23 +0200)
committerBernd Bleßmann <bernd@kivitendo-premium.de>
Mon, 13 Aug 2018 09:37:53 +0000 (11:37 +0200)
SL/Auth.pm
t/auth/evaluate_rights_ary.t [new file with mode: 0644]

index 04145f2..82be3b8 100644 (file)
@@ -1077,23 +1077,36 @@ sub evaluate_rights_ary {
 
   my $value  = 0;
   my $action = '|';
+  my $negate = 0;
 
   foreach my $el (@{$ary}) {
     if (ref $el eq "ARRAY") {
+      my $val = evaluate_rights_ary($el);
+      $val    = !$val if $negate;
+      $negate = 0;
       if ($action eq '|') {
-        $value |= evaluate_rights_ary($el);
+        $value |= $val;
       } else {
-        $value &= evaluate_rights_ary($el);
+        $value &= $val;
       }
 
     } elsif (($el eq '&') || ($el eq '|')) {
       $action = $el;
 
+    } elsif ($el eq '!') {
+      $negate = !$negate;
+
     } elsif ($action eq '|') {
-      $value |= $el;
+      my $val = $el;
+      $val    = !$val if $negate;
+      $negate = 0;
+      $value |= $val;
 
     } else {
-      $value &= $el;
+      my $val = $el;
+      $val    = !$val if $negate;
+      $negate = 0;
+      $value &= $val;
 
     }
   }
diff --git a/t/auth/evaluate_rights_ary.t b/t/auth/evaluate_rights_ary.t
new file mode 100644 (file)
index 0000000..7203d0a
--- /dev/null
@@ -0,0 +1,29 @@
+use strict;
+
+use Test::More;
+
+use lib 't';
+use Support::TestSetup;
+
+Support::TestSetup::login();
+
+use_ok 'SL::Auth';
+
+ok( SL::Auth::evaluate_rights_ary(['1']), 'simple: right');
+ok(!SL::Auth::evaluate_rights_ary(['0']), 'simple: no right');
+ok( SL::Auth::evaluate_rights_ary(['1', '|', 0]), 'simple: or');
+ok( SL::Auth::evaluate_rights_ary(['0', '|', '1']), 'simple: or 2');
+ok(!SL::Auth::evaluate_rights_ary(['1', '&', '0']), 'simple: and');
+ok(!SL::Auth::evaluate_rights_ary(['0', '&', '1']), 'simple: and 2');
+ok( SL::Auth::evaluate_rights_ary(['1', '&', '1']), 'simple: and 3');
+ok(!SL::Auth::evaluate_rights_ary(['!', '1']), 'simple: not');
+ok( SL::Auth::evaluate_rights_ary(['!', '0']), 'simple: not 2');
+ok(!SL::Auth::evaluate_rights_ary(['!', '!', '0']), 'simple: double not');
+ok( SL::Auth::evaluate_rights_ary(['!', ['0']]), 'not 1');
+ok(!SL::Auth::evaluate_rights_ary(['!', ['1']]), 'not 2');
+ok( SL::Auth::evaluate_rights_ary(['!', '!', ['1']]), 'double not');
+ok( SL::Auth::evaluate_rights_ary([ '!', ['!', ['1', '&', '1'], '&', '!', '!', ['1', '|', '!', '1']] ]), 'something more coplex');
+
+done_testing;
+
+1;