You are here

function _ldap_user_orphans in Lightweight Directory Access Protocol (LDAP) 7.2

Same name and namespace in other branches
  1. 8.2 ldap_user/ldap_user.cron.inc \_ldap_user_orphans()

Function to respond to ldap associated drupal accounts which no longer have a related LDAP entry.

Parameters

LdapUserConf $ldap_user_conf:

Return value

boolean FALSE on error or incompletion or TRUE otherwise

1 call to _ldap_user_orphans()
ldap_user_cron in ldap_user/ldap_user.module
Implements hook_cron().

File

ldap_user/ldap_user.cron.inc, line 16
Cron relate functions.

Code

function _ldap_user_orphans($ldap_user_conf) {
  if (!$ldap_user_conf->orphanedDrupalAcctBehavior || $ldap_user_conf->orphanedDrupalAcctBehavior == 'ldap_user_orphan_do_not_check') {
    return TRUE;
  }

  /**
   * query drupal accounts
   *   - ldap associated drupal accounts
   *   - where (ldap_user_current_dn not null)
   *   - ordered by ldap_user_last_checked
   *   - order by uid asc (get oldest first)
   */
  $last_uid_checked = variable_get('ldap_user_cron_last_uid_checked', 1);
  $query = new EntityFieldQuery();
  $query
    ->entityCondition('entity_type', 'user')
    ->fieldCondition('ldap_user_puid_sid', 'value', 'NULL', '!=')
    ->fieldCondition('ldap_user_puid_property', 'value', 'NULL', '!=')
    ->fieldCondition('ldap_user_puid', 'value', 'NULL', '!=')
    ->fieldCondition('ldap_user_current_dn', 'value', 'NULL', '!=')
    ->propertyCondition('uid', $last_uid_checked, '>')
    ->propertyCondition('status', 1)
    ->propertyOrderBy('uid', 'ASC')
    ->range(0, $ldap_user_conf->orphanedCheckQty)
    ->addMetaData('account', user_load(1));
  $result = $query
    ->execute();
  $email_list = [];
  $ldap_servers = ldap_servers_get_servers(NULL, 'enabled');
  $watchdogs_sids_missing_watchdogged = [];

  /**
   * First produce array of form:
   *  $drupal_users[$sid][$puid_attr][$puid]['exists'] = bool
   *  signifying if corresponding LDAP Entry exists.
   */
  if (!(isset($result['user']) && count($result['user']) > 0)) {
    variable_set('ldap_user_cron_last_uid_checked', 1);
    return TRUE;
  }
  $uids = array_keys($result['user']);
  $user_count = count($uids);

  // If maxed out reset uid check counter.
  if ($user_count < $ldap_user_conf->orphanedCheckQty) {
    variable_set('ldap_user_cron_last_uid_checked', 1);
  }
  else {
    variable_set('ldap_user_cron_last_uid_checked', $uids[count($uids) - 1]);
  }
  $batches = floor($user_count / LDAP_SERVERS_MAXFILTER_ORS) + 1;

  // e.g. 175 users and  50 max ldap query ors will yield 4 batches.
  for ($batch = 1; $batch <= $batches; $batch++) {
    $email_list = _ldap_user_orphan_process_batch($ldap_user_conf, $batch, $user_count, $uids, $ldap_servers, $watchdogs_sids_missing_watchdogged, $query, $email_list);
  }
  if (count($email_list) > 0) {
    $site_email = variable_get('site_mail', FALSE);
    $params = [
      'accounts' => $email_list,
    ];
    if ($site_email) {
      drupal_mail('ldap_user', 'orphaned_accounts', $site_email, language_default(), $params);
    }
  }
  return TRUE;
}