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

SessionValidatorMiddleware::process()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 26
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 4

Importance

Changes 0
Metric Value
cc 4
eloc 13
c 0
b 0
f 0
nc 3
nop 2
dl 0
loc 26
ccs 12
cts 12
cp 1
crap 4
rs 9.8333
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