Passed
Push — main ( ed4306...4891af )
by Daniel
04:25
created

SessionValidatorMiddleware   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 38
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
eloc 17
c 0
b 0
f 0
dl 0
loc 38
ccs 13
cts 13
cp 1
rs 10
wmc 5

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A process() 0 26 4
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Uxmp\Core\Api\Lib\Middleware;
6
7
use Nyholm\Psr7\Factory\Psr17Factory;
8
use Psr\Http\Message\ResponseInterface;
9
use Psr\Http\Message\ServerRequestInterface;
10
use Psr\Http\Server\MiddlewareInterface;
11
use Psr\Http\Server\RequestHandlerInterface;
12
use Teapot\StatusCode;
13
use Uxmp\Core\Component\Authentication\SessionManagerInterface;
14
15
/**
16
 * Provides authentication services for api requests
17
 */
18
final class SessionValidatorMiddleware implements MiddlewareInterface
19
{
20
    final public const SESSION_ID = 'sessionId';
21
    final public const USER = 'user';
22
    final public const USER_ID = 'userId';
23
24 5
    public function __construct(
25
        private readonly SessionManagerInterface $sessionManager,
26
        private readonly Psr17Factory $psr17Factory
27
    ) {
28
    }
29
30 4
    public function process(
31
        ServerRequestInterface $request,
32
        RequestHandlerInterface $handler
33
    ): ResponseInterface {
34
        /** @var null|array<scalar> $tokenData */
35 4
        $tokenData = $request->getAttribute('token');
36 4
        if ($tokenData !== null) {
37 3
            $session = $this->sessionManager->lookup((int) ($tokenData['sub'] ?? 0));
38
39 3
            if ($session === null || !$session->getActive()) {
40 2
                return $this->psr17Factory->createResponse(
41
                    StatusCode::FORBIDDEN,
42
                    'Session expired'
43
                );
44
            }
45
46 1
            $user = $session->getUser();
47
48 1
            $request = $request
49 1
                ->withAttribute(static::SESSION_ID, $session->getId())
50 1
                ->withAttribute(static::USER, $user)
51 1
                ->withAttribute(static::USER_ID, $user->getId())
52
            ;
53
        }
54
55 2
        return $handler->handle($request);
56
    }
57
}
58