You are here

genpass.module in Generate Password 7.2

Same filename and directory in other branches
  1. 8 genpass.module
  2. 5 genpass.module
  3. 6 genpass.module
  4. 7 genpass.module

Genpass module: automatically sets strong passwords.

File

genpass.module
View source
<?php

/**
 * @file
 * Genpass module: automatically sets strong passwords.
 */

/**
 * Implements hook_form_FORM_ID_alter().
 */
function genpass_form_user_register_form_alter(&$form, &$form_state) {

  // This form structure only exists for admin creation.
  if (isset($form['account']['pass'])) {
    $form['account']['pass']['#access'] = FALSE;
    $form['account']['pass']['#type'] = 'value';
    $form['account']['genpass_message'] = array(
      '#type' => 'markup',
      '#markup' => t("<h3>Password</h3><p>A strong password will be generated automatically. The user should use the password reset function to set their password.</p>"),
    );

    // Add validation function, where password is actually set.
    $form['#validate'][] = 'genpass_admin_create_validate';
  }
}

/**
 * Implements hook_form_FORM_ID_alter().
 */
function genpass_form_user_profile_form_alter(&$form, &$form_state) {

  // Only change the edit form for admins modifying another user.
  if ($form['#user']->uid != $GLOBALS['user']->uid && isset($form['account']['pass'])) {

    // When editing, give admins a checkbox to change the password.
    $form['account']['pass']['#access'] = FALSE;
    $form['account']['genpass_generate'] = array(
      '#type' => 'checkbox',
      '#title' => t('Generate a new strong password. Their current password will stop working.'),
      '#prefix' => '<h3>' . t('Password') . '</h3>',
    );
    $form['#validate'][] = 'genpass_admin_edit_validate';
  }
}

/**
 * Form validate function to optionally set a password value.
 */
function genpass_admin_edit_validate($form, &$form_state) {
  if (!empty($form_state['values']['genpass_generate'])) {
    $password = genpass_genpass();

    // If the site wants to show the password, show it.
    if (variable_get('genpass_display_password', FALSE)) {
      drupal_set_message(t('Automatically generated a password %password for this user.', array(
        '%password' => $password,
      )));
    }
    form_set_value($form['account']['pass'], $password, $form_state);
  }
  return $form;
}

/**
 * Form validate function to set a password value.
 */
function genpass_admin_create_validate($form, &$form_state) {
  $password = genpass_genpass();

  // If the site wants to show the password, show it.
  if (variable_get('genpass_display_password', FALSE)) {
    drupal_set_message(t('The automatically generated password is: %password.', array(
      '%password' => $password,
    )));
  }
  form_set_value($form['account']['pass'], $password, $form_state);
  return $form;
}

/**
 * Generates a pretty, pretty, pretty good password.
 *
 * @param int $length
 *   Length of the password. This is in addition to the base of 4 digits.
 *
 * @return string
 *   A password.
 */
function genpass_genpass($length = 15) {

  // This array contains the list of allowable characters for the
  // password. Note that the number 0 and the letter 'O' have been
  // removed to avoid confusion between the two. The same is true
  // of 'I', 1, and 'l'.
  $character_sets = array(
    'lower_letters' => 'abcdefghijkmnopqrstuvwxyz',
    'upper_letters' => 'ABCDEFGHJKLMNPQRSTUVWXYZ',
    'digits' => '23456789',
    'special' => '@#$%^&()=/|[]{};<>/',
  );

  // Always include at least 1 character of each class to  ensure generated
  // passwords meet simplistic password strength rules.
  $pass = '';
  foreach ($character_sets as $character_set) {
    $pass .= _genpass_genpass_substring($character_set, 1);
  }

  // Now add length to get entropy.
  $pass .= _genpass_genpass_substring(implode('', $character_sets), $length);
  return $pass;
}

/**
 * Picks random characters from a given string.
 *
 * @see user_password().
 *
 * @param $allowable_characters
 *   A set of characters from which to choose.
 * @param $length
 *   The desired length of the returned random string.
 *
 * @return string
 *   The random string.
 */
function _genpass_genpass_substring($allowable_characters, $length) {

  // Zero-based count of characters in the allowable list:
  $len = strlen($allowable_characters) - 1;

  // Declare the password as a blank string.
  $pass = '';

  // Loop the number of times specified by $length.
  for ($i = 0; $i < $length; $i++) {
    do {

      // Find a secure random number within the range needed.
      $index = ord(drupal_random_bytes(1));
    } while ($index > $len);

    // Each iteration, pick a random character from the
    // allowable string and append it to the password:
    $pass .= $allowable_characters[$index];
  }
  return $pass;
}

Functions

Namesort descending Description
genpass_admin_create_validate Form validate function to set a password value.
genpass_admin_edit_validate Form validate function to optionally set a password value.
genpass_form_user_profile_form_alter Implements hook_form_FORM_ID_alter().
genpass_form_user_register_form_alter Implements hook_form_FORM_ID_alter().
genpass_genpass Generates a pretty, pretty, pretty good password.
_genpass_genpass_substring Picks random characters from a given string.