Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
3 / 3
CRAP
100.00% covered (success)
100.00%
1 / 1
Acl
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
3 / 3
6
100.00% covered (success)
100.00%
1 / 1
 allow
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
 permits
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
3
 permissions
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3declare(strict_types=1);
4
5namespace Cosray\Security;
6
7/**
8 * Allow entries only: a permission holds when any of the subject's
9 * principals was allowed it, so the order of entries never matters.
10 */
11final class Acl
12{
13    /** @var array<string, array<string, true>> */
14    private array $entries = [];
15
16    public function allow(string $principal, string ...$permissions): self
17    {
18        foreach ($permissions as $permission) {
19            $this->entries[$principal][$permission] = true;
20        }
21
22        return $this;
23    }
24
25    /** @param list<string> $principals */
26    public function permits(array $principals, string $permission): bool
27    {
28        foreach ($principals as $principal) {
29            if (isset($this->entries[$principal][$permission])) {
30                return true;
31            }
32        }
33
34        return false;
35    }
36
37    /** @return list<string> */
38    public function permissions(string $principal): array
39    {
40        return array_keys($this->entries[$principal] ?? []);
41    }
42}