Issues (71)

Security Analysis    no request data  

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Header Injection
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

src/Time/TimeInterval.php (3 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
/**
4
 * GpsLab component.
5
 *
6
 * @author    Peter Gribanov <[email protected]>
7
 * @copyright Copyright (c) 2016, Peter Gribanov
8
 * @license   http://opensource.org/licenses/MIT
9
 */
10
11
namespace GpsLab\Component\Interval\Time;
12
13
use GpsLab\Component\Interval\Exception\IncorrectIntervalException;
14
use GpsLab\Component\Interval\Exception\InvalidIntervalFormatException;
15
use GpsLab\Component\Interval\IntervalComparator;
16
use GpsLab\Component\Interval\ComparableIntervalInterface;
17
use GpsLab\Component\Interval\IntervalPointInterface;
18
use GpsLab\Component\Interval\IntervalType;
19
20 View Code Duplication
class TimeInterval implements ComparableIntervalInterface
0 ignored issues
show
This class seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
21
{
22
    /**
23
     * @var string
24
     */
25
    const REGEXP = '/^
26
        (?:\(|\[)                   # start type char
27
        \s*
28
        (?<start>\d{2}:\d{2}:\d{2}) # start point
29
        \s*,\s*                     # separator
30
        (?<end>\d{2}:\d{2}:\d{2})   # end point
31
        \s*
32
        (?:\)|\])                   # end type char
33
    $/x';
34
35
    /**
36
     * @var IntervalType
37
     */
38
    private $type;
39
40
    /**
41
     * @var IntervalComparator
42
     */
43
    private $comparator;
44
45
    /**
46
     * @var TimeIntervalPoint
47
     */
48
    private $start;
49
50
    /**
51
     * @var TimeIntervalPoint
52
     */
53
    private $end;
54
55
    /**
56
     * @param TimeIntervalPoint $start
57
     * @param TimeIntervalPoint $end
58
     * @param IntervalType $type
59
     */
60 4
    private function __construct(TimeIntervalPoint $start, TimeIntervalPoint $end, IntervalType $type)
61
    {
62 4
        if ($start->gte($end)) {
63
            throw IncorrectIntervalException::create();
64
        }
65
66 4
        $this->type = $type;
67 4
        $this->start = $start;
68 4
        $this->end = $end;
69 4
        $this->comparator = new IntervalComparator($this);
70 4
    }
71
72
    /**
73
     * @param \DateTime $start
74
     * @param \DateTime $end
75
     * @param IntervalType $type
76
     *
77
     * @return self
78
     */
79 4
    public static function create(\DateTime $start, \DateTime $end, IntervalType $type)
80
    {
81 4
        return new self(new TimeIntervalPoint($start), new TimeIntervalPoint($end), $type);
82
    }
83
84
    /**
85
     * @param \DateTime $start
86
     * @param \DateTime $end
87
     *
88
     * @return self
89
     */
90 1
    public static function closed(\DateTime $start, \DateTime $end)
91
    {
92 1
        return static::create($start, $end, IntervalType::closed());
93
    }
94
95
    /**
96
     * @param \DateTime $start
97
     * @param \DateTime $end
98
     *
99
     * @return self
100
     */
101
    public static function halfClosed(\DateTime $start, \DateTime $end)
102
    {
103
        return static::create($start, $end, IntervalType::halfClosed());
104
    }
105
106
    /**
107
     * @param \DateTime $start
108
     * @param \DateTime $end
109
     *
110
     * @return self
111
     */
112
    public static function halfOpen(\DateTime $start, \DateTime $end)
113
    {
114
        return static::create($start, $end, IntervalType::halfOpen());
115
    }
116
117
    /**
118
     * @param \DateTime $start
119
     * @param \DateTime $end
120
     *
121
     * @return self
122
     */
123 1
    public static function open(\DateTime $start, \DateTime $end)
124
    {
125 1
        return static::create($start, $end, IntervalType::open());
126
    }
127
128
    /**
129
     * Create interval from string.
130
     *
131
     * Example formats for all interval types:
132
     *   [02:55:00, 12:30:12]
133
     *   (12:04:45, 19:38:14]
134
     *   [17:31:09, 23:45:58)
135
     *   (15:03:37, 15:06:34)
136
     *
137
     * Spaces are ignored in format.
138
     *
139
     * @param string $string
140
     *
141
     * @return self
142
     */
143 2
    public static function fromString($string)
144
    {
145 2
        if (!preg_match(self::REGEXP, $string, $match)) {
146
            throw InvalidIntervalFormatException::create('[HH:II:SS, HH:II:SS]', $string);
147
        }
148
149 2
        return self::create(
150 2
            new \DateTime($match['start']),
151 2
            new \DateTime($match['end']),
152 2
            IntervalType::fromString($string)
153
        );
154
    }
155
156
    /**
157
     * Checks if this interval is equal to the specified interval.
158
     *
159
     * @param TimeInterval $interval
160
     *
161
     * @return bool
162
     */
163
    public function equal(self $interval)
164
    {
165
        return $this->comparator->equal($interval);
166
    }
167
168
    /**
169
     * Does this interval contain the specified point.
170
     *
171
     * @param \DateTime $point
172
     *
173
     * @return bool
174
     */
175
    public function contains(\DateTime $point)
176
    {
177
        return $this->comparator->contains(new TimeIntervalPoint($point));
178
    }
179
180
    /**
181
     * Does this interval intersect the specified interval.
182
     *
183
     * @param TimeInterval $interval
184
     *
185
     * @return bool
186
     */
187
    public function intersects(self $interval)
188
    {
189
        return $this->comparator->intersects($interval);
190
    }
191
192
    /**
193
     * Gets the intersection between this interval and another interval.
194
     *
195
     * @param TimeInterval $interval
196
     *
197
     * @return self|null
198
     */
199
    public function intersection(self $interval)
200
    {
201
        return $this->comparator->intersection($interval);
202
    }
203
204
    /**
205
     * Gets the covered interval between this Interval and another interval.
206
     *
207
     * @param TimeInterval $interval
208
     *
209
     * @return self
210
     */
211
    public function cover(self $interval)
212
    {
213
        return $this->comparator->cover($interval);
214
    }
215
216
    /**
217
     * Gets the gap between this interval and another interval.
218
     *
219
     * @param TimeInterval $interval
220
     *
221
     * @return self|null
222
     */
223
    public function gap(self $interval)
224
    {
225
        return $this->comparator->gap($interval);
226
    }
227
228
    /**
229
     * Does this interval abuts with the interval specified.
230
     *
231
     * @param TimeInterval $interval
232
     *
233
     * @return bool
234
     */
235
    public function abuts(self $interval)
236
    {
237
        return $this->comparator->abuts($interval);
238
    }
239
240
    /**
241
     * Joins the interval between the adjacent.
242
     *
243
     * @param TimeInterval $interval
244
     *
245
     * @return self|null
246
     */
247
    public function join(self $interval)
248
    {
249
        return $this->comparator->join($interval);
250
    }
251
252
    /**
253
     * Gets the union between this interval and another interval.
254
     *
255
     * @param TimeInterval $interval
256
     *
257
     * @return self|null
258
     */
259
    public function union(self $interval)
260
    {
261
        return $this->comparator->union($interval);
262
    }
263
264
    /**
265
     * The point is before the interval.
266
     *
267
     * @param \DateTime $point
268
     *
269
     * @return bool
270
     */
271
    public function before(\DateTime $point)
272
    {
273
        return $this->comparator->before(new TimeIntervalPoint($point));
274
    }
275
276
    /**
277
     * The point is after the interval.
278
     *
279
     * @param \DateTime $point
280
     *
281
     * @return bool
282
     */
283
    public function after(\DateTime $point)
284
    {
285
        return $this->comparator->after(new TimeIntervalPoint($point));
286
    }
287
288
    /**
289
     * @param \DateInterval|null $step
290
     *
291
     * @return \Generator
292
     */
293 2
    public function iterate(\DateInterval $step = null)
294
    {
295 2
        $step = $step ?: new \DateInterval('PT1M');
296
297 2
        $date = $this->start();
298 2
        $end = $this->end();
299
300 2
        if ($this->type->startExcluded()) {
301 1
            $date->add($step);
302
        }
303
304 2
        while ($date < $end || (!$this->type->endExcluded() && $date == $end)) {
305 2
            yield $date;
306 2
            $date->add($step);
307
        }
308 2
    }
309
310
    /**
311
     * @param \DateInterval|null $step
312
     *
313
     * @return \DatePeriod
314
     */
315
    public function period(\DateInterval $step = null)
316
    {
317
        $step = $step ?: new \DateInterval('PT1M');
318
319
        return new \DatePeriod($this->start(), $step, $this->end());
320
    }
321
322
    /**
323
     * @return IntervalType
324
     */
325
    public function type()
326
    {
327
        return $this->type;
328
    }
329
330
    /**
331
     * @return \DateTime
332
     */
333 2
    public function start()
334
    {
335 2
        return $this->start->value();
336
    }
337
338
    /**
339
     * @return \DateTime
340
     */
341 2
    public function end()
342
    {
343 2
        return $this->end->value();
344
    }
345
346
    /**
347
     * @return TimeIntervalPoint
348
     */
349 1
    public function startPoint()
350
    {
351 1
        return $this->start;
352
    }
353
354
    /**
355
     * @return TimeIntervalPoint
356
     */
357 1
    public function endPoint()
358
    {
359 1
        return $this->end;
360
    }
361
362
    /**
363
     * Returns a copy of this Interval with the start point altered.
364
     *
365
     * @param IntervalPointInterface|TimeIntervalPoint $start
366
     *
367
     * @return self
368
     */
369
    public function withStart(IntervalPointInterface $start)
370
    {
371
        return new self($start, $this->end, $this->type);
0 ignored issues
show
$start of type object<GpsLab\Component\...IntervalPointInterface> is not a sub-type of object<GpsLab\Component\...Time\TimeIntervalPoint>. It seems like you assume a concrete implementation of the interface GpsLab\Component\Interval\IntervalPointInterface to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
372
    }
373
374
    /**
375
     * Returns a copy of this Interval with the end point altered.
376
     *
377
     * @param IntervalPointInterface|TimeIntervalPoint $end
378
     *
379
     * @return self
380
     */
381
    public function withEnd(IntervalPointInterface $end)
382
    {
383
        return new self($this->start, $end, $this->type);
0 ignored issues
show
$end of type object<GpsLab\Component\...IntervalPointInterface> is not a sub-type of object<GpsLab\Component\...Time\TimeIntervalPoint>. It seems like you assume a concrete implementation of the interface GpsLab\Component\Interval\IntervalPointInterface to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
384
    }
385
386
    /**
387
     * Returns a copy of this Interval with the interval type altered.
388
     *
389
     * @param IntervalType $type
390
     *
391
     * @return self
392
     */
393
    public function withType(IntervalType $type)
394
    {
395
        return new self($this->start, $this->end, $type);
396
    }
397
398
    /**
399
     * @return string
400
     */
401 1
    public function __toString()
402
    {
403 1
        return $this->type->formatInterval($this);
404
    }
405
}
406