simpleautologout-8.x-1.6/simpleautologout.module
simpleautologout.module
<?php
/**
* @file
* Contains simpleautologout.module.
*/
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Url;
/**
* Implements hook_help().
*/
function simpleautologout_help($route_name, RouteMatchInterface $route_match) {
switch ($route_name) {
case 'help.page.simple_autologout':
$output = '<h3>' . t('About Simple Autologout') . '</h3>';
$output .= '<p>' . t("This module allows you to force site users to be logged out after a given amount of time due to inactivity.") . '</p>';
return $output;
}
}
/**
* Implements hook_page_attachments().
*
* Add a form element to every page which is used to detect if the page was
* loaded from browser cache. This happens when the browser's back button is
* pressed for example. The JS will set the value of the hidden input element
* to 1 after initial load. If this is 1 on subsequent loads, the page was
* loaded from cache and an autologout timeout refresh needs to be triggered.
*/
function simpleautologout_page_attachments(array &$page) {
if (\Drupal::currentUser()->isAuthenticated()) {
$service = \Drupal::service('tempstore.private')->get('simpleautologout');
$service->set('simpleautologout_session_time', time());
$simpleautologout_session_time = $service->get('simpleautologout_session_time');
$settings = \Drupal::config('simpleautologout.settings');
$timeout = $settings->get('timeout');
$max_timeout = $settings->get('max_timeout');
$timeout_refresh_rate = $settings->get('timeout_refresh_rate');
$redirect_url = $settings->get('redirect_url');
$redirect_query = \Drupal::service('redirect.destination')->getAsArray() + ['autologout_timeout' => 1];
// Get all settings JS will needed.
$settings = [
'timeout' => $timeout * 1000,
'max_timeout' => $max_timeout * 1000,
'timeout_refresh_rate' => $timeout_refresh_rate * 1000,
'simpleautologout_session_time' => $simpleautologout_session_time * 1000,
'redirect_url' => Url::fromUserInput($redirect_url, ['query' => $redirect_query])->toString(),
];
// If this is an AJAX request, then the logout redirect url should still be
// referring to the page that generated this request.
if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
global $base_url;
$relative_url = str_replace($base_url . '/', '', $_SERVER['HTTP_REFERER']);
$settings['redirect_url'] = Url::fromUserInput($redirect_url, [
'query' => ['destination' => urlencode($relative_url)],
'autologout_timeout' => 1,
]);
}
simpleautologout_attach_js($page, $settings);
}
}
/**
* Adds the necessary js and libraries.
*
* @param array $element
* The renderable array element to #attach the js to.
* @param array $settings
* The JS Settings.
*/
function simpleautologout_attach_js(array &$element, array $settings) {
$element['#attached']['drupalSettings']['simpleautologout'] = $settings;
$element['#attached']['library'][] = 'simpleautologout/drupal.simpleautologout';
}
/**
* Implements hook_user_login().
*
* Delete stale sessions for the user on login.
*/
function simpleautologout_user_login($account) {
$timeout = \Drupal::config('simpleautologout.settings')->get('timeout');
$max_timeout = \Drupal::config('simpleautologout.settings')->get('max_timeout');
$request_timestamp = \Drupal::time()->getRequestTime();
$timestamp = $request_timestamp - ($timeout + $max_timeout);
// Find all stale sessions.
$database = \Drupal::database();
$sids = $database->select('sessions', 's')
->fields('s', ['sid'])
->condition('uid', $account->id())
->condition('timestamp', $timestamp, '<')
->orderBy('timestamp', 'DESC')
->execute()
->fetchCol();
if (!empty($sids)) {
// Delete stale sessions at login.
$database->delete('sessions')
->condition('sid', $sids, 'IN')
->execute();
}
}
/**
* Implements hook_cron().
*
* Delete stale sessions from database.
*/
function simpleautologout_cron() {
$timeout = \Drupal::config('simpleautologout.settings')->get('timeout');
$max_timeout = \Drupal::config('simpleautologout.settings')->get('max_timeout');
$request_timestamp = \Drupal::time()->getRequestTime();
$timestamp = $request_timestamp - ($timeout + $max_timeout);
$database = \Drupal::database();
$sids = $database->select('sessions', 's')
->fields('s', ['sid'])
->condition('timestamp', $timestamp, '<')
->orderBy('timestamp', 'DESC')
->execute()
->fetchCol();
if (!empty($sids)) {
// Delete stale sessions at login.
$database->delete('sessions')
->condition('sid', $sids, 'IN')
->execute();
}
}
