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]));
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc