Passed
Push — main ( 7dcca1...e70bce )
by Daniel
04:22
created

SessionValidatorMiddleware   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 48
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 5
eloc 19
dl 0
loc 48
ccs 20
cts 20
cp 1
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Uxmp\Core\Api\Lib\Middleware;
6
7
use Lcobucci\JWT\Token\Plain;
8
use Nyholm\Psr7\Factory\Psr17Factory;
9
use Psr\Http\Message\ResponseInterface;
10
use Psr\Http\Message\ServerRequestInterface;
11
use Psr\Http\Server\MiddlewareInterface;
12
use Psr\Http\Server\RequestHandlerInterface;
13
use Teapot\StatusCode\Http;
14
use Uxmp\Core\Component\Authentication\SessionManagerInterface;
15
16
/**
17
 * Provides authentication services for api requests
18
 */
19
final readonly class SessionValidatorMiddleware implements MiddlewareInterface
0 ignored issues
show
Bug introduced by
A parse error occurred: Syntax error, unexpected T_READONLY, expecting T_CLASS on line 19 at column 6
Loading history...
20
{
21
    /** @var string */
22
    public const SESSION_ID = 'sessionId';
23
24
    /** @var string */
25
    public const USER = 'user';
26
27
    /** @var string */
28
    public const USER_ID = 'userId';
29
30
    /** @var string */
31
    public const SESSION_ID_CLAIM = 'sid';
32
33 5
    public function __construct(
34
        private SessionManagerInterface $sessionManager,
35
        private Psr17Factory $psr17Factory
36
    ) {
37 5
    }
38
39 4
    public function process(
40
        ServerRequestInterface $request,
41
        RequestHandlerInterface $handler
42
    ): ResponseInterface {
43
        /** @var null|Plain $tokenData */
44 4
        $tokenData = $request->getAttribute('token');
45 4
        if ($tokenData !== null) {
46 3
            $session = $this->sessionManager->lookup(
47 3
                (int) $tokenData->claims()->get(self::SESSION_ID_CLAIM)
48 3
            );
49
50 3
            if ($session === null || !$session->getActive()) {
51 2
                return $this->psr17Factory->createResponse(
52 2
                    Http::FORBIDDEN,
53 2
                    'Session expired'
54 2
                );
55
            }
56
57 1
            $user = $session->getUser();
58
59 1
            $request = $request
60 1
                ->withAttribute(self::SESSION_ID, $session->getId())
61 1
                ->withAttribute(self::USER, $user)
62 1
                ->withAttribute(self::USER_ID, $user->getId())
63 1
            ;
64
        }
65
66 2
        return $handler->handle($request);
67
    }
68
}
69