Completed
Push — master ( 1f2532...24b0b6 )
by Roel van
03:37 queued 13s
created

RememberMeService   A

Complexity

Total Complexity 19

Size/Duplication

Total Lines 174
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Test Coverage

Coverage 98.28%

Importance

Changes 7
Bugs 1 Features 0
Metric Value
wmc 19
c 7
b 1
f 0
lcom 1
cbo 6
dl 0
loc 174
ccs 57
cts 58
cp 0.9828
rs 10

13 Methods

Rating   Name   Duplication   Size   Complexity  
A createNew() 0 23 2
B getNextInSerie() 0 19 5
A getNewExpireDate() 0 4 1
A removeSerie() 0 7 2
A generateRandom() 0 4 1
A getMapper() 0 4 1
A setMapper() 0 5 1
A getModuleOptions() 0 4 1
A setModuleOptions() 0 5 1
A setIpService() 0 5 1
A getIpService() 0 4 1
A setRequest() 0 4 1
A getRequest() 0 4 1
1
<?php
2
3
namespace JwPersistentUser\Service;
4
5
use JwPersistentUser\Model\ModuleOptions;
6
use JwPersistentUser\Model\SerieTokenInterface;
7
use JwPersistentUser\Mapper\SerieTokenMapperInterface;
8
9
use Zend\Math\Rand;
10
use Zend\Http\Request;
11
use Zend\Http\PhpEnvironment\RemoteAddress;
12
13
class RememberMeService
14
{
15
    /**
16
     * @var Request
17
     */
18
    protected $request;
19
20
    /**
21
     * @var RemoteAddress
22
     */
23
    protected $ipService;
24
25
    /**
26
     * @var SerieTokenMapperInterface
27
     */
28
    protected $mapper;
29
30
    /**
31
     * @var ModuleOptions
32
     */
33
    protected $moduleOptions;
34
35
    /**
36
     * @param int $userId
37
     * @return SerieTokenInterface
38
     */
39 1
    public function createNew($userId)
40
    {
41 1
        $serieTokenClass = $this->getModuleOptions()->getSerieTokenEntityClass();
42 1
        $serieToken = new $serieTokenClass;
43
44
        /** @var $serieToken SerieTokenInterface */
45 1
        $serieToken->setUserId($userId);
46 1
        $serieToken->setSerie($this->generateRandom());
47 1
        $serieToken->setToken($this->generateRandom());
48 1
        $serieToken->setExpiresAt($this->getNewExpireDate());
49 1
        $serieToken->setIpAddress($this->getIpService()->getIpAddress());
50
51 1
        $userAgentHeader = $this->getRequest()->getHeader('UserAgent');
52 1
        if ($userAgentHeader !== false) {
53 1
            $serieToken->setUserAgent($userAgentHeader->getFieldValue());
0 ignored issues
show
Bug introduced by
The method getFieldValue does only exist in Zend\Http\Header\HeaderInterface, but not in ArrayIterator.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
54 1
        } else {
55
            $serieToken->setUserAgent('');
56
        }
57
58 1
        $this->getMapper()->persist($serieToken);
59
60 1
        return $serieToken;
61
    }
62
63
    /**
64
     * @param SerieTokenInterface $serieToken
65
     * @return SerieTokenInterface|null
66
     */
67 4
    public function getNextInSerie(SerieTokenInterface $serieToken)
68
    {
69 4
        $matchingSerieToken = $this->getMapper()->find($serieToken->getUserId(), $serieToken->getSerie());
70 4
        if (!$matchingSerieToken) {
71 1
            return null;
72 3
        } elseif (!$matchingSerieToken->getExpiresAt() || $matchingSerieToken->getExpiresAt() < new \DateTime) {
73 1
            return null;
74 2
        } elseif ($matchingSerieToken->getToken() !== $serieToken->getToken()) {
75 1
            $this->removeSerie($serieToken->getUserId(), $serieToken->getSerie());
76 1
            return null;
77
        }
78
79
        // Generate new token in the serie
80 1
        $matchingSerieToken->setToken($this->generateRandom());
81 1
        $matchingSerieToken->setExpiresAt($this->getNewExpireDate());
82 1
        $this->getMapper()->persist($matchingSerieToken);
83
84 1
        return $matchingSerieToken;
85
    }
86
87
    /**
88
     * @return \DateTime
89
     */
90 2
    protected function getNewExpireDate()
91
    {
92 2
        return new \DateTime('+1 year');
93
    }
94
95
    /**
96
     * @param int $userId
97
     * @param string $serieId
98
     */
99 2
    public function removeSerie($userId, $serieId)
100
    {
101 2
        $serieToken = $this->getMapper()->find($userId, $serieId);
102 2
        if ($serieToken) {
103 2
            $this->getMapper()->remove($serieToken);
104 2
        }
105 2
    }
106
107
    /**
108
     * @note Should NOT contain semicolons.
109
     *
110
     * @return string
111
     */
112 2
    private function generateRandom()
113
    {
114 2
        return Rand::getString(10);
115
    }
116
117
    /**
118
     * @return SerieTokenMapper
119
     */
120 6
    public function getMapper()
121
    {
122 6
        return $this->mapper;
123
    }
124
125
    /**
126
     * @param SerieTokenMapper $mapper
127
     * @return $this
128
     */
129 6
    public function setMapper($mapper)
130
    {
131 6
        $this->mapper = $mapper;
0 ignored issues
show
Documentation Bug introduced by
It seems like $mapper of type object<JwPersistentUser\Service\SerieTokenMapper> is incompatible with the declared type object<JwPersistentUser\...ieTokenMapperInterface> of property $mapper.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
132 6
        return $this;
133
    }
134
135
    /**
136
     * @return ModuleOptions
137
     */
138 1
    public function getModuleOptions()
139
    {
140 1
        return $this->moduleOptions;
141
    }
142
143
    /**
144
     * @param ModuleOptions $moduleOptions
145
     * @return $this
146
     */
147 6
    public function setModuleOptions($moduleOptions)
148
    {
149 6
        $this->moduleOptions = $moduleOptions;
150 6
        return $this;
151
    }
152
153
    /**
154
     * @param RemoteAddress $ipService
155
     * @return $this
156
     */
157 6
    public function setIpService($ipService)
158
    {
159 6
        $this->ipService = $ipService;
160 6
        return $this;
161
    }
162
163
    /**
164
     * @return RemoteAddress
165
     */
166 1
    public function getIpService()
167
    {
168 1
        return $this->ipService;
169
    }
170
171
    /**
172
     * @param Request $request
173
     */
174 6
    public function setRequest($request)
175
    {
176 6
        $this->request = $request;
177 6
    }
178
179
    /**
180
     * @return Request
181
     */
182 1
    public function getRequest()
183
    {
184 1
        return $this->request;
185
    }
186
}
187