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;
}
}
--- /dev/null
+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;