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