Completed
Push — master ( 854a6f...c7bd33 )
by Chad
12s
created

Middleware::__invoke()   A

Complexity

Conditions 2
Paths 6

Size

Total Lines 15
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 15
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 9
nc 6
nop 3
1
<?php
2
3
namespace Chadicus\Psr\Http\ServerMiddleware;
4
5
use ArrayAccess;
6
use Psr\Http\Message\ServerRequestInterface;
7
use Psr\Http\Message\ResponseInterface;
8
9
/**
10
 * PSR-7 Middleware for extracting and validating request via hmac cryptography.
11
 */
12
final class Middleware
13
{
14
    /**
15
     * Obtains private keys.
16
     *
17
     * @var KeyProviderInterface
18
     */
19
    private $keyProvider;
20
21
    /**
22
     * Extracts the token information from the incoming request.
23
     *
24
     * @var TokenExtractorInterface
25
     */
26
    private $tokenExtractor;
27
28
    /**
29
     * Validates the extracted token.
30
     *
31
     * @var TokenValidatorInterface
32
     */
33
    private $tokenValidator;
34
35
    /**
36
     * Container in which to store the private key.
37
     *
38
     * @var ArrayAccess
39
     */
40
    private $container;
0 ignored issues
show
Unused Code introduced by
The property $container is not used and could be removed.

This check marks private properties in classes that are never used. Those properties can be removed.

Loading history...
41
42
    /**
43
     * Construct a new instance of this middleware.
44
     *
45
     * @param KeyProviderInterface    $provider  Obtains private keys.
46
     * @param TokenExtractorInterface $extractor Extracts the token information from the incoming request.
47
     * @param TokenValidatorInterface $validator Validates the extracted token.
48
     * @param ArrayAccess             $container Container in which to store the private key.
49
     */
50
    public function __construct(
51
        KeyProviderInterface $provider,
52
        TokenExtractorInterface $extractor,
53
        TokenValidatorInterface $validator,
54
        ArrayAccess $container
55
    ) {
56
        $this->keyProvider = $provider;
57
        $this->tokenExtractor = $extractor;
58
        $this->tokenValidator = $validator;
59
        $this->tokenContainer = $container;
0 ignored issues
show
Bug introduced by
The property tokenContainer does not seem to exist. Did you mean container?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
60
    }
61
62
    /**
63
     * Execute this middleware.
64
     *
65
     * @param  ServerRequestInterface $request  The incoming PSR7 request.
66
     * @param  ResponseInterface      $response The outgoing PSR7 response.
67
     * @param  callable               $next     The next middleware.
68
     *
69
     * @return ResponseInterface
70
     */
71
    public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next)
72
    {
73
        try {
74
            $token = $this->tokenExtractor->extract($request);
75
            $privateKey = $this->keyProvider->findPrivateKey($token->getPublicKey());
76
            $this->tokenValidator->validate($privateKey, $token, $request);
77
78
            //Authenticated! Set the private key and call the next middleware
79
            $this->tokenContainer['privateKey'] = $privateKey;
0 ignored issues
show
Bug introduced by
The property tokenContainer does not seem to exist. Did you mean container?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
80
81
            return $next($request, $response);
82
        } catch (AuthenticationException $e) {
83
            return $response->withStatus($e->getStatusCode(), $e->getReasonPhrase());
84
        }
85
    }
86
}
87