' . t('Email addresses and domain patterns for users who are pre-approved to access the web site after registering (subject to the !public settings). Note: deleting patterns from this list does not affect the account status for users already registered.', array('!public' => l('Registration and Cancellation', 'admin/config/people/accounts'))) . '
'; $output .= '' . t('The count column indicates the number (as per the register pre-approved !settings page) of registered users associated with each pattern. Full email addresses containing another domain pattern are not included in the corresponding domain pattern count.', array('!settings' => l('Settings', 'admin/people/register_preapproved/settings'))) . '
'; return $output; case 'admin/people/register_preapproved/add': return '' . t('Enter one or more email addresses or domain patterns and select the custom roles (as per the register pre-approved !settings page) for users who are pre-approved to access the web site after registering (subject to the !public settings).', array('!settings' => l('Settings', 'admin/people/register_preapproved/settings'), '!public' => l('Registration and Cancellation', 'admin/config/people/accounts'))) . '
'; case 'admin/people/register_preapproved/settings': $output = '' . t('Pattern counts appearing on the list page can include or exclude pre-existing account email addresses that pre-date when each pattern was added.') . '
'; $output .= '' . t('Define a custom welcome message shown to pre-approved users after registration is complete.') . '
'; $output .= '' . t('Select the default custom roles available for selection when adding email addresses and domain patterns. If you do not see any custom roles, you can define some on the !link page.', array('!link' => l('Roles', 'admin/people/permissions/roles'))) . '
'; return $output; case 'admin/people/register_preapproved/%/edit': return '' . t('To change the email address or domain for this pattern, you must delete it and create a new entry.') . '
'; } } /** * Implements hook_permission(). */ function register_preapproved_permission() { return array( 'administer pre-approved' => array( 'title' => t('Manage Pre-Approved E-mail Patterns'), 'description' => t('Add and remove pre-approved e-mail addresses and domain patterns and manage general settings.'), ), 'administer pre-approved roles' => array( 'title' => t('Choose Pre-Approved Roles'), 'description' => t('Users may select which roles may be auto-assigned.'), 'restrict access' => TRUE, ), ); } /** * Implements hook_menu(). */ function register_preapproved_menu() { $items = array(); $items['admin/people/register_preapproved'] = array( 'title' => 'Register pre-approved', 'description' => 'Manage register pre-approved settings.', 'page callback' => 'drupal_get_form', 'page arguments' => array('register_preapproved_list_form'), 'access arguments' => array('administer pre-approved'), 'file' => 'includes/register_preapproved.admin.inc', 'type' => MENU_LOCAL_TASK, ); $items['admin/people/register_preapproved/list'] = array( 'title' => 'List', 'weight' => 0, 'type' => MENU_DEFAULT_LOCAL_TASK, ); $items['admin/people/register_preapproved/add'] = array( 'title' => 'Manage E-Mails', 'page callback' => 'drupal_get_form', 'page arguments' => array('register_preapproved_add_form'), 'access arguments' => array('administer pre-approved'), 'weight' => 1, 'file' => 'includes/register_preapproved.admin.inc', 'type' => MENU_LOCAL_ACTION, ); $items['admin/people/register_preapproved/settings'] = array( 'title' => 'Settings', 'page callback' => 'drupal_get_form', 'page arguments' => array('register_preapproved_settings_form'), 'access arguments' => array('administer pre-approved'), 'weight' => 2, 'file' => 'includes/register_preapproved.admin.inc', 'type' => MENU_LOCAL_TASK, ); $items['admin/people/register_preapproved/roles'] = array( 'title' => 'Roles', 'page callback' => 'drupal_get_form', 'page arguments' => array('register_preapproved_roles_form'), 'access arguments' => array('administer pre-approved roles'), 'weight' => 3, 'file' => 'includes/register_preapproved.admin.inc', 'type' => MENU_LOCAL_TASK, ); // title omitted to display local menu when editing a pattern's role assignments $items['admin/people/register_preapproved/%/edit'] = array( 'title' => '', 'page callback' => 'register_preapproved_edit', 'page arguments' => array(3), 'access arguments' => array('administer pre-approved'), 'file' => 'includes/register_preapproved.admin.inc', 'type' => MENU_CALLBACK, ); return $items; } /** * Implements hook_user_presave(). * * We process the user here instead of hook_user_insert so we have access * to the STATUS attribute to approve the user. This is already set by the time * hook_user_insert is called. */ function register_preapproved_user_presave(&$edit, $account, $category) { // Only process new user accounts. if ($account->is_new && $category == 'account') { // See if the user's email is on the pre-approved list. $pattern = db_select('register_preapproved', 'rp') ->fields('rp') ->condition(db_or() ->condition('mail', $edit['mail']) ->condition('mail', strstr($edit['mail'], '@')) ) ->execute() ->fetchAssoc(); // email address or domain is pre-approved if (!empty($pattern)) { $register_preapproved_roles = array_keys(unserialize($pattern['roles'])); // Add any applicable roles to the user account. if (count($register_preapproved_roles)) { // retrieve user roles excluding anonymous $user_roles = user_roles(TRUE); // apply pre-approved role selections foreach ($register_preapproved_roles as $rid) { // make sure pre-approved role exists if (isset($user_roles[$rid])) { $edit['roles'][$rid] = $user_roles[$rid]; } } } // Approve the user. $edit['status'] = TRUE; // display pre-approved confirmation message to user after registration $message = variable_get('register_preapproved_message', t('You have been pre-approved and granted access to %site_name.')); drupal_set_message(t($message, array('%site_name' => variable_get('site_name', 'Drupal')))); } } } /** * Copy of valid_email_address(), but without user name. * Validate everything after and including the @ symbol. * Exp. @domain.com * * @param $mail * Email address to validate. * * @return boolean */ function valid_domain($mail) { $domain = '(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.?)+'; $ipv4 = '[0-9]{1,3}(\.[0-9]{1,3}){3}'; $ipv6 = '[0-9a-fA-F]{1,4}(\:[0-9a-fA-F]{1,4}){7}'; return preg_match("/^@($domain|(\[($ipv4|$ipv6)\]))$/", $mail); } /** * Implements hook_form_alter(). */ function register_preapproved_form_user_register_form_alter(&$form, &$form_state, $form_id) { $form['#validate'][] = 'register_preapproved_validate_register_form'; } /** * Custom validate function for user registration form. */ function register_preapproved_validate_register_form(&$form, &$form_state) { if (variable_get('register_preapproved_restrict', 0)) { $pattern = db_select('register_preapproved', 'rp') ->fields('rp') ->condition(db_or() ->condition('mail', $form_state['values']['mail']) ->condition('mail', strstr($form_state['values']['mail'], '@')) ) ->execute() ->fetchAssoc(); if (empty($pattern)) { $message = variable_get('register_preapproved_not_preapproved_message', t('Your email address has not been pre-approved for use on %site_name.')); form_set_error('mail', t($message, array('%site_name' => variable_get('site_name', 'Drupal')))); } } }