<?php
use Drupal\Core\Database\Query\SelectInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\file\Plugin\Core\Entity\File;
use Drupal\Core\Template\Attribute;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
const USERNAME_MAX_LENGTH = 60;
const EMAIL_MAX_LENGTH = 254;
const USER_REGISTER_ADMINISTRATORS_ONLY = 'admin_only';
const USER_REGISTER_VISITORS = 'visitors';
const USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL = 'visitors_admin_approval';
function user_help($path, $arg) {
global $user;
switch ($path) {
case 'admin/help#user':
$output = '';
$output .= '<h3>' . t('About') . '</h3>';
$output .= '<p>' . t('The User module allows users to register, log in, and log out. It also allows users with proper permissions to manage user roles (used to classify users) and permissions associated with those roles. For more information, see the online handbook entry for <a href="@user">User module</a>.', array(
'@user' => 'http://drupal.org/documentation/modules/user',
)) . '</p>';
$output .= '<h3>' . t('Uses') . '</h3>';
$output .= '<dl>';
$output .= '<dt>' . t('Creating and managing users') . '</dt>';
$output .= '<dd>' . t('The User module allows users with the appropriate <a href="@permissions">permissions</a> to create user accounts through the <a href="@people">People administration page</a>, where they can also assign users to one or more roles, and block or delete user accounts. If allowed, users without accounts (anonymous users) can create their own accounts on the <a href="@register">Create new account</a> page.', array(
'@permissions' => url('admin/people/permissions', array(
'fragment' => 'module-user',
)),
'@people' => url('admin/people'),
'@register' => url('user/register'),
)) . '</dd>';
$output .= '<dt>' . t('User roles and permissions') . '</dt>';
$output .= '<dd>' . t('<em>Roles</em> are used to group and classify users; each user can be assigned one or more roles. By default there are two roles: <em>anonymous user</em> (users that are not logged in) and <em>authenticated user</em> (users that are registered and logged in). Depending on choices you made when you installed Drupal, the installation process may have defined more roles, and you can create additional custom roles on the <a href="@roles">Roles page</a>. After creating roles, you can set permissions for each role on the <a href="@permissions_user">Permissions page</a>. Granting a permission allows users who have been assigned a particular role to perform an action on the site, such as viewing a particular type of content, editing or creating content, administering settings for a particular module, or using a particular function of the site (such as search).', array(
'@permissions_user' => url('admin/people/permissions'),
'@roles' => url('admin/people/roles'),
)) . '</dd>';
$output .= '<dt>' . t('Account settings') . '</dt>';
$output .= '<dd>' . t('The <a href="@accounts">Account settings page</a> allows you to manage settings for the displayed name of the anonymous user role, personal contact forms, user registration, and account cancellation. On this page you can also manage settings for account personalization (including signatures), and adapt the text for the e-mail messages that are sent automatically during the user registration process.', array(
'@accounts' => url('admin/config/people/accounts'),
)) . '</dd>';
$output .= '</dl>';
return $output;
case 'admin/people/create':
return '<p>' . t("This web page allows administrators to register new users. Users' e-mail addresses and usernames must be unique.") . '</p>';
case 'admin/people/permissions':
return '<p>' . t('Permissions let you control what users can do and see on your site. You can define a specific set of permissions for each role. (See the <a href="@role">Roles</a> page to create a role). Two important roles to consider are Authenticated Users and Administrators. Any permissions granted to the Authenticated Users role will be given to any user who can log into your site. You can make any role the Administrator role for the site, meaning this will be granted all new permissions automatically. You can do this on the <a href="@settings">User Settings</a> page. You should be careful to ensure that only trusted users are given this access and level of control of your site.', array(
'@role' => url('admin/people/roles'),
'@settings' => url('admin/config/people/accounts'),
)) . '</p>';
case 'admin/people/roles':
$output = '<p>' . t('Roles allow you to fine tune the security and administration of Drupal. A role defines a group of users that have certain privileges as defined on the <a href="@permissions">permissions page</a>. Examples of roles include: anonymous user, authenticated user, moderator, administrator and so on. In this area you will define the names and order of the roles on your site. It is recommended to order your roles from least permissive (anonymous user) to most permissive (administrator). To delete a role choose "edit role".', array(
'@permissions' => url('admin/people/permissions'),
)) . '</p>';
$output .= '<p>' . t('Drupal has three special user roles:') . '</p>';
$output .= '<ul>';
$output .= '<li>' . t("Anonymous user: this role is used for users that don't have a user account or that are not authenticated.") . '</li>';
$output .= '<li>' . t('Authenticated user: this role is automatically granted to all logged in users.') . '</li>';
$output .= '<li>' . t('Administrator role: this role is automatically granted all new permissions when you install a new module. Configure which role is the administrator role on the <a href="@account_settings">Account settings page</a>.', array(
'@account_settings' => url('admin/config/people/accounts'),
)) . '</li>';
$output .= '</ul>';
return $output;
case 'admin/config/people/accounts/fields':
return '<p>' . t('This form lets administrators add, edit, and arrange fields for storing user data.') . '</p>';
case 'admin/config/people/accounts/display':
return '<p>' . t('This form lets administrators configure how fields should be displayed when rendering a user profile page.') . '</p>';
case 'admin/people/search':
return '<p>' . t('Enter a simple pattern ("*" may be used as a wildcard match) to search for a username or e-mail address. For example, one may search for "br" and Drupal might return "brian", "brad", and "brenda@example.com".') . '</p>';
}
}
function user_theme() {
return array(
'user_profile' => array(
'render element' => 'elements',
'template' => 'user-profile',
'file' => 'user.pages.inc',
),
'user_admin_permissions' => array(
'render element' => 'form',
'file' => 'user.admin.inc',
),
'user_admin_roles' => array(
'render element' => 'form',
'file' => 'user.admin.inc',
),
'user_permission_description' => array(
'variables' => array(
'permission_item' => NULL,
'hide' => NULL,
),
'file' => 'user.admin.inc',
),
'user_signature' => array(
'variables' => array(
'signature' => NULL,
),
),
'username' => array(
'variables' => array(
'account' => NULL,
),
),
);
}
function user_uri($user) {
return array(
'path' => 'user/' . $user->uid,
);
}
function user_label($entity_type, $entity) {
return user_format_name($entity);
}
function user_attach_accounts(array $entities) {
$uids = array();
foreach ($entities as $entity) {
$uids[] = $entity->uid;
}
$uids = array_unique($uids);
$accounts = user_load_multiple($uids);
$anonymous = drupal_anonymous_user();
foreach ($entities as $id => $entity) {
if (isset($accounts[$entity->uid])) {
$entities[$id]->account = $accounts[$entity->uid];
}
else {
$entities[$id]->account = $anonymous;
}
}
}
function user_picture_enabled() {
return (bool) field_info_instance('user', 'user_picture', 'user');
}
function user_field_info_alter(&$info) {
foreach ($info as $field_type => &$field_type_info) {
$field_type_info += array(
'instance_settings' => array(),
);
$field_type_info['instance_settings'] += array(
'user_register_form' => FALSE,
);
}
}
function user_field_extra_fields() {
$return['user']['user'] = array(
'form' => array(
'account' => array(
'label' => t('User name and password'),
'description' => t('User module account form elements.'),
'weight' => -10,
),
'timezone' => array(
'label' => t('Timezone'),
'description' => t('User module timezone form element.'),
'weight' => 6,
),
),
'display' => array(
'member_for' => array(
'label' => t('Member for'),
'description' => t('User module \'member for\' view element.'),
'weight' => 5,
),
),
);
return $return;
}
function user_external_load($authname) {
$uid = db_query("SELECT uid FROM {authmap} WHERE authname = :authname", array(
':authname' => $authname,
))
->fetchField();
if ($uid) {
return user_load($uid);
}
else {
return FALSE;
}
}
function user_load_multiple(array $uids = NULL, $reset = FALSE) {
return entity_load_multiple('user', $uids, $reset);
}
function user_load($uid, $reset = FALSE) {
return entity_load('user', $uid, $reset);
}
function user_load_by_mail($mail) {
$users = entity_load_multiple_by_properties('user', array(
'mail' => $mail,
));
return reset($users);
}
function user_load_by_name($name) {
$users = entity_load_multiple_by_properties('user', array(
'name' => $name,
));
return reset($users);
}
function user_validate_name($name) {
if (!$name) {
return t('You must enter a username.');
}
if (substr($name, 0, 1) == ' ') {
return t('The username cannot begin with a space.');
}
if (substr($name, -1) == ' ') {
return t('The username cannot end with a space.');
}
if (strpos($name, ' ') !== FALSE) {
return t('The username cannot contain multiple spaces in a row.');
}
if (preg_match('/[^\\x{80}-\\x{F7} a-z0-9@_.\'-]/i', $name)) {
return t('The username contains an illegal character.');
}
if (preg_match('/[\\x{80}-\\x{A0}' . '\\x{AD}' . '\\x{2000}-\\x{200F}' . '\\x{2028}-\\x{202F}' . '\\x{205F}-\\x{206F}' . '\\x{FEFF}' . '\\x{FF01}-\\x{FF60}' . '\\x{FFF9}-\\x{FFFD}' . '\\x{0}-\\x{1F}]/u', $name)) {
return t('The username contains an illegal character.');
}
if (drupal_strlen($name) > USERNAME_MAX_LENGTH) {
return t('The username %name is too long: it must be %max characters or less.', array(
'%name' => $name,
'%max' => USERNAME_MAX_LENGTH,
));
}
}
function user_password($length = 10) {
$allowable_characters = 'abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789';
$len = strlen($allowable_characters) - 1;
$pass = '';
for ($i = 0; $i < $length; $i++) {
$pass .= $allowable_characters[mt_rand(0, $len)];
}
return $pass;
}
function user_role_permissions($roles = array()) {
$cache =& drupal_static(__FUNCTION__, array());
$role_permissions = $fetch = array();
if ($roles) {
foreach ($roles as $rid => $name) {
if (isset($cache[$rid])) {
$role_permissions[$rid] = $cache[$rid];
}
else {
$fetch[] = $rid;
$cache[$rid] = array();
}
}
if ($fetch) {
$result = db_query("SELECT rid, permission FROM {role_permission} WHERE rid IN (:fetch)", array(
':fetch' => $fetch,
));
foreach ($result as $row) {
$cache[$row->rid][$row->permission] = TRUE;
}
foreach ($fetch as $rid) {
$role_permissions[$rid] = $cache[$rid];
}
}
}
return $role_permissions;
}
function user_access($string, $account = NULL) {
global $user;
if (!isset($account)) {
$account = $user;
}
if ($account->uid == 1) {
return TRUE;
}
static $drupal_static_fast;
if (!isset($drupal_static_fast)) {
$drupal_static_fast['perm'] =& drupal_static(__FUNCTION__);
}
$perm =& $drupal_static_fast['perm'];
if (!isset($perm[$account->uid])) {
$role_permissions = user_role_permissions($account->roles);
$perms = array();
foreach ($role_permissions as $one_role) {
$perms += $one_role;
}
$perm[$account->uid] = $perms;
}
return isset($perm[$account->uid][$string]);
}
function user_is_blocked($name) {
return db_select('users')
->fields('users', array(
'name',
))
->condition('name', db_like($name), 'LIKE')
->condition('status', 0)
->execute()
->fetchObject();
}
function user_permission() {
return array(
'administer permissions' => array(
'title' => t('Administer permissions'),
'restrict access' => TRUE,
),
'administer users' => array(
'title' => t('Administer users'),
'restrict access' => TRUE,
),
'access user profiles' => array(
'title' => t('View user profiles'),
),
'change own username' => array(
'title' => t('Change own username'),
),
'cancel account' => array(
'title' => t('Cancel own user account'),
'description' => t('Note: content may be kept, unpublished, deleted or transferred to the %anonymous-name user depending on the configured <a href="@user-settings-url">user settings</a>.', array(
'%anonymous-name' => config('user.settings')
->get('anonymous'),
'@user-settings-url' => url('admin/config/people/accounts'),
)),
),
'select account cancellation method' => array(
'title' => t('Select method for cancelling own account'),
'restrict access' => TRUE,
),
);
}
function user_search_info() {
return array(
'title' => 'Users',
);
}
function user_search_access() {
return user_access('access user profiles');
}
function user_search_execute($keys = NULL, $conditions = NULL) {
$find = array();
$keys = preg_replace('!\\*+!', '%', $keys);
$query = db_select('users')
->extend('Drupal\\Core\\Database\\Query\\PagerSelectExtender');
$query
->fields('users', array(
'uid',
));
if (user_access('administer users')) {
$query
->fields('users', array(
'mail',
));
$query
->condition(db_or()
->condition('name', '%' . db_like($keys) . '%', 'LIKE')
->condition('mail', '%' . db_like($keys) . '%', 'LIKE'));
}
else {
$query
->condition('name', '%' . db_like($keys) . '%', 'LIKE');
}
$uids = $query
->limit(15)
->execute()
->fetchCol();
$accounts = user_load_multiple($uids);
$results = array();
foreach ($accounts as $account) {
$result = array(
'title' => user_format_name($account),
'link' => url('user/' . $account->uid, array(
'absolute' => TRUE,
)),
);
if (user_access('administer users')) {
$result['title'] .= ' (' . $account->mail . ')';
}
$results[] = $result;
}
return $results;
}
function user_user_view($account) {
$account->content['member_for'] = array(
'#type' => 'item',
'#title' => t('Member for'),
'#markup' => format_interval(REQUEST_TIME - $account->created),
'#weight' => 5,
);
}
function _user_language_selector_langcode_value($element, $input, &$form_state) {
if (isset($form_state['complete_form']['language']['preferred_langcode']['#description'])) {
$form_state['complete_form']['language']['preferred_langcode']['#description'] .= ' ' . t("This is also assumed to be the primary language of this account's profile information.");
}
return $form_state['values']['preferred_langcode'];
}
function user_validate_current_pass(&$form, &$form_state) {
$account = $form_state['user'];
foreach ($form_state['values']['current_pass_required_values'] as $key => $name) {
if (strlen(trim($form_state['values'][$key])) > 0 && $form_state['values'][$key] != $account->{$key}) {
$current_pass_failed = empty($form_state['values']['current_pass']) || !drupal_container()
->get('password')
->check($form_state['values']['current_pass'], $account);
if ($current_pass_failed) {
form_set_error('current_pass', t("Your current password is missing or incorrect; it's required to change the %name.", array(
'%name' => $name,
)));
form_set_error($key);
}
break;
}
}
}
function user_block_info() {
global $user;
$blocks['login']['info'] = t('User login');
$blocks['login']['cache'] = DRUPAL_NO_CACHE;
$blocks['new']['info'] = t('Who\'s new');
$blocks['new']['properties']['administrative'] = TRUE;
$blocks['online']['info'] = t('Who\'s online');
$blocks['online']['cache'] = DRUPAL_NO_CACHE;
$blocks['online']['properties']['administrative'] = TRUE;
return $blocks;
}
function user_block_configure($delta = '') {
global $user;
$config = config('user.block');
switch ($delta) {
case 'new':
$form['user_block_whois_new_count'] = array(
'#type' => 'select',
'#title' => t('Number of users to display'),
'#default_value' => $config
->get('whois_new_count'),
'#options' => drupal_map_assoc(array(
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
)),
);
return $form;
case 'online':
$period = drupal_map_assoc(array(
30,
60,
120,
180,
300,
600,
900,
1800,
2700,
3600,
5400,
7200,
10800,
21600,
43200,
86400,
), 'format_interval');
$form['user_block_seconds_online'] = array(
'#type' => 'select',
'#title' => t('User activity'),
'#default_value' => $config
->get('seconds_online'),
'#options' => $period,
'#description' => t('A user is considered online for this long after they have last viewed a page.'),
);
$form['user_block_max_list_count'] = array(
'#type' => 'select',
'#title' => t('User list length'),
'#default_value' => $config
->get('max_list_count'),
'#options' => drupal_map_assoc(array(
0,
5,
10,
15,
20,
25,
30,
40,
50,
75,
100,
)),
'#description' => t('Maximum number of currently online users to display.'),
);
return $form;
}
}
function user_block_save($delta = '', $edit = array()) {
global $user;
$config = config('user.block');
switch ($delta) {
case 'new':
$config
->set('whois_new_count', $edit['user_block_whois_new_count'])
->save();
break;
case 'online':
$config
->set('seconds_online', $edit['user_block_seconds_online'])
->save();
$config
->set('max_list_count', $edit['user_block_max_list_count'])
->save();
break;
}
}
function user_block_view($delta = '') {
global $user;
$block = array();
$block_config = config('user.block');
switch ($delta) {
case 'login':
if (!$user->uid && !(arg(0) == 'user' && !is_numeric(arg(1)))) {
$form = drupal_get_form('user_login_form');
unset($form['name']['#attributes']['autofocus']);
unset($form['name']['#description']);
unset($form['pass']['#description']);
$form['name']['#size'] = 15;
$form['pass']['#size'] = 15;
$form['#action'] = url(current_path(), array(
'query' => drupal_get_destination(),
'external' => FALSE,
));
$items = array();
if (config('user.settings')
->get('register') != USER_REGISTER_ADMINISTRATORS_ONLY) {
$items['create_account'] = l(t('Create new account'), 'user/register', array(
'attributes' => array(
'title' => t('Create a new user account.'),
'class' => array(
'create-account-link',
),
),
));
}
$items['request_password'] = l(t('Request new password'), 'user/password', array(
'attributes' => array(
'title' => t('Request new password via e-mail.'),
'class' => array(
'request-password-link',
),
),
));
$block['subject'] = t('User login');
$block['content'] = array(
'user_login_form' => $form,
'user_links' => array(
'#theme' => 'item_list',
'#items' => $items,
),
);
}
return $block;
case 'new':
if (user_access('access content')) {
$from = 0;
$count = $block_config
->get('whois_new_count');
$items = db_query_range('SELECT uid, name FROM {users} WHERE status <> 0 AND access <> 0 ORDER BY created DESC', $from, $count)
->fetchAll();
$block['subject'] = t('Who\'s new');
$block['content'] = array(
'#theme' => 'item_list__user__new',
'#items' => array(),
);
foreach ($items as $account) {
$block['content']['#items'][] = theme('username', array(
'account' => $account,
));
}
}
return $block;
case 'online':
if (user_access('access content')) {
$interval = REQUEST_TIME - $block_config
->get('seconds_online');
$authenticated_count = db_query("SELECT COUNT(uid) FROM {users} WHERE access >= :timestamp", array(
':timestamp' => $interval,
))
->fetchField();
$block['subject'] = t('Who\'s online');
$block['content'] = array(
'#theme' => 'item_list__user__online',
'#items' => array(),
'#prefix' => '<p>' . format_plural($authenticated_count, 'There is currently 1 user online.', 'There are currently @count users online.') . '</p>',
);
$max_users = $block_config
->get('max_list_count');
if ($authenticated_count && $max_users) {
$uids = db_query_range('SELECT uid FROM {users} WHERE access >= :interval AND uid > 0 ORDER BY access DESC', 0, $max_users, array(
':interval' => $interval,
))
->fetchCol();
foreach (user_load_multiple($uids) as $account) {
$block['content']['#items'][] = theme('username', array(
'account' => $account,
));
}
}
}
return $block;
}
}
function user_preprocess_block(&$variables) {
if ($variables['block']->module == 'user') {
switch ($variables['block']->delta) {
case 'login':
$variables['attributes']['role'] = 'form';
break;
case 'new':
$variables['attributes']['role'] = 'complementary';
break;
case 'online':
$variables['attributes']['role'] = 'complementary';
break;
}
}
}
function user_format_name($account) {
$name = !empty($account->name) ? $account->name : config('user.settings')
->get('anonymous');
drupal_alter('user_format_name', $name, $account);
return $name;
}
function user_template_preprocess_default_variables_alter(&$variables) {
global $user;
$variables['user'] = clone $user;
unset($variables['user']->pass, $variables['user']->sid, $variables['user']->ssid);
$variables['is_admin'] = user_access('access administration pages');
$variables['logged_in'] = $user->uid > 0;
}
function template_preprocess_username(&$variables) {
$account = $variables['account'];
$variables['extra'] = '';
if (empty($account->uid)) {
$variables['uid'] = 0;
if (theme_get_setting('toggle_comment_user_verification')) {
$variables['extra'] = ' (' . t('not verified') . ')';
}
}
else {
$variables['uid'] = (int) $account->uid;
}
$name = $variables['name_raw'] = user_format_name($account);
if (drupal_strlen($name) > 20) {
$name = drupal_substr($name, 0, 15) . '...';
}
$variables['name'] = check_plain($name);
$variables['profile_access'] = user_access('access user profiles');
if ($variables['uid'] && $variables['profile_access']) {
$variables['link_attributes']['title'] = t('View user profile.');
$variables['link_path'] = 'user/' . $variables['uid'];
}
elseif (!empty($account->homepage)) {
$variables['link_attributes']['rel'] = 'nofollow';
$variables['link_path'] = $account->homepage;
$variables['homepage'] = $account->homepage;
}
$variables['link_options']['html'] = TRUE;
$variables['attributes'] = array(
'class' => array(
'username',
),
);
}
function template_process_username(&$variables) {
if (isset($variables['link_path'])) {
$variables['link_options']['attributes'] = array_merge_recursive($variables['link_attributes'], $variables['attributes']);
}
}
function theme_username($variables) {
if (isset($variables['link_path'])) {
$output = l($variables['name'] . $variables['extra'], $variables['link_path'], $variables['link_options']);
}
else {
$output = '<span' . new Attribute($variables['attributes']) . '>' . $variables['name'] . $variables['extra'] . '</span>';
}
return $output;
}
function user_is_anonymous() {
return !$GLOBALS['user']->uid || !empty($GLOBALS['menu_admin']);
}
function user_is_logged_in() {
return (bool) $GLOBALS['user']->uid;
}
function user_register_access() {
return user_is_anonymous() && config('user.settings')
->get('register') != USER_REGISTER_ADMINISTRATORS_ONLY;
}
function user_view_access($account) {
$uid = is_object($account) ? $account->uid : (int) $account;
if ($uid) {
if ($GLOBALS['user']->uid == $uid || user_access('administer users')) {
return TRUE;
}
elseif (user_access('access user profiles')) {
if (!is_object($account)) {
$account = user_load($uid);
}
return is_object($account) && $account->status;
}
}
return FALSE;
}
function user_edit_access($account) {
return ($GLOBALS['user']->uid == $account->uid || user_access('administer users')) && $account->uid > 0;
}
function user_cancel_access($account) {
return ($GLOBALS['user']->uid == $account->uid && user_access('cancel account') || user_access('administer users')) && $account->uid > 0;
}
function user_menu() {
$items['user/autocomplete'] = array(
'title' => 'User autocomplete',
'page callback' => 'user_autocomplete',
'access callback' => 'user_access',
'access arguments' => array(
'access user profiles',
),
'type' => MENU_CALLBACK,
'file' => 'user.pages.inc',
);
$items['user'] = array(
'title' => 'User account',
'title callback' => 'user_menu_title',
'page callback' => 'user_page',
'access callback' => TRUE,
'file' => 'user.pages.inc',
'weight' => -10,
'menu_name' => 'account',
);
$items['user/login'] = array(
'title' => 'Log in',
'access callback' => 'user_is_anonymous',
'type' => MENU_DEFAULT_LOCAL_TASK,
);
$items['user/login/default'] = array(
'title' => 'Username and password',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => -10,
);
$items['user/register'] = array(
'title' => 'Create new account',
'type' => MENU_LOCAL_TASK,
'page callback' => 'NOT_USED',
'access callback' => 'user_register_access',
);
$items['user/password'] = array(
'title' => 'Request new password',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'user_pass',
),
'access callback' => TRUE,
'type' => MENU_LOCAL_TASK,
'file' => 'user.pages.inc',
);
$items['user/reset/%/%/%'] = array(
'title' => 'Reset password',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'user_pass_reset',
2,
3,
4,
),
'access callback' => TRUE,
'type' => MENU_CALLBACK,
'file' => 'user.pages.inc',
);
$items['user/logout'] = array(
'title' => 'Log out',
'access callback' => 'user_is_logged_in',
'page callback' => 'user_logout',
'weight' => 10,
'menu_name' => 'account',
'file' => 'user.pages.inc',
);
$items['admin/people'] = array(
'title' => 'People',
'description' => 'Manage user accounts, roles, and permissions.',
'page callback' => 'user_admin',
'page arguments' => array(
'list',
),
'access arguments' => array(
'administer users',
),
'position' => 'left',
'weight' => -4,
'file' => 'user.admin.inc',
);
$items['admin/people/people'] = array(
'title' => 'List',
'description' => 'Find and manage people interacting with your site.',
'access arguments' => array(
'administer users',
),
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => -10,
'file' => 'user.admin.inc',
);
$items['admin/people/permissions'] = array(
'title' => 'Permissions',
'description' => 'Determine access to features by selecting permissions for roles.',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'user_admin_permissions',
),
'access arguments' => array(
'administer permissions',
),
'file' => 'user.admin.inc',
'type' => MENU_LOCAL_TASK,
);
$items['admin/people/roles'] = array(
'title' => 'Roles',
'description' => 'List, edit, or add user roles.',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'user_admin_roles',
),
'access arguments' => array(
'administer permissions',
),
'file' => 'user.admin.inc',
'type' => MENU_LOCAL_TASK,
);
$items['admin/people/roles/edit/%user_role'] = array(
'title' => 'Edit role',
'page arguments' => array(
'user_admin_role',
4,
),
'access arguments' => array(
'administer permissions',
),
);
$items['admin/people/roles/delete/%user_role'] = array(
'title' => 'Delete role',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'user_admin_role_delete_confirm',
4,
),
'access callback' => 'user_role_delete_access',
'access arguments' => array(
4,
),
'file' => 'user.admin.inc',
);
$items['admin/people/create'] = array(
'title' => 'Add user',
'page arguments' => array(
'create',
),
'access arguments' => array(
'administer users',
),
'type' => MENU_LOCAL_ACTION,
);
$items['admin/config/people'] = array(
'title' => 'People',
'description' => 'Configure user accounts.',
'position' => 'left',
'weight' => -20,
'page callback' => 'system_admin_menu_block_page',
'access arguments' => array(
'access administration pages',
),
'file' => 'system.admin.inc',
'file path' => drupal_get_path('module', 'system'),
);
$items['admin/config/people/accounts'] = array(
'title' => 'Account settings',
'description' => 'Configure default behavior of users, including registration requirements, e-mails, and fields.',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'user_admin_settings',
),
'access arguments' => array(
'administer users',
),
'file' => 'user.admin.inc',
'weight' => -10,
);
$items['admin/config/people/accounts/settings'] = array(
'title' => 'Settings',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => -10,
);
$items['user/%user'] = array(
'title' => 'My account',
'title callback' => 'user_page_title',
'title arguments' => array(
1,
),
'page callback' => 'user_view_page',
'page arguments' => array(
1,
),
'access callback' => 'user_view_access',
'access arguments' => array(
1,
),
);
$items['user/%user/view'] = array(
'title' => 'View',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => -10,
);
$items['user/%user/cancel'] = array(
'title' => 'Cancel account',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'user_cancel_confirm_form',
1,
),
'access callback' => 'user_cancel_access',
'access arguments' => array(
1,
),
'file' => 'user.pages.inc',
);
$items['user/%user/cancel/confirm/%/%'] = array(
'title' => 'Confirm account cancellation',
'page callback' => 'user_cancel_confirm',
'page arguments' => array(
1,
4,
5,
),
'access callback' => 'user_cancel_access',
'access arguments' => array(
1,
),
'file' => 'user.pages.inc',
);
$items['user/%user/edit'] = array(
'title' => 'Edit',
'page callback' => 'entity_get_form',
'page arguments' => array(
1,
'profile',
),
'access callback' => 'user_edit_access',
'access arguments' => array(
1,
),
'type' => MENU_LOCAL_TASK,
'file' => 'user.pages.inc',
);
return $items;
}
function user_menu_site_status_alter(&$menu_site_status, $path) {
if ($menu_site_status == MENU_SITE_OFFLINE) {
if (user_is_logged_in() && !user_access('access site in maintenance mode')) {
module_load_include('pages.inc', 'user', 'user');
user_logout();
}
if (user_is_anonymous()) {
switch ($path) {
case 'user':
drupal_goto('user/login');
case 'user/login':
case 'user/password':
$menu_site_status = MENU_SITE_ONLINE;
break;
default:
if (strpos($path, 'user/reset/') === 0) {
$menu_site_status = MENU_SITE_ONLINE;
}
break;
}
}
}
if (user_is_logged_in()) {
if ($path == 'user/login') {
drupal_goto('user');
}
if ($path == 'user/register') {
drupal_goto('user/' . $GLOBALS['user']->uid . '/edit');
}
}
}
function user_menu_link_alter(&$link) {
if ($link['link_path'] == 'user' && $link['module'] == 'system') {
$link['options']['alter'] = TRUE;
}
if ($link['link_path'] == 'user/logout' && $link['module'] == 'system' && empty($link['customized'])) {
$link['plid'] = 0;
}
}
function user_menu_breadcrumb_alter(&$active_trail, $item) {
if (isset($active_trail[1]['module']) && $active_trail[1]['module'] == 'system' && $active_trail[1]['link_path'] == 'user' && strpos($item['path'], 'user/%') === 0) {
array_splice($active_trail, 1, 1);
}
}
function user_translated_menu_link_alter(&$link) {
if ($link['link_path'] == 'user' && $link['module'] == 'system' && !$GLOBALS['user']->uid) {
$link['hidden'] = 1;
}
}
function user_admin_paths() {
$paths = array(
'user/*/cancel' => TRUE,
'user/*/edit' => TRUE,
'user/*/edit/*' => TRUE,
'user/*/translations' => TRUE,
'user/*/translations/*' => TRUE,
);
return $paths;
}
function user_uid_only_optional_to_arg($arg) {
return user_uid_optional_to_arg($arg);
}
function user_uid_optional_load($uid = NULL) {
if (!isset($uid)) {
$uid = $GLOBALS['user']->uid;
}
return user_load($uid);
}
function user_uid_optional_to_arg($arg) {
return empty($arg) || $arg == '%' ? $GLOBALS['user']->uid : $arg;
}
function user_menu_title() {
if (!user_is_logged_in()) {
switch (current_path()) {
case 'user':
case 'user/login':
return t('Log in');
case 'user/register':
return t('Create new account');
case 'user/password':
return t('Request new password');
default:
return t('User account');
}
}
else {
return t('My account');
}
}
function user_page_title($account) {
return is_object($account) ? user_format_name($account) : '';
}
function user_get_authmaps($authname = NULL) {
$authmaps = db_query("SELECT module, authname FROM {authmap} WHERE authname = :authname", array(
':authname' => $authname,
))
->fetchAllKeyed();
return count($authmaps) ? $authmaps : 0;
}
function user_set_authmaps($account, $authmaps) {
foreach ($authmaps as $key => $value) {
$module = explode('_', $key, 2);
if ($value) {
db_merge('authmap')
->key(array(
'uid' => $account->uid,
'module' => $module[1],
))
->fields(array(
'authname' => $value,
))
->execute();
}
else {
db_delete('authmap')
->condition('uid', $account->uid)
->condition('module', $module[1])
->execute();
}
}
}
function user_login_form($form, &$form_state) {
$form['name'] = array(
'#type' => 'textfield',
'#title' => t('Username'),
'#size' => 60,
'#maxlength' => USERNAME_MAX_LENGTH,
'#description' => t('Enter your @s username.', array(
'@s' => config('system.site')
->get('name'),
)),
'#required' => TRUE,
'#attributes' => array(
'autofocus' => 'autofocus',
),
);
$form['pass'] = array(
'#type' => 'password',
'#title' => t('Password'),
'#size' => 60,
'#description' => t('Enter the password that accompanies your username.'),
'#required' => TRUE,
);
$form['actions'] = array(
'#type' => 'actions',
);
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => t('Log in'),
);
$form['#validate'] = user_login_default_validators();
return $form;
}
function user_login_default_validators() {
return array(
'user_login_name_validate',
'user_login_authenticate_validate',
'user_login_final_validate',
);
}
function user_login_name_validate($form, &$form_state) {
if (isset($form_state['values']['name']) && user_is_blocked($form_state['values']['name'])) {
form_set_error('name', t('The username %name has not been activated or is blocked.', array(
'%name' => $form_state['values']['name'],
)));
}
}
function user_login_authenticate_validate($form, &$form_state) {
$password = trim($form_state['values']['pass']);
$flood_config = config('user.flood');
if (!empty($form_state['values']['name']) && !empty($password)) {
if (!drupal_container()
->get('flood')
->isAllowed('user.failed_login_ip', $flood_config
->get('ip_limit'), $flood_config
->get('ip_window'))) {
$form_state['flood_control_triggered'] = 'ip';
return;
}
$account = db_query("SELECT * FROM {users} WHERE name = :name AND status = 1", array(
':name' => $form_state['values']['name'],
))
->fetchObject();
if ($account) {
if ($flood_config
->get('uid_only')) {
$identifier = $account->uid;
}
else {
$identifier = $account->uid . '-' . ip_address();
}
$form_state['flood_control_user_identifier'] = $identifier;
if (!drupal_container()
->get('flood')
->isAllowed('user.failed_login_user', $flood_config
->get('user_limit'), $flood_config
->get('user_window'), $identifier)) {
$form_state['flood_control_triggered'] = 'user';
return;
}
}
$form_state['uid'] = user_authenticate($form_state['values']['name'], $password);
}
}
function user_login_final_validate($form, &$form_state) {
$flood_config = config('user.flood');
if (empty($form_state['uid'])) {
drupal_container()
->get('flood')
->register('user.failed_login_ip', $flood_config
->get('ip_window'));
if (isset($form_state['flood_control_user_identifier'])) {
drupal_container()
->get('flood')
->register('user.failed_login_user', $flood_config
->get('user_window'), $form_state['flood_control_user_identifier']);
}
if (isset($form_state['flood_control_triggered'])) {
if ($form_state['flood_control_triggered'] == 'user') {
form_set_error('name', format_plural($flood_config
->get('user_limit'), 'Sorry, there has been more than one failed login attempt for this account. It is temporarily blocked. Try again later or <a href="@url">request a new password</a>.', 'Sorry, there have been more than @count failed login attempts for this account. It is temporarily blocked. Try again later or <a href="@url">request a new password</a>.', array(
'@url' => url('user/password'),
)));
}
else {
form_set_error('name', t('Sorry, too many failed login attempts from your IP address. This IP address is temporarily blocked. Try again later or <a href="@url">request a new password</a>.', array(
'@url' => url('user/password'),
)));
}
}
else {
form_set_error('name', t('Sorry, unrecognized username or password. <a href="@password">Have you forgotten your password?</a>', array(
'@password' => url('user/password'),
)));
watchdog('user', 'Login attempt failed for %user.', array(
'%user' => $form_state['values']['name'],
));
}
}
elseif (isset($form_state['flood_control_user_identifier'])) {
drupal_container()
->get('flood')
->clear('user.failed_login_user', $form_state['flood_control_user_identifier']);
}
}
function user_authenticate($name, $password) {
$uid = FALSE;
if (!empty($name) && !empty($password)) {
$account = user_load_by_name($name);
if ($account) {
$password_hasher = drupal_container()
->get('password');
if ($password_hasher
->check($password, $account)) {
$uid = $account->uid;
if ($password_hasher
->userNeedsNewHash($account)) {
$account->pass = $password;
$account
->save();
}
}
}
}
return $uid;
}
function user_login_finalize(&$edit = array()) {
global $user;
watchdog('user', 'Session opened for %name.', array(
'%name' => $user->name,
));
$user->login = REQUEST_TIME;
db_update('users')
->fields(array(
'login' => $user->login,
))
->condition('uid', $user->uid)
->execute();
drupal_session_regenerate();
module_invoke_all('user_login', $edit, $user);
}
function user_login_form_submit($form, &$form_state) {
global $user;
$user = user_load($form_state['uid']);
$form_state['redirect'] = 'user/' . $user->uid;
user_login_finalize($form_state);
}
function user_user_login($edit, $account) {
drupal_static_reset('template_preprocess');
}
function user_user_logout($account) {
drupal_static_reset('template_preprocess');
}
function user_external_login_register($name, $module) {
$account = user_external_load($name);
if (!$account) {
$account = entity_create('user', array(
'name' => $name,
'pass' => user_password(),
'init' => $name,
'status' => 1,
'access' => REQUEST_TIME,
));
$status = $account
->save();
if ($status != SAVED_NEW) {
drupal_set_message(t("Error saving user account."), 'error');
return;
}
user_set_authmaps($account, array(
"authname_{$module}" => $name,
));
}
$form_state['uid'] = $account->uid;
user_login_form_submit(array(), $form_state);
}
function user_pass_reset_url($account, $options = array()) {
$timestamp = REQUEST_TIME;
$langcode = isset($options['langcode']) ? $options['langcode'] : user_preferred_langcode($account);
$url_options = array(
'absolute' => TRUE,
'language' => language_load($langcode),
);
return url("user/reset/{$account->uid}/{$timestamp}/" . user_pass_rehash($account->pass, $timestamp, $account->login), $url_options);
}
function user_cancel_url($account, $options = array()) {
$timestamp = REQUEST_TIME;
$langcode = isset($options['langcode']) ? $options['langcode'] : user_preferred_langcode($account);
$url_options = array(
'absolute' => TRUE,
'language' => language_load($langcode),
);
return url("user/{$account->uid}/cancel/confirm/{$timestamp}/" . user_pass_rehash($account->pass, $timestamp, $account->login), $url_options);
}
function user_pass_rehash($password, $timestamp, $login) {
return drupal_hmac_base64($timestamp . $login, drupal_get_hash_salt() . $password);
}
function user_cancel($edit, $uid, $method) {
global $user;
$account = user_load($uid);
if (!$account) {
drupal_set_message(t('The user account %id does not exist.', array(
'%id' => $uid,
)), 'error');
watchdog('user', 'Attempted to cancel non-existing user account: %id.', array(
'%id' => $uid,
), WATCHDOG_ERROR);
return;
}
$batch = array(
'title' => t('Cancelling account'),
'operations' => array(),
);
batch_set($batch);
if ($method != 'user_cancel_delete') {
module_invoke_all('user_cancel', $edit, $account, $method);
}
$batch = array(
'title' => t('Cancelling user account'),
'operations' => array(
array(
'_user_cancel',
array(
$edit,
$account,
$method,
),
),
),
);
batch_set($batch);
}
function _user_cancel($edit, $account, $method) {
global $user;
switch ($method) {
case 'user_cancel_block':
case 'user_cancel_block_unpublish':
default:
if (!empty($edit['user_cancel_notify'])) {
_user_mail_notify('status_blocked', $account);
}
$account->status = 0;
$account
->save();
drupal_set_message(t('%name has been disabled.', array(
'%name' => $account->name,
)));
watchdog('user', 'Blocked user: %name %email.', array(
'%name' => $account->name,
'%email' => '<' . $account->mail . '>',
), WATCHDOG_NOTICE);
break;
case 'user_cancel_reassign':
case 'user_cancel_delete':
if (!empty($edit['user_cancel_notify'])) {
_user_mail_notify('status_canceled', $account);
}
user_delete($account->uid);
drupal_set_message(t('%name has been deleted.', array(
'%name' => $account->name,
)));
watchdog('user', 'Deleted user: %name %email.', array(
'%name' => $account->name,
'%email' => '<' . $account->mail . '>',
), WATCHDOG_NOTICE);
break;
}
if ($account->uid == $user->uid) {
session_destroy();
}
cache_invalidate_tags(array(
'content' => TRUE,
));
}
function user_delete($uid) {
user_delete_multiple(array(
$uid,
));
}
function user_delete_multiple(array $uids) {
entity_delete_multiple('user', $uids);
}
function user_view_page($account) {
if (is_object($account)) {
return user_view($account);
}
throw new NotFoundHttpException();
}
function user_view($account, $view_mode = 'full', $langcode = NULL) {
return entity_view($account, $view_mode, $langcode);
}
function user_view_multiple($accounts, $view_mode = 'full', $langcode = NULL) {
return entity_view($accounts, $view_mode, $langcode);
}
function user_mail($key, &$message, $params) {
$langcode = $message['langcode'];
$variables = array(
'user' => $params['account'],
);
$message['subject'] .= _user_mail_text($key . '.subject', $langcode, $variables);
$message['body'][] = _user_mail_text($key . '.body', $langcode, $variables);
}
function _user_mail_text($key, $langcode = NULL, $variables = array()) {
return token_replace(config('user.mail')
->get($key), $variables, array(
'langcode' => $langcode,
'callback' => 'user_mail_tokens',
'sanitize' => FALSE,
'clear' => TRUE,
));
}
function user_mail_tokens(&$replacements, $data, $options) {
if (isset($data['user'])) {
$replacements['[user:one-time-login-url]'] = user_pass_reset_url($data['user'], $options);
$replacements['[user:cancel-url]'] = user_cancel_url($data['user'], $options);
}
}
function user_roles($membersonly = FALSE, $permission = NULL) {
$user_roles =& drupal_static(__FUNCTION__);
if (empty($permission)) {
$cid = $membersonly ? DRUPAL_AUTHENTICATED_RID : DRUPAL_ANONYMOUS_RID;
if (isset($user_roles[$cid])) {
return $user_roles[$cid];
}
}
$query = db_select('role', 'r');
$query
->addTag('translatable');
$query
->fields('r', array(
'rid',
'name',
));
$query
->orderBy('weight');
$query
->orderBy('name');
if (!empty($permission)) {
$query
->innerJoin('role_permission', 'p', 'r.rid = p.rid');
$query
->condition('p.permission', $permission);
}
if ($membersonly) {
$query
->condition('r.rid', DRUPAL_ANONYMOUS_RID, '!=');
}
$roles = $query
->execute()
->fetchAllKeyed();
if (empty($permission)) {
$user_roles[$cid] = $roles;
return $user_roles[$cid];
}
return $roles;
}
function user_role_load($rid) {
return db_select('role', 'r')
->fields('r')
->condition('rid', $rid)
->execute()
->fetchObject();
}
function user_role_save($role) {
if ($role->name) {
$role->name = trim($role->name);
}
if (!isset($role->weight)) {
$query = db_select('role');
$query
->addExpression('MAX(weight)');
$role->weight = $query
->execute()
->fetchField() + 1;
}
module_invoke_all('user_role_presave', $role);
$exists = db_select('role', 'r')
->fields('r', array(
'rid',
))
->condition('rid', $role->rid)
->execute()
->fetchAll();
if (empty($exists)) {
$status = drupal_write_record('role', $role);
module_invoke_all('user_role_insert', $role);
}
else {
$status = drupal_write_record('role', $role, 'rid');
module_invoke_all('user_role_update', $role);
}
drupal_static_reset('user_access');
drupal_static_reset('user_role_permissions');
return $status;
}
function user_role_delete($role) {
$role = user_role_load($role);
db_delete('role')
->condition('rid', $role->rid)
->execute();
db_delete('role_permission')
->condition('rid', $role->rid)
->execute();
db_delete('users_roles')
->condition('rid', $role->rid)
->execute();
module_invoke_all('user_role_delete', $role);
drupal_static_reset('user_access');
drupal_static_reset('user_role_permissions');
}
function user_role_delete_access($role) {
if ($role->rid == DRUPAL_ANONYMOUS_RID || $role->rid == DRUPAL_AUTHENTICATED_RID) {
return FALSE;
}
return user_access('administer permissions');
}
function user_permission_get_modules() {
$permissions = array();
foreach (module_implements('permission') as $module) {
$perms = module_invoke($module, 'permission');
foreach ($perms as $key => $value) {
$permissions[$key] = $module;
}
}
return $permissions;
}
function user_role_change_permissions($rid, array $permissions = array()) {
$grant = array_filter($permissions);
if (!empty($grant)) {
user_role_grant_permissions($rid, array_keys($grant));
}
$revoke = array_diff_assoc($permissions, $grant);
if (!empty($revoke)) {
user_role_revoke_permissions($rid, array_keys($revoke));
}
}
function user_role_grant_permissions($rid, array $permissions = array()) {
$modules = user_permission_get_modules();
foreach ($permissions as $name) {
db_merge('role_permission')
->key(array(
'rid' => $rid,
'permission' => $name,
))
->fields(array(
'module' => $modules[$name],
))
->execute();
}
drupal_static_reset('user_access');
drupal_static_reset('user_role_permissions');
}
function user_role_revoke_permissions($rid, array $permissions = array()) {
db_delete('role_permission')
->condition('rid', $rid)
->condition('permission', $permissions, 'IN')
->execute();
drupal_static_reset('user_access');
drupal_static_reset('user_role_permissions');
}
function user_user_operations($form = array(), $form_state = array()) {
$operations = array(
'unblock' => array(
'label' => t('Unblock the selected users'),
'callback' => 'user_user_operations_unblock',
),
'block' => array(
'label' => t('Block the selected users'),
'callback' => 'user_user_operations_block',
),
'cancel' => array(
'label' => t('Cancel the selected user accounts'),
),
);
if (user_access('administer permissions')) {
$roles = user_roles(TRUE);
unset($roles[DRUPAL_AUTHENTICATED_RID]);
$add_roles = array();
foreach ($roles as $key => $value) {
$add_roles['add_role-' . $key] = $value;
}
$remove_roles = array();
foreach ($roles as $key => $value) {
$remove_roles['remove_role-' . $key] = $value;
}
if (count($roles)) {
$role_operations = array(
t('Add a role to the selected users') => array(
'label' => $add_roles,
),
t('Remove a role from the selected users') => array(
'label' => $remove_roles,
),
);
$operations += $role_operations;
}
}
if (!empty($form_state['submitted'])) {
$operation_rid = explode('-', $form_state['values']['operation']);
$operation = $operation_rid[0];
if ($operation == 'add_role' || $operation == 'remove_role') {
$rid = $operation_rid[1];
if (user_access('administer permissions')) {
$operations[$form_state['values']['operation']] = array(
'callback' => 'user_multiple_role_edit',
'callback arguments' => array(
$operation,
$rid,
),
);
}
else {
watchdog('security', 'Detected malicious attempt to alter protected user fields.', array(), WATCHDOG_WARNING);
return;
}
}
}
return $operations;
}
function user_user_operations_unblock($accounts) {
$accounts = user_load_multiple($accounts);
foreach ($accounts as $account) {
if ($account !== FALSE && $account->status == 0) {
$account->status = 1;
$account
->save();
}
}
}
function user_user_operations_block($accounts) {
$accounts = user_load_multiple($accounts);
foreach ($accounts as $account) {
if ($account !== FALSE && $account->status == 1) {
$account->original = clone $account;
$account->status = 0;
$account
->save();
}
}
}
function user_multiple_role_edit($accounts, $operation, $rid) {
$role_name = db_query('SELECT name FROM {role} WHERE rid = :rid', array(
':rid' => $rid,
))
->fetchField();
switch ($operation) {
case 'add_role':
$accounts = user_load_multiple($accounts);
foreach ($accounts as $account) {
if ($account !== FALSE && !isset($account->roles[$rid])) {
$roles = $account->roles + array(
$rid => $role_name,
);
$account->original = clone $account;
$account->roles = $roles;
$account
->save();
}
}
break;
case 'remove_role':
$accounts = user_load_multiple($accounts);
foreach ($accounts as $account) {
if ($account !== FALSE && isset($account->roles[$rid])) {
$roles = array_diff($account->roles, array(
$rid => $role_name,
));
$account->original = clone $account;
$account->roles = $roles;
$account
->save();
}
}
break;
}
}
function user_multiple_cancel_confirm($form, &$form_state) {
$edit = $form_state['input'];
$form['accounts'] = array(
'#prefix' => '<ul>',
'#suffix' => '</ul>',
'#tree' => TRUE,
);
$accounts = user_load_multiple(array_keys(array_filter($edit['accounts'])));
foreach ($accounts as $uid => $account) {
if ($uid <= 1) {
continue;
}
$form['accounts'][$uid] = array(
'#type' => 'hidden',
'#value' => $uid,
'#prefix' => '<li>',
'#suffix' => check_plain($account->name) . "</li>\n",
);
}
if (isset($accounts[1])) {
$redirect = count($accounts) == 1;
$message = t('The user account %name cannot be cancelled.', array(
'%name' => $accounts[1]->name,
));
drupal_set_message($message, $redirect ? 'error' : 'warning');
if ($redirect) {
drupal_goto('admin/people');
}
}
$form['operation'] = array(
'#type' => 'hidden',
'#value' => 'cancel',
);
form_load_include($form_state, 'inc', 'user', 'user.pages');
$form['user_cancel_method'] = array(
'#type' => 'radios',
'#title' => t('When cancelling these accounts'),
);
$form['user_cancel_method'] += user_cancel_methods();
$form['user_cancel_confirm'] = array(
'#type' => 'checkbox',
'#title' => t('Require e-mail confirmation to cancel account.'),
'#default_value' => FALSE,
'#description' => t('When enabled, the user must confirm the account cancellation via e-mail.'),
);
$form['user_cancel_notify'] = array(
'#type' => 'checkbox',
'#title' => t('Notify user when account is canceled.'),
'#default_value' => FALSE,
'#access' => config('user.settings')
->get('notify.status_canceled'),
'#description' => t('When enabled, the user will receive an e-mail notification after the account has been cancelled.'),
);
return confirm_form($form, t('Are you sure you want to cancel these user accounts?'), 'admin/people', t('This action cannot be undone.'), t('Cancel accounts'), t('Cancel'));
}
function user_multiple_cancel_confirm_submit($form, &$form_state) {
global $user;
if ($form_state['values']['confirm']) {
foreach ($form_state['values']['accounts'] as $uid => $value) {
if ($uid <= 1) {
continue;
}
if ($uid == $user->uid) {
$admin_form_state = $form_state;
unset($admin_form_state['values']['user_cancel_confirm']);
$admin_form_state['values']['_account'] = user_load($user->uid);
user_cancel_confirm_form_submit(array(), $admin_form_state);
}
else {
user_cancel($form_state['values'], $uid, $form_state['values']['user_cancel_method']);
}
}
}
$form_state['redirect'] = 'admin/people';
}
function user_filters() {
$filters = array();
$roles = user_roles(TRUE);
unset($roles[DRUPAL_AUTHENTICATED_RID]);
if (count($roles)) {
$filters['role'] = array(
'title' => t('role'),
'field' => 'ur.rid',
'options' => array(
'[any]' => t('any'),
) + $roles,
);
}
$options = array();
foreach (module_implements('permission') as $module) {
$function = $module . '_permission';
if ($permissions = $function('permission')) {
asort($permissions);
foreach ($permissions as $permission => $description) {
$options[t('@module module', array(
'@module' => $module,
))][$permission] = t($permission);
}
}
}
ksort($options);
$filters['permission'] = array(
'title' => t('permission'),
'options' => array(
'[any]' => t('any'),
) + $options,
);
$filters['status'] = array(
'title' => t('status'),
'field' => 'u.status',
'options' => array(
'[any]' => t('any'),
1 => t('active'),
0 => t('blocked'),
),
);
return $filters;
}
function user_build_filter_query(SelectInterface $query) {
$filters = user_filters();
foreach (isset($_SESSION['user_overview_filter']) ? $_SESSION['user_overview_filter'] : array() as $filter) {
list($key, $value) = $filter;
if ($key == 'permission') {
$account = entity_create('user', array());
$account->uid = 'user_filter';
$account->roles = array(
DRUPAL_AUTHENTICATED_RID => 1,
);
if (user_access($value, $account)) {
continue;
}
$users_roles_alias = $query
->join('users_roles', 'ur', '%alias.uid = u.uid');
$permission_alias = $query
->join('role_permission', 'p', $users_roles_alias . '.rid = %alias.rid');
$query
->condition($permission_alias . '.permission', $value);
}
elseif ($key == 'role') {
$users_roles_alias = $query
->join('users_roles', 'ur', '%alias.uid = u.uid');
$query
->condition($users_roles_alias . '.rid', $value);
}
else {
$query
->condition($filters[$key]['field'], $value);
}
}
}
function user_comment_view($comment) {
if (config('user.settings')
->get('signatures') && !empty($comment->signature)) {
$comment->signature = check_markup($comment->signature, $comment->signature_format, '', TRUE);
}
else {
$comment->signature = '';
}
}
function theme_user_signature($variables) {
$signature = $variables['signature'];
$output = '';
if ($signature) {
$output .= '<div class="clear">';
$output .= '<div>—</div>';
$output .= $signature;
$output .= '</div>';
}
return $output;
}
function user_preferred_langcode($account, $type = NULL, $default = NULL) {
$language_list = language_list();
if (isset($type)) {
$preferred_langcode = $account->{'preferred_' . $type . '_langcode'};
}
else {
$preferred_langcode = $account->preferred_langcode;
}
if (!empty($preferred_langcode) && isset($language_list[$preferred_langcode])) {
return $language_list[$preferred_langcode]->langcode;
}
else {
return $default ? $default : language_default()->langcode;
}
}
function _user_mail_notify($op, $account, $langcode = NULL) {
$notify = config('user.settings')
->get('notify.' . $op);
if ($notify || $op != 'status_canceled' && $op != 'status_blocked') {
$params['account'] = $account;
$langcode = $langcode ? $langcode : user_preferred_langcode($account);
$mail = drupal_mail('user', $op, $account->mail, $langcode, $params);
if ($op == 'register_pending_approval') {
$site_mail = config('system.site')
->get('mail');
if (empty($site_mail)) {
$site_mail = ini_get('sendmail_from');
}
drupal_mail('user', 'register_pending_approval_admin', $site_mail, language_default()->langcode, $params);
}
}
return empty($mail) ? NULL : $mail['result'];
}
function user_form_process_password_confirm($element) {
global $user;
$js_settings = array(
'password' => array(
'strengthTitle' => t('Password strength:'),
'hasWeaknesses' => t('To make your password stronger:'),
'tooShort' => t('Make it at least 6 characters'),
'addLowerCase' => t('Add lowercase letters'),
'addUpperCase' => t('Add uppercase letters'),
'addNumbers' => t('Add numbers'),
'addPunctuation' => t('Add punctuation'),
'sameAsUsername' => t('Make it different from your username'),
'confirmSuccess' => t('yes'),
'confirmFailure' => t('no'),
'weak' => t('Weak'),
'fair' => t('Fair'),
'good' => t('Good'),
'strong' => t('Strong'),
'confirmTitle' => t('Passwords match:'),
'username' => isset($user->name) ? $user->name : '',
),
);
$element['#attached']['library'][] = array(
'user',
'drupal.user',
);
static $already_added = FALSE;
if (!$already_added) {
$already_added = TRUE;
$element['#attached']['js'][] = array(
'data' => $js_settings,
'type' => 'setting',
);
}
return $element;
}
function user_node_load($nodes, $types) {
$uids = array();
foreach ($nodes as $nid => $node) {
$uids[$nid] = $node->uid;
}
$user_names = db_query("SELECT uid, name FROM {users} WHERE uid IN (:uids)", array(
':uids' => $uids,
))
->fetchAllKeyed();
foreach ($uids as $nid => $uid) {
$nodes[$nid]->name = $user_names[$uid];
}
}
function user_action_info() {
return array(
'user_block_user_action' => array(
'label' => t('Block current user'),
'type' => 'user',
'configurable' => FALSE,
'triggers' => array(
'any',
),
),
);
}
function user_block_user_action(&$entity, $context = array()) {
if (isset($entity->uid)) {
$uid = $entity->uid;
}
elseif (isset($context['uid'])) {
$uid = $context['uid'];
}
else {
$uid = $GLOBALS['user']->uid;
}
$account = user_load($uid);
$account->status = 0;
$account
->save();
watchdog('action', 'Blocked user %name.', array(
'%name' => $account->name,
));
}
function user_form_field_ui_field_edit_form_alter(&$form, &$form_state, $form_id) {
$instance = $form['#instance'];
if ($instance['entity_type'] == 'user') {
$form['instance']['settings']['user_register_form'] = array(
'#type' => 'checkbox',
'#title' => t('Display on user registration form.'),
'#description' => t("This is compulsory for 'required' fields."),
'#default_value' => $instance['settings']['user_register_form'] || $instance['required'],
'#weight' => $form['instance']['required']['#weight'] + 0.1,
'#states' => array(
'enabled' => array(
'input[name="instance[required]"]' => array(
'checked' => FALSE,
),
),
),
'#attached' => array(
'library' => array(
array(
'user',
'drupal.user',
),
),
),
);
array_unshift($form['#submit'], 'user_form_field_ui_field_edit_form_submit');
}
}
function user_form_field_ui_field_edit_form_submit($form, &$form_state) {
$instance = $form_state['values']['instance'];
if (!empty($instance['required'])) {
form_set_value($form['instance']['settings']['user_register_form'], 1, $form_state);
}
}
function user_modules_installed($modules) {
$rid = config('user.settings')
->get('admin_role');
if ($rid) {
$permissions = array();
foreach ($modules as $module) {
if ($module_permissions = module_invoke($module, 'permission')) {
$permissions = array_merge($permissions, array_keys($module_permissions));
}
}
if (!empty($permissions)) {
user_role_grant_permissions($rid, $permissions);
}
}
}
function user_modules_uninstalled($modules) {
db_delete('role_permission')
->condition('module', $modules, 'IN')
->execute();
drupal_container()
->get('user.data')
->delete($modules);
}
function user_login_destination() {
$destination = drupal_get_destination();
if (preg_match('@^user/login(/.*|)$@', $destination['destination'])) {
$destination['destination'] = 'user';
}
return $destination;
}
function user_cookie_save(array $values) {
foreach ($values as $field => $value) {
setrawcookie('Drupal.visitor.' . $field, rawurlencode($value), REQUEST_TIME + 31536000, '/');
}
}
function user_cookie_delete($cookie_name) {
setrawcookie('Drupal.visitor.' . $cookie_name, '', REQUEST_TIME - 3600, '/');
}
function user_rdf_mapping() {
return array(
array(
'type' => 'user',
'bundle' => RDF_DEFAULT_BUNDLE,
'mapping' => array(
'rdftype' => array(
'sioc:UserAccount',
),
'name' => array(
'predicates' => array(
'foaf:name',
),
),
'homepage' => array(
'predicates' => array(
'foaf:page',
),
'type' => 'rel',
),
),
),
);
}
function user_file_download_access($field, EntityInterface $entity, File $file) {
if ($entity
->entityType() == 'user') {
return user_view_access($entity);
}
}
function user_toolbar() {
global $user;
if ($user->uid) {
$links = array(
'account' => array(
'title' => t('View profile'),
'href' => 'user',
'html' => TRUE,
'attributes' => array(
'title' => t('User account'),
),
),
'logout' => array(
'title' => t('Log out'),
'href' => 'user/logout',
),
);
}
else {
$links = array(
'login' => array(
'title' => t('Log in'),
'href' => 'user',
),
);
}
$user_tray = array(
'#heading' => t('User account actions'),
'content' => array(
'#theme' => 'links__toolbar_user',
'#links' => $links,
'#attributes' => array(
'class' => array(
'menu',
),
),
),
);
$items['user'] = array(
'tab' => array(
'title' => user_format_name($user),
'href' => 'user',
'html' => FALSE,
'attributes' => array(
'title' => t('My account'),
'class' => array(
'icon',
'icon-user',
),
),
),
'tray' => $user_tray,
'weight' => 100,
);
return $items;
}
function user_library_info() {
$libraries['drupal.user'] = array(
'title' => 'User',
'version' => VERSION,
'js' => array(
drupal_get_path('module', 'user') . '/user.js' => array(),
),
'dependencies' => array(
array(
'system',
'jquery',
),
array(
'system',
'drupal',
),
array(
'system',
'jquery.once',
),
),
);
$libraries['drupal.user.permissions'] = array(
'title' => 'User permissions',
'version' => VERSION,
'js' => array(
drupal_get_path('module', 'user') . '/user.permissions.js' => array(),
),
'dependencies' => array(
array(
'system',
'jquery',
),
array(
'system',
'drupal',
),
array(
'system',
'drupalSettings',
),
),
);
return $libraries;
}