Test Setup Failed
Push — dependabot/composer/squizlabs/... ( de5def )
by
unknown
14:28
created

CookieService   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 103
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Importance

Changes 0
Metric Value
wmc 11
lcom 1
cbo 6
dl 0
loc 103
rs 10
c 0
b 0
f 0

7 Methods

Rating   Name   Duplication   Size   Complexity  
A read() 0 23 5
A writeNull() 0 9 1
A writeSerie() 0 14 1
A appendWithDefaultParameters() 0 5 1
A setCookie() 0 4 1
A getModuleOptions() 0 4 1
A setModuleOptions() 0 5 1
1
<?php
2
3
namespace JwPersistentUser\Service;
4
5
use JwPersistentUser\Model\ModuleOptions;
6
use JwPersistentUser\Model\SerieTokenInterface;
7
8
use Zend\Http\Request;
9
use Zend\Http\Response;
10
use Zend\Http\Header\SetCookie;
11
12
class CookieService
13
{
14
    const COOKIE_NAME = 'JwPersistentUser';
15
16
    /**
17
     * @var ModuleOptions
18
     */
19
    protected $moduleOptions;
20
21
    /**
22
     * @param Request $request
23
     * @param Response|null $response
24
     * @return SerieTokenInterface|null
25
     */
26
    public function read(Request $request, Response $response = null)
27
    {
28
        $cookie = $request->getCookie();
29
        if (!isset($cookie[self::COOKIE_NAME])) {
30
            return null;
31
        }
32
33
        $parts = explode(':', $cookie[self::COOKIE_NAME]);
34
        if (!is_array($parts) || count($parts) !== 3) {
35
            if ($response) {
36
                $this->writeNull($response);
37
            }
38
            return null;
39
        }
40
41
        $serieTokenEntityClass = $this->getModuleOptions()->getSerieTokenEntityClass();
42
        $serieToken = new $serieTokenEntityClass;
43
        $serieToken->setUserId($parts[0]);
44
        $serieToken->setSerie($parts[1]);
45
        $serieToken->setToken($parts[2]);
46
47
        return $serieToken;
48
    }
49
50
    /**
51
     * @return SetCookie
52
     */
53
    public function writeNull(Response $response)
54
    {
55
        $this->setCookie($response, $this->appendWithDefaultParameters(new SetCookie(
56
            self::COOKIE_NAME,
57
            null,
58
            time()  - 3600,
59
            '/'
60
        )));
61
    }
62
63
    /**
64
     * @param SerieTokenInterface $serieToken
65
     * @return SetCookie
66
     */
67
    public function writeSerie(Response $response, SerieTokenInterface $serieToken)
68
    {
69
        $serieRepresentation =
70
            $serieToken->getUserId() .
71
            ':' . $serieToken->getSerie() .
72
            ':' . $serieToken->getToken();
73
74
        $this->setCookie($response, $this->appendWithDefaultParameters(new SetCookie(
75
            self::COOKIE_NAME,
76
            $serieRepresentation,
77
            $serieToken->getExpiresAt()->getTimestamp(),
78
            '/'
79
        )));
80
    }
81
82
    private function appendWithDefaultParameters(SetCookie $header)
83
    {
84
        $header->setHttponly(true);
85
        return $header;
86
    }
87
88
    /**
89
     * @param Response $response
90
     * @param SetCookie $cookie
91
     */
92
    protected static function setCookie(Response $response, SetCookie $cookie)
93
    {
94
        $response->getHeaders()->addHeader($cookie);
95
    }
96
97
    /**
98
     * @return ModuleOptions
99
     */
100
    public function getModuleOptions()
101
    {
102
        return $this->moduleOptions;
103
    }
104
105
    /**
106
     * @param ModuleOptions $moduleOptions
107
     * @return $this
108
     */
109
    public function setModuleOptions($moduleOptions)
110
    {
111
        $this->moduleOptions = $moduleOptions;
112
        return $this;
113
    }
114
}
115