Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 5 |
CRAP | |
0.00% |
0 / 39 |
DatabaseBackend | |
0.00% |
0 / 1 |
|
0.00% |
0 / 5 |
72 | |
0.00% |
0 / 39 |
__construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
register | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 12 |
|||
clear | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 8 |
|||
isAllowed | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 12 |
|||
garbageCollection | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\Core\Flood\DatabaseBackend. | |
*/ | |
namespace Drupal\Core\Flood; | |
use Symfony\Component\HttpFoundation\RequestStack; | |
use Drupal\Core\Database\Connection; | |
/** | |
* Defines the database flood backend. This is the default Drupal backend. | |
*/ | |
class DatabaseBackend implements FloodInterface { | |
/** | |
* The database connection used to store flood event information. | |
* | |
* @var \Drupal\Core\Database\Connection | |
*/ | |
protected $connection; | |
/** | |
* The request stack. | |
* | |
* @var \Symfony\Component\HttpFoundation\RequestStack | |
*/ | |
protected $requestStack; | |
/** | |
* Construct the DatabaseBackend. | |
* | |
* @param \Drupal\Core\Database\Connection $connection | |
* The database connection which will be used to store the flood event | |
* information. | |
* @param \Symfony\Component\HttpFoundation\RequestStack $request_stack | |
* The request stack used to retrieve the current request. | |
*/ | |
public function __construct(Connection $connection, RequestStack $request_stack) { | |
$this->connection = $connection; | |
$this->requestStack = $request_stack; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function register($name, $window = 3600, $identifier = NULL) { | |
if (!isset($identifier)) { | |
$identifier = $this->requestStack->getCurrentRequest()->getClientIp(); | |
} | |
$this->connection->insert('flood') | |
->fields(array( | |
'event' => $name, | |
'identifier' => $identifier, | |
'timestamp' => REQUEST_TIME, | |
'expiration' => REQUEST_TIME + $window, | |
)) | |
->execute(); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function clear($name, $identifier = NULL) { | |
if (!isset($identifier)) { | |
$identifier = $this->requestStack->getCurrentRequest()->getClientIp(); | |
} | |
$this->connection->delete('flood') | |
->condition('event', $name) | |
->condition('identifier', $identifier) | |
->execute(); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function isAllowed($name, $threshold, $window = 3600, $identifier = NULL) { | |
if (!isset($identifier)) { | |
$identifier = $this->requestStack->getCurrentRequest()->getClientIp(); | |
} | |
$number = $this->connection->select('flood', 'f') | |
->condition('event', $name) | |
->condition('identifier', $identifier) | |
->condition('timestamp', REQUEST_TIME - $window, '>') | |
->countQuery() | |
->execute() | |
->fetchField(); | |
return ($number < $threshold); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function garbageCollection() { | |
return $this->connection->delete('flood') | |
->condition('expiration', REQUEST_TIME, '<') | |
->execute(); | |
} | |
} |