RequestSignatureListener::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 14
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 14
rs 9.4285
cc 1
eloc 11
nc 1
nop 5
1
<?php
2
3
namespace Rezzza\SecurityBundle\Security\Firewall;
4
5
use Symfony\Component\HttpFoundation\Response;
6
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
7
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
8
use Symfony\Component\Security\Http\Firewall\ListenerInterface;
9
use Symfony\Component\Security\Core\Exception\AuthenticationException;
10
use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
11
use Symfony\Component\Security\Core\Authentication\Token\AnonymousToken;
12
use Rezzza\SecurityBundle\Security\RequestSignatureToken;
13
use Psr\Log\LoggerInterface;
14
15
/**
16
 * RequestSignatureListener
17
 *
18
 * @uses ListenerInterface
19
 * @author Stephane PY <[email protected]>
20
 */
21
class RequestSignatureListener implements ListenerInterface
22
{
23
    protected $tokenStorage;
24
    protected $authenticationManager;
25
    protected $signatureQueryParameters;
26
    protected $ignored;
27
    protected $logger;
28
29
    public function __construct(
30
        TokenStorageInterface $tokenStorage,
31
        AuthenticationManagerInterface $authenticationManager,
32
        SignatureQueryParameters $signatureQueryParameters,
33
        $ignored,
34
        LoggerInterface $logger = null
35
    )
36
    {
37
        $this->tokenStorage = $tokenStorage;
38
        $this->authenticationManager = $authenticationManager;
39
        $this->signatureQueryParameters = $signatureQueryParameters;
40
        $this->ignored = $ignored;
41
        $this->logger = $logger;
42
    }
43
44
    public function handle(GetResponseEvent $event)
45
    {
46
        if (true === $this->ignored) {
47
            if (null !== $this->tokenStorage->getToken()) {
48
                return;
49
            }
50
51
            $this->tokenStorage->setToken(new AnonymousToken('request_signature', 'anon.', array()));
52
53
            return;
54
        }
55
56
        $request = $event->getRequest();
57
        $authToken = new RequestSignatureToken;
58
        $authToken->signature = $request->get($this->signatureQueryParameters->getNonceQueryParameter());
59
        $authToken->signatureTime = $request->get($this->signatureQueryParameters->getTimeQueryParameter());
60
        $authToken->requestMethod = $request->server->get('REQUEST_METHOD');
61
        $authToken->requestHost = $request->server->get('HTTP_HOST');
62
        $authToken->requestPathInfo = $request->getPathInfo();
63
        $authToken->requestContent = rawurldecode($request->getContent());
64
65
        try {
66
            return $this->tokenStorage->setToken(
67
                $this->authenticationManager->authenticate($authToken)
68
            );
69
        } catch (AuthenticationException $e) {
70
            if ($this->logger) {
71
                $this->logger->info(sprintf('Authentication request failed: %s', $e->getMessage()));
72
            }
73
        }
74
75
        $response = new Response();
76
        $response->setStatusCode(403);
77
        $event->setResponse($response);
78
    }
79
}
80