Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
17 / 17
100.00% covered (success)
100.00%
3 / 3
CRAP
100.00% covered (success)
100.00%
1 / 1
Permission
100.00% covered (success)
100.00%
17 / 17
100.00% covered (success)
100.00%
3 / 3
5
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 process
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
1 / 1
3
 init
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3declare(strict_types=1);
4
5namespace Cosray\Middleware;
6
7use Attribute;
8use Celema\Core\Exception\HttpForbidden;
9use Celema\Core\Exception\HttpUnauthorized;
10use Celema\Wire\Call;
11use Cosray\Auth;
12use Cosray\Config;
13use Cosray\Security\Policy;
14use Cosray\Users;
15use Override;
16use Psr\Http\Message\ResponseInterface as Response;
17use Psr\Http\Message\ServerRequestInterface as Request;
18use Psr\Http\Server\MiddlewareInterface as Middleware;
19use Psr\Http\Server\RequestHandlerInterface as Handler;
20
21#[Attribute, Call('init')]
22class Permission implements Middleware
23{
24    protected Users $users;
25    protected Config $config;
26    protected Policy $policy;
27
28    public function __construct(
29        public readonly string $permission,
30    ) {}
31
32    #[Override]
33    public function process(Request $request, Handler $handler): Response
34    {
35        $session = $request->getAttribute('session', null);
36
37        $auth = new Auth(
38            $request,
39            $this->users,
40            $this->config,
41            $session,
42        );
43        $user = $auth->user();
44
45        if ($user) {
46            if (!$this->policy->permits($user, $this->permission)) {
47                throw new HttpForbidden($request);
48            }
49
50            return $handler->handle($request);
51        }
52
53        throw new HttpUnauthorized($request);
54    }
55
56    public function init(Users $users, Config $config, Policy $policy): void
57    {
58        $this->users = $users;
59        $this->config = $config;
60        $this->policy = $policy;
61    }
62}