Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 7 |
CRAP | |
0.00% |
0 / 48 |
SessionHandler | |
0.00% |
0 / 1 |
|
0.00% |
0 / 7 |
110 | |
0.00% |
0 / 48 |
__construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
open | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
read | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 8 |
|||
write | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 23 |
|||
close | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
destroy | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 5 |
|||
gc | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 5 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\Core\Session\SessionHandler. | |
*/ | |
namespace Drupal\Core\Session; | |
use Drupal\Component\Utility\Crypt; | |
use Drupal\Core\Database\Connection; | |
use Drupal\Core\DependencyInjection\DependencySerializationTrait; | |
use Drupal\Core\Utility\Error; | |
use Symfony\Component\HttpFoundation\RequestStack; | |
use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy; | |
/** | |
* Default session handler. | |
*/ | |
class SessionHandler extends AbstractProxy implements \SessionHandlerInterface { | |
use DependencySerializationTrait; | |
/** | |
* The request stack. | |
* | |
* @var \Symfony\Component\HttpFoundation\RequestStack | |
*/ | |
protected $requestStack; | |
/** | |
* The database connection. | |
* | |
* @var \Drupal\Core\Database\Connection | |
*/ | |
protected $connection; | |
/** | |
* Constructs a new SessionHandler instance. | |
* | |
* @param \Symfony\Component\HttpFoundation\RequestStack $request_stack | |
* The request stack. | |
* @param \Drupal\Core\Database\Connection $connection | |
* The database connection. | |
*/ | |
public function __construct(RequestStack $request_stack, Connection $connection) { | |
$this->requestStack = $request_stack; | |
$this->connection = $connection; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function open($save_path, $name) { | |
return TRUE; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function read($sid) { | |
$data = ''; | |
if (!empty($sid)) { | |
// Read the session data from the database. | |
$query = $this->connection | |
->queryRange('SELECT session FROM {sessions} WHERE sid = :sid', 0, 1, [':sid' => Crypt::hashBase64($sid)]); | |
$data = (string) $query->fetchField(); | |
} | |
return $data; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function write($sid, $value) { | |
// The exception handler is not active at this point, so we need to do it | |
// manually. | |
try { | |
$request = $this->requestStack->getCurrentRequest(); | |
$fields = array( | |
'uid' => $request->getSession()->get('uid', 0), | |
'hostname' => $request->getClientIP(), | |
'session' => $value, | |
'timestamp' => REQUEST_TIME, | |
); | |
$this->connection->merge('sessions') | |
->keys(array('sid' => Crypt::hashBase64($sid))) | |
->fields($fields) | |
->execute(); | |
return TRUE; | |
} | |
catch (\Exception $exception) { | |
require_once DRUPAL_ROOT . '/core/includes/errors.inc'; | |
// If we are displaying errors, then do so with no possibility of a | |
// further uncaught exception being thrown. | |
if (error_displayable()) { | |
print '<h1>Uncaught exception thrown in session handler.</h1>'; | |
print '<p>' . Error::renderExceptionSafe($exception) . '</p><hr />'; | |
} | |
return FALSE; | |
} | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function close() { | |
return TRUE; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function destroy($sid) { | |
// Delete session data. | |
$this->connection->delete('sessions') | |
->condition('sid', Crypt::hashBase64($sid)) | |
->execute(); | |
return TRUE; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function gc($lifetime) { | |
// Be sure to adjust 'php_value session.gc_maxlifetime' to a large enough | |
// value. For example, if you want user sessions to stay in your database | |
// for three weeks before deleting them, you need to set gc_maxlifetime | |
// to '1814400'. At that value, only after a user doesn't log in after | |
// three weeks (1814400 seconds) will his/her session be removed. | |
$this->connection->delete('sessions') | |
->condition('timestamp', REQUEST_TIME - $lifetime, '<') | |
->execute(); | |
return TRUE; | |
} | |
} |