Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 6 |
CRAP | |
0.00% |
0 / 30 |
MemoryBackend | |
0.00% |
0 / 1 |
|
0.00% |
0 / 6 |
132 | |
0.00% |
0 / 30 |
__construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
register | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 6 |
|||
clear | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 5 |
|||
isAllowed | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 8 |
|||
anonymous function | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
|||
garbageCollection | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 2 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\Core\Flood\MemoryBackend. | |
*/ | |
namespace Drupal\Core\Flood; | |
use Symfony\Component\HttpFoundation\RequestStack; | |
/** | |
* Defines the memory flood backend. This is used for testing. | |
*/ | |
class MemoryBackend implements FloodInterface { | |
/** | |
* The request stack. | |
* | |
* @var \Symfony\Component\HttpFoundation\RequestStack | |
*/ | |
protected $requestStack; | |
/** | |
* An array holding flood events, keyed by event name and identifier. | |
*/ | |
protected $events = array(); | |
/** | |
* Construct the MemoryBackend. | |
* | |
* @param \Symfony\Component\HttpFoundation\RequestStack $request_stack | |
* The request stack used to retrieve the current request. | |
*/ | |
public function __construct(RequestStack $request_stack) { | |
$this->requestStack = $request_stack; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function register($name, $window = 3600, $identifier = NULL) { | |
if (!isset($identifier)) { | |
$identifier = $this->requestStack->getCurrentRequest()->getClientIp(); | |
} | |
// We can't use REQUEST_TIME here, because that would not guarantee | |
// uniqueness. | |
$time = microtime(TRUE); | |
$this->events[$name][$identifier][$time + $window] = $time; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function clear($name, $identifier = NULL) { | |
if (!isset($identifier)) { | |
$identifier = $this->requestStack->getCurrentRequest()->getClientIp(); | |
} | |
unset($this->events[$name][$identifier]); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function isAllowed($name, $threshold, $window = 3600, $identifier = NULL) { | |
if (!isset($identifier)) { | |
$identifier = $this->requestStack->getCurrentRequest()->getClientIp(); | |
} | |
$limit = microtime(TRUE) - $window; | |
$number = count(array_filter($this->events[$name][$identifier], function ($timestamp) use ($limit) { | |
return $timestamp > $limit; | |
})); | |
return ($number < $threshold); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function garbageCollection() { | |
foreach ($this->events as $name => $identifiers) { | |
foreach ($this->events[$name] as $identifier => $timestamps) { | |
// Filter by key (expiration) but preserve key => value associations. | |
$this->events[$name][$identifier] = array_filter($timestamps, function () use (&$timestamps) { | |
$expiration = key($timestamps); | |
next($timestamps); | |
return $expiration > microtime(TRUE); | |
}); | |
} | |
} | |
} | |
} |