Passed
Push — master ( ff614d...6c840c )
by Anton
05:03 queued 02:24
created

CookiesBootloader::cookieQueue()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 4
dl 0
loc 8
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 1
1
<?php
2
/**
3
 * Spiral Framework.
4
 *
5
 * @license   MIT
6
 * @author    Anton Titov (Wolfy-J)
7
 */
8
declare(strict_types=1);
9
10
namespace Spiral\Bootloader\Http;
11
12
use Psr\Http\Message\ServerRequestInterface;
13
use Spiral\Boot\Bootloader\Bootloader;
14
use Spiral\Config\ConfiguratorInterface;
15
use Spiral\Config\Patch\Append;
16
use Spiral\Cookies\Config\CookiesConfig;
17
use Spiral\Cookies\CookieQueue;
18
use Spiral\Cookies\Middleware\CookiesMiddleware;
19
use Spiral\Core\Container\SingletonInterface;
20
use Spiral\Core\Exception\ScopeException;
21
22
final class CookiesBootloader extends Bootloader implements SingletonInterface
23
{
24
    protected const DEPENDENCIES = [
25
        HttpBootloader::class
26
    ];
27
28
    protected const BINDINGS = [
29
        CookieQueue::class => [self::class, 'cookieQueue']
30
    ];
31
32
    /** @var ConfiguratorInterface */
33
    private $config;
34
35
    /**
36
     * @param ConfiguratorInterface $config
37
     */
38
    public function __construct(ConfiguratorInterface $config)
39
    {
40
        $this->config = $config;
41
    }
42
43
    /**
44
     * @param HttpBootloader $http
45
     */
46
    public function boot(HttpBootloader $http)
47
    {
48
        $this->config->setDefaults('cookies', [
49
            'domain'   => '.%s',
50
            'method'   => CookiesConfig::COOKIE_ENCRYPT,
51
            'excluded' => ['PHPSESSID', 'csrf-token']
52
        ]);
53
54
        $http->addMiddleware(CookiesMiddleware::class);
55
    }
56
57
    /**
58
     * Disable protection for given cookie.
59
     *
60
     * @param string $cookie
61
     */
62
    public function whitelistCookie(string $cookie)
63
    {
64
        $this->config->modify('cookies', new Append('excluded', null, $cookie));
65
    }
66
67
    /**
68
     * @param ServerRequestInterface $request
69
     * @return CookieQueue
70
     */
71
    private function cookieQueue(ServerRequestInterface $request): CookieQueue
72
    {
73
        $cookieQueue = $request->getAttribute(CookieQueue::ATTRIBUTE, null);
74
        if ($cookieQueue === null) {
75
            throw new ScopeException("Unable to resolve CookieQueue, invalid request scope");
76
        }
77
78
        return $cookieQueue;
79
    }
80
}
81