| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358 | <?php/** * Implements hook_menu(). */function email_required_menu() {  $items = array();  $items['email/verify'] = array(    'title' => 'Email verifications',    'description' => 'Form to submit for email verification',    'page callback' => 'drupal_get_form',    'page arguments' => array('email_required_verification_form'),    'access callback' => 'email_required_verification_form_access',    'file' => 'email_required.pages.inc',    'type' => MENU_CALLBACK,  );  $items['email/verify/%user/%'] = array(    'title' => 'Email verification',    'description' => 'Path to verify your email address',    'page callback' => 'email_required_verification_page',    'page arguments' => array(2, 3),    'access callback' => 'email_required_verification_page_access',    'access arguments' => array(2, 3),    'file' => 'email_required.pages.inc',    'type' => MENU_CALLBACK,  );  $items['admin/config/people/email-required'] = array(    'title' => 'Email verification',    'description' => 'Configure when users will need to verify their email address',    'page callback' => 'drupal_get_form',    'page arguments' => array('email_required_admin_settings'),    'access arguments' => array('administer email required'),    'file' => 'email_required.admin.inc',    'type' => MENU_NORMAL_ITEM,  );  return $items;}/** * Implements hook_init(). */function email_required_init() {  // If authenticated  if (user_is_logged_in()) {    // See if we have paths to enforce a required email    if ($paths = variable_get('email_required_paths', NULL)) {      // Determine the current path      $path = drupal_strtolower(drupal_get_path_alias($_GET['q']));      // See if we have a match      if (drupal_match_path($path, $paths)) {        // See if the user has to validate their email        if (!email_required_user_is_validated()) {          // See if we can capture the referred page          $options = array();          if (isset($_SERVER['HTTP_REFERER']) && $referer = $_SERVER['HTTP_REFERER']) {            $referer = str_replace(url('<front>', array('absolute' => TRUE)), '', $referer);            $options['query'] = array('destination' => $referer);          }          // Redirect to the verify form          drupal_goto('email/verify', $options);        }      }    }  }}/** * Implements hook_mail(). */function email_required_mail($key, &$message, $params) {  global $user;  // Get email text  $text = _email_required_email_text();  // Inject a verification link  $text['body'] = str_replace('!link', email_required_generate_link($user, TRUE), $text['body']);  // Attach to the message, and replace tokens  $message['subject'] = token_replace($text['subject'], array('user' => $user));  $message['body'] = array(token_replace($text['body'], array('user' => $user)));}/** * Implements hook_permission(). */function email_required_permission() {  return array(    'administer email required' => array(      'title' => t('Administer email required'),      'description' => t('Configure the settings for this module.'),    ),    'bypass email required' => array(      'title' => t('Bypass email verification'),      'description' => t('These users will not have to verify their email. Anonyous users will never have to.'),    ),  );}/** * Implements hook_user_presave(). */function email_required_user_presave(&$edit, $account, $category) {  // See if the user exists yet  if ($account->uid) {    // See if the email address has changed    if (strtolower($edit['mail']) != strtolower($account->mail)) {      // Mark this user as no longer having a verified email address      email_required_delete_hash($account);    }  }}/** * Generate a URL to verify an email address *  * @param $user *   A user object or uid * @param $absolute *   TRUE if the link should be absolute. * @return *   A link to verify an email address, or FALSE if one cannot be made. */function email_required_generate_link($user = NULL, $absolute = FALSE) {  // Get the uid  $uid = _email_required_get_uid($user);  // Get the hash string  if ($hash = email_required_load_hash($user, TRUE)) {    // Provide the link    return url("email/verify/{$uid}/{$hash->hash}", array('absolute' => $absolute));  }  return FALSE;}/** * Delete a hash entry for a given user * * @param $user *   A user object or uid */function email_required_delete_hash($user = NULL) {  // Delete the hash entry  db_delete('email_required')    ->condition('uid', _email_required_get_uid($user))    ->execute();}/** * Create a hash entry for a given user *  * This will delete any existing entries so call with caution * * @param $user *   A user object * @return *   A hash object */function email_required_create_hash($user = NULL) {  if (!$user) {    global $user;  }    // Create the hash object  $hash = array(    'uid' => _email_required_get_uid($user),    'hash' => _email_required_hash($user),    'created' => REQUEST_TIME,    'verified' => 0,  );    // Delete any existing hashes for this user  email_required_delete_hash($user);    // Insert it  db_insert('email_required')    ->fields($hash)    ->execute();      return $hash;}/** * Validate a user's hash * * @param $user *   A user object or uid */function email_required_validate_hash($user = NULL) {  // Delete the hash entry  db_update('email_required')    ->fields(array('verified' => REQUEST_TIME))    ->condition('uid', _email_required_get_uid($user))    ->execute();}/** * Get a user's hash object * * @param $user *   A user object or uid * @param $reset *   TRUE if the static cache should be skipped, otherwise FALSE. * @return *   A hash object */function email_required_load_hash($user = NULL, $reset = FALSE) {  static $hashes = array();    // Determine the uid  $uid = _email_required_get_uid($user);    // Check the cache  if ($reset || !isset($hashes[$uid])) {    // Fetch the hash entry    $hashes[$uid] =       db_select('email_required', 'e')        ->fields('e', array('uid', 'hash', 'created', 'verified'))        ->condition('uid', $uid)        ->execute()        ->fetchObject();  }    return $hashes[$uid];}/** * Determine if a given user has validated their email *  * @param $user *   A user object or uid * @param $admin *   TRUE if users with adequate permissions will be considered *   validated regardless * @return *   TRUE if the user is validated, otherwise FALSE. */function email_required_user_is_validated($user = NULL, $admin = TRUE) {  static $validated = array();    // Determine the uid  $uid = _email_required_get_uid($user);    // Generate a cache key  $key = $uid . ($admin ? ':admins' : '');    // Check the cache  if (!isset($validated[$key])) {    // Assume false    $validated[$key] = FALSE;    // Check higher permissions first, if desired    if ($admin && (user_access('administer email required') || user_access('bypass email required'))) {      $validated[$key] = TRUE;    }    // Load the hash to check    else if ($hash = email_required_load_hash($user)) {      if ($hash->verified) {        $validated[$key] = TRUE;      }    }    // Allow modules to alter this    drupal_alter('email_required_validated', $user, $admin, $validated[$key]);  }    return $validated[$key];}/** * Access callback for the verification form */function email_required_verification_form_access() {  global $user;  // No anonymous allowed  if (!$user->uid) {    return FALSE;  }  return email_required_user_is_validated($user) ? FALSE : TRUE;}/** * Access callback for the verification page *  * @param $account *   A user object specified in the link * @param $string *   The hash string on the URL */function email_required_verification_page_access($account, $string) {  global $user;    // If the user is logged in, they can only verify themselves  if ($user->uid && ($account->uid != $user->uid)) {    return FALSE;  }    // We'll check for the existance of a hash, and the validity of it  // in the page callback, because we don't want a 403 if the hash  // has been purged  return TRUE;}/** * Wrapper for user_pass_rehash() *  * Generate a a hash that will be used in the verification URL *  * @param $user *   A user object or ID * @return *   A hash */function _email_required_hash($user) {  return user_pass_rehash($user->pass, REQUEST_TIME, $user->name);}/** * Helper function to determine the user id to use *  * @param $user *   A user object, or user ID, or NULL if you want to use *   the current user. * @return *   A user ID */function _email_required_get_uid($user = NULL) {  if (!$user) {    global $user;  }  return is_object($user) ? $user->uid : $user;}/** * Helper function to return email strings *  * @return *   An array containing the 'subject' and 'body for the  *   verification email */function _email_required_email_text() {  // Load the defaults  $text = array(    'subject' => variable_get('email_required_subject', NULL),    'body' => variable_get('email_required_body', NULL),  );    // See if we need a subject  if (!$text['subject']) {    $text['subject'] = '[[site:name]] ' . t('Verify your email address');  }    // See if we need a body  if (!$text['body']) {    $text['body'] = '[user:name],' . "\n\n";    $text['body'] .= t('You have requested to have your email address validated at !sitename.', array('!sitename' => '[site:name]')) . "\n\n";    $text['body'] .= t('Click the link below to validate your email address:') . "\n\n";    $text['body'] .= '!link' . "\n\n";    $text['body'] .= t('You will never have to validate your email address again, unless you change it.') . "\n\n";    $text['body'] .= '- [site:name]';  }    return $text;}
 |