block_inactive_users-8.x-1.4/block_inactive_users.module
block_inactive_users.module
<?php
/**
* @file
* Module automatically disables inactive users.
*/
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\user\Entity\User;
use Drupal\user\UserInterface;
/**
* Implements hook_help().
*/
function block_inactive_users_help($route_name, RouteMatchInterface $route_match) {
switch ($route_name) {
case 'help.page.block_inactive_users':
$text = file_get_contents(dirname(__FILE__) . '/README.md');
if (!\Drupal::moduleHandler()->moduleExists('markdown')) {
return '<pre>' . $text . '</pre>';
}
else {
// Use the Markdown filter to render the README.
$filter_manager = \Drupal::service('plugin.manager.filter');
$settings = \Drupal::configFactory()->get('markdown.settings')->getRawData();
$config = ['settings' => $settings];
$filter = $filter_manager->createInstance('markdown', $config);
return $filter->process($text, 'en');
}
}
return NULL;
}
/**
* Implements hook_user_presave().
*/
function block_inactive_users_user_presave(UserInterface $account) {
// If this is an existing user that has been unblocked set the last access
// time to now to prevent them being blocked again next time cron runs if
// they haven't already logged in.
if (isset($account->original) &&
$account->isActive() &&
$account->original->isBlocked()) {
$account->setLastAccessTime(\Drupal::time()->getRequestTime());
}
}
/**
* Implements hook_cron().
*/
function block_inactive_users_cron() {
$usersHandler = \Drupal::service('block_inactive_users.deactivate_users');
// Warn users of impending block.
$usersHandler->warn();
// Disable inactive users based on configured rules.
block_inactive_users_block_users();
}
/**
* Implements hook_user_login().
*
* Remove users from warn list upon login.
*/
function block_inactive_users_user_login(UserInterface $account) {
block_inactive_users_unwarn($account->id());
}
/**
* Implements hook_mail().
*/
function block_inactive_users_mail($key, &$message, $params) {
switch ($key) {
case 'block_inactive_users_warn':
$message['subject'] = $params['subject'];
$message['body'][] = $params['body'];
break;
}
}
/**
* Helper function to disable inactive users based on configured rules.
*/
function block_inactive_users_block_users() {
$config = \Drupal::config('block_inactive_users.settings');
$usersHandler = \Drupal::service('block_inactive_users.deactivate_users');
$idle_time = $config->get('block_inactive_users_idle_time');
$idle_time_unit = $config->get('block_inactive_users_idle_time_unit') ?: 'months';
$include_never_accessed = $config->get('block_inactive_users_include_never_accessed');
$send_email = $config->get('block_inactive_users_send_email');
$users = $usersHandler->getUsers();
/** @var \Drupal\user\Entity\User $user */
foreach ($users as $user) {
$last_access = $user->getLastAccessedTime();
$current_time = time();
if ($last_access != 0 && $usersHandler->timestampdiff($last_access, $current_time, $idle_time_unit) >= $idle_time) {
$usersHandler->disableInactiveUsersStatus($user, $send_email);
}
// If option enabled to include blocking of users who have never logged in.
if ($include_never_accessed == 1 && $last_access == 0) {
$created_time = $user->getCreatedTime();
if ($usersHandler->timestampdiff($created_time, $current_time, $idle_time_unit) >= $idle_time) {
$usersHandler->disableInactiveUsersStatus($user, $send_email);
}
}
}
}
/**
* Helper function to Cancel Users based on configured rules.
*/
function block_inactive_users_block_cancel_users($action) {
$config = \Drupal::config('block_inactive_users.settings_cancel_users');
$usersHandler = \Drupal::service('block_inactive_users.deactivate_users');
$idle_time = $config->get('block_inactive_users_idle_time');
$idle_time_unit = $config->get('block_inactive_users_idle_time_unit') ?: 'months';
$include_never_accessed = $config->get('block_inactive_users_include_never_accessed');
$include_status = $config->get('block_inactive_users_include_status');
$include_user_roles = $config->get('block_inactive_users_include_roles');
$whitelist_user = $config->get('block_inactive_users_whitelist_user');
$whitelist_email = $config->get('block_inactive_users_whitelist_email');
$disable_account_method = $config->get('block_inactive_users_disable_account_method');
$block_inactive_users_cancel_email = $config->get('block_inactive_users_cancel_email');
$query = \Drupal::entityQuery('user');
// Exclude User 0 and 1.
$query->condition('uid', ['0', '1'], 'NOT IN');
if (!empty($include_user_roles)) {
$query->condition('roles.target_id', $include_user_roles, 'IN');
}
if (!empty($include_status)) {
$query->condition('status', $include_status, 'IN');
}
if (!empty($whitelist_user)) {
$users_names = preg_split('/\n|\r\n?/', $whitelist_user);
$and_condition_users_names = $query->andConditionGroup();
foreach ($users_names as $name) {
$and_condition_users_names->condition('name', '%' . $name . '%', 'NOT LIKE');
}
$query->condition($and_condition_users_names);
}
if (!empty($whitelist_email)) {
$users_emails = preg_split('/\n|\r\n?/', $whitelist_email);
$and_condition_users_emails = $query->andConditionGroup();
foreach ($users_emails as $email) {
$and_condition_users_emails->condition('mail', '%' . $email . '%', 'NOT LIKE');
}
$query->condition($and_condition_users_emails);
}
$user_ids = $query->accessCheck(TRUE)->execute();
if ($action == "count") {
return count($user_ids);
}
elseif ($action == "cancel") {
$users = User::loadMultiple($user_ids);
foreach ($users as $user) {
$last_access = $user->getLastAccessedTime();
$current_time = time();
if ($last_access != 0 && !$user->hasRole('administrator')) {
if ($usersHandler->timestampdiff($last_access, $current_time, $idle_time_unit) >= $idle_time) {
$usersHandler->cancelUser($user->get('uid')->value, $block_inactive_users_cancel_email, $disable_account_method);
block_inactive_users_unwarn($user->id());
continue;
}
}
if ($include_never_accessed == 1 && $last_access == 0) {
$created_time = $user->getCreatedTime();
if ($usersHandler->timestampdiff($created_time, $current_time, $idle_time_unit) >= $idle_time) {
$usersHandler->cancelUser($user->get('uid')->value, $block_inactive_users_cancel_email, $disable_account_method);
block_inactive_users_unwarn($user->id());
continue;
}
}
}
}
}
/**
* Remove warned users from warn list.
*/
function block_inactive_users_unwarn($uid) {
$warned_users = \Drupal::state()->get('block_inactive_users.warn') ?: [];
\Drupal::state()->set('block_inactive_users.warn', array_diff($warned_users, [$uid]));
}
