user.module
<?php
define('USERNAME_MAX_LENGTH', 60);
define('EMAIL_MAX_LENGTH', 64);
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. On this page you can also manage user roles, 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/handbook/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>, including those who do not have an account (anonymous users), to create user accounts. User accounts can be created through the <a href="@people">People administration page</a>, where you can also manage roles, and block or delete user accounts. If allowed, users can create their own accounts on the <a href="@register">User account</a> page.', array('@permissions' => url('admin/config/people/permissions'), '@people' => url('admin/people'), '@register' => url('user/register'))) . '</dd>';
$output .= '<dt>' . t('User roles and permissions') . '</dt>';
$output .= '<dd>' . t('Administrators can set <a href="@permissions_user">permissions</a> for each user role. Permissions grant or deny access to view, administer, create, edit, and delete various configuration settings and content. Each user is assigned to one or more <a href="@roles">roles</a>. By default there are three roles: <em>anonymous</em> (users that are not logged in), <em>authenticated</em> (users that are registered and logged in), and <em>administrator</em> (generally assigned to users who will be administering the site). Additional custom roles can be created on the <a href="@roles">Roles page</a>.', array('@permissions_user' => url('admin/config/people/permissions'), '@roles' => url('admin/config/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 default role titles, personal contact forms, user registration and account cancellation. On this page you can manage settings for account personalization (including signatures and user pictures) and adapt the texts for the e-mails that are being sent in 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/config/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/config/people/roles'), '@settings' => url('admin/config/people/accounts'))) . '</p>';
case 'admin/config/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 in <a href="@permissions">user permissions</a>. Examples of roles include: anonymous user, authenticated user, moderator, administrator and so on. In this area you will define the <em>role names</em> of the various roles. To delete a role choose "edit".', array('@permissions' => url('admin/config/people/permissions'))) . '</p>';
$output .= '<p>'. t('By default, Drupal comes with two 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 .= '</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_module_invoke($type, &$edit, $account, $category = NULL) {
foreach (module_implements('user_' . $type) as $module) {
$function = $module . '_user_' . $type;
$function($edit, $account, $category);
}
}
function user_theme() {
return array(
'user_picture' => array(
'variables' => array('account' => NULL),
'template' => 'user-picture',
),
'user_profile' => array(
'render element' => 'elements',
'template' => 'user-profile',
'file' => 'user.pages.inc',
),
'user_profile_category' => array(
'render element' => 'element',
'template' => 'user-profile-category',
'file' => 'user.pages.inc',
),
'user_profile_item' => array(
'render element' => 'element',
'template' => 'user-profile-item',
'file' => 'user.pages.inc',
),
'user_list' => array(
'variables' => array('users' => NULL, 'title' => NULL),
),
'user_admin_permissions' => array(
'render element' => 'form',
'file' => 'user.admin.inc',
),
'user_admin_new_role' => array(
'render element' => 'form',
'file' => 'user.admin.inc',
),
'user_filter_form' => array(
'render element' => 'form',
'file' => 'user.admin.inc',
),
'user_filters' => array(
'render element' => 'form',
'file' => 'user.admin.inc',
),
'user_signature' => array(
'variables' => array('signature' => NULL),
),
);
}
function user_entity_info() {
$return = array(
'user' => array(
'label' => t('User'),
'controller class' => 'UserController',
'base table' => 'users',
'fieldable' => TRUE,
'object keys' => array(
'id' => 'uid',
),
'bundles' => array(
'user' => array(
'label' => t('User'),
'admin' => array(
'path' => 'admin/config/people/accounts',
'access arguments' => array('administer users'),
),
),
),
),
);
return $return;
}
function user_field_build_modes($obj_type) {
$modes = array();
if ($obj_type == 'user') {
$modes = array(
'full' => t('User account'),
);
}
return $modes;
}
function user_field_extra_fields($bundle) {
$extra = array();
if ($bundle == 'user') {
$extra['account'] = array(
'label' => 'User name and password',
'description' => t('User module account form elements'),
'weight' => -10,
);
$extra['timezone'] = array(
'label' => 'Timezone',
'description' => t('User module timezone form element.'),
'weight' => 6,
);
$extra['summary'] = array(
'label' => 'History',
'description' => t('User module history view element.'),
'weight' => 5,
);
}
return $extra;
}
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($uids = array(), $conditions = array(), $reset = FALSE) {
return entity_load('user', $uids, $conditions, $reset);
}
class UserController extends DrupalDefaultEntityController {
function attachLoad(&$queried_users) {
$picture_fids = array();
foreach ($queried_users as $key => $record) {
$picture_fids[] = $record->picture;
$queried_users[$key] = drupal_unpack($record);
$queried_users[$key]->roles = array();
if ($record->uid) {
$queried_users[$record->uid]->roles[DRUPAL_AUTHENTICATED_RID] = 'authenticated user';
}
else {
$queried_users[$record->uid]->roles[DRUPAL_ANONYMOUS_RID] = 'anonymous user';
}
}
$result = db_query('SELECT r.rid, r.name, ur.uid FROM {role} r INNER JOIN {users_roles} ur ON ur.rid = r.rid WHERE ur.uid IN (:uids)', array(':uids' => array_keys($queried_users)));
foreach ($result as $record) {
$queried_users[$record->uid]->roles[$record->rid] = $record->name;
}
if (!empty($picture_fids) && variable_get('user_pictures', 1) == 1) {
$pictures = file_load_multiple($picture_fids);
foreach ($queried_users as $account) {
if (!empty($account->picture) && isset($pictures[$account->picture])) {
$account->picture = $pictures[$account->picture];
}
else {
$account->picture = NULL;
}
}
}
parent::attachLoad($queried_users);
}
}
function user_load($uid, $reset = FALSE) {
$users = user_load_multiple(array($uid), array(), $reset);
return reset($users);
}
function user_load_by_mail($mail) {
$users = user_load_multiple(array(), array('mail' => $mail));
return reset($users);
}
function user_load_by_name($name) {
$users = user_load_multiple(array(), array('name' => $name));
return reset($users);
}
function user_save($account, $edit = array(), $category = 'account') {
$transaction = db_transaction();
try {
$table = drupal_get_schema('users');
$user_fields = $table['fields'];
if (!empty($edit['pass'])) {
require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
$edit['pass'] = user_hash_password(trim($edit['pass']));
if (!$edit['pass']) {
return FALSE;
}
}
else {
unset($edit['pass']);
}
$field_form = array();
$field_form_state = array();
$edit = (object) $edit;
field_attach_form('user', $edit, $field_form, $field_form_state);
field_attach_presave('user', $edit);
$edit = (array) $edit;
if (!isset($account->is_new)) {
$account->is_new = empty($account->uid);
}
user_module_invoke('presave', $edit, $account, $category);
if (is_object($account) && !$account->is_new) {
$data = unserialize(db_query('SELECT data FROM {users} WHERE uid = :uid', array(':uid' => $account->uid))->fetchField());
if (empty($edit['access']) && empty($account->access) && user_access('administer users')) {
$edit['access'] = REQUEST_TIME;
}
foreach ($edit as $key => $value) {
if (!in_array($key, array('roles', 'is_new')) && empty($user_fields[$key]) && empty($field_form[$key])) {
if ($value === NULL) {
unset($data[$key]);
}
else {
$data[$key] = $value;
}
}
}
if (!empty($edit['picture']->fid)) {
$picture = $edit['picture'];
if (($picture->status & FILE_STATUS_PERMANENT) == 0) {
$info = image_get_info($picture->uri);
$picture_directory = variable_get('file_default_scheme', 'public') . '://' . variable_get('user_picture_path', 'pictures');
file_prepare_directory($picture_directory, FILE_CREATE_DIRECTORY);
$destination = file_stream_wrapper_uri_normalize($picture_directory . '/picture-' . $account->uid . '.' . $info['extension']);
if ($picture = file_move($picture, $destination, FILE_EXISTS_REPLACE)) {
$picture->status |= FILE_STATUS_PERMANENT;
$edit['picture'] = file_save($picture);
}
}
}
$edit['picture'] = empty($edit['picture']->fid) ? 0 : $edit['picture']->fid;
$edit['data'] = $data;
$edit['uid'] = $account->uid;
$success = drupal_write_record('users', $edit, 'uid');
if ($success === FALSE) {
return FALSE;
}
if (!empty($account->picture->fid) && ($edit['picture'] != $account->picture->fid)) {
file_delete($account->picture);
}
if (isset($edit['roles']) && is_array($edit['roles'])) {
db_delete('users_roles')
->condition('uid', $account->uid)
->execute();
$query = db_insert('users_roles')->fields(array('uid', 'rid'));
foreach (array_keys($edit['roles']) as $rid) {
if (!in_array($rid, array(DRUPAL_ANONYMOUS_RID, DRUPAL_AUTHENTICATED_RID))) {
$query->values(array(
'uid' => $account->uid,
'rid' => $rid,
));
}
}
$query->execute();
}
if (isset($edit['status']) && $edit['status'] == 0) {
drupal_session_destroy_uid($account->uid);
}
if (!empty($edit['pass'])) {
drupal_session_destroy_uid($account->uid);
if ($account->uid == $GLOBALS['user']->uid) {
drupal_session_regenerate();
}
}
$object = (object) $edit;
field_attach_update('user', $object);
$user = user_load($account->uid, TRUE);
if (isset($edit['status']) && $edit['status'] != $account->status) {
$op = $edit['status'] == 1 ? 'status_activated' : 'status_blocked';
_user_mail_notify($op, $user);
}
user_module_invoke('update', $edit, $user, $category);
}
else {
if (empty($edit['uid'])) {
$edit['uid'] = db_next_id(db_query('SELECT MAX(uid) FROM {users}')->fetchField());
}
if (!isset($edit['created'])) {
$edit['created'] = REQUEST_TIME;
}
if (empty($edit['access']) && user_access('administer users')) {
$edit['access'] = REQUEST_TIME;
}
$edit['mail'] = trim($edit['mail']);
$success = drupal_write_record('users', $edit);
if ($success === FALSE) {
return FALSE;
}
$user = user_load($edit['uid'], TRUE);
$object = (object) $edit;
field_attach_insert('user', $object);
user_module_invoke('insert', $edit, $user, $category);
$data = array();
foreach ($edit as $key => $value) {
if ((!in_array($key, array('roles', 'is_new'))) && (empty($user_fields[$key]) && empty($field_form[$key])) && ($value !== NULL)) {
$data[$key] = $value;
}
}
if (!empty($data)) {
$data_array = array('uid' => $user->uid, 'data' => $data);
drupal_write_record('users', $data_array, 'uid');
}
if (isset($edit['roles']) && is_array($edit['roles'])) {
db_delete('users_roles')
->condition('uid', $edit['uid'])
->execute();
$query = db_insert('users_roles')->fields(array('uid', 'rid'));
foreach (array_keys($edit['roles']) as $rid) {
if (!in_array($rid, array(DRUPAL_ANONYMOUS_RID, DRUPAL_AUTHENTICATED_RID))) {
$query->values(array(
'uid' => $edit['uid'],
'rid' => $rid,
));
}
}
$query->execute();
}
$user = user_load($edit['uid'], TRUE);
}
return $user;
}
catch (Exception $e) {
$transaction->rollback('user', $e->getMessage(), array(), WATCHDOG_ERROR);
}
}
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_validate_mail($mail) {
$mail = trim($mail);
if (!$mail) {
return t('You must enter an e-mail address.');
}
if (!valid_email_address($mail)) {
return t('The e-mail address %mail is not valid.', array('%mail' => $mail));
}
}
function user_validate_picture(&$form, &$form_state) {
$validators = array(
'file_validate_is_image' => array(),
'file_validate_image_resolution' => array(variable_get('user_picture_dimensions', '85x85')),
'file_validate_size' => array(variable_get('user_picture_file_size', '30') * 1024),
);
$file = file_save_upload('picture_upload', $validators);
if ($file === FALSE) {
form_set_error('picture_upload', t("Failed to upload the picture image; the %directory directory doesn't exist or is not writable.", array('%directory' => variable_get('user_picture_path', 'pictures'))));
}
elseif ($file !== NULL) {
$form_state['values']['picture_upload'] = $file;
}
}
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 = array();
isset($drupal_static[__FUNCTION__]) || ($drupal_static[__FUNCTION__] = &drupal_static(__FUNCTION__));
$perm = &$drupal_static[__FUNCTION__];
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) {
$deny = db_query("SELECT name FROM {users} WHERE status = 0 AND name = LOWER(:name)", array(':name' => $name))->fetchObject();
return $deny;
}
function user_permission() {
return array(
'administer permissions' => array(
'title' => t('Administer permissions'),
'description' => theme('placeholder', array('text' => t('Warning: Give to trusted roles only; this permission has security implications.'))),
),
'administer users' => array(
'title' => t('Administer users'),
'description' => theme('placeholder', array('text' => t('Warning: Give to trusted roles only; this permission has security implications.'))),
),
'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 transfered to the %anonymous-name user depending on the configured <a href="@user-settings-url">user settings</a>.', array('%anonymous-name' => variable_get('anonymous', t('Anonymous')), '@user-settings-url' => url('admin/config/people/accounts'))),
),
'select account cancellation method' => array(
'title' => t('Select method for cancelling own account'),
'description' => theme('placeholder', array('text' => t('Warning: Give to trusted roles only; this permission has security implications.'))),
),
);
}
function user_file_download($uri) {
if (strpos(file_uri_target($uri), variable_get('user_picture_path', 'pictures') . '/picture-') === 0) {
$info = image_get_info($uri);
return array('Content-Type' => $info['mime_type']);
}
}
function user_file_references($file) {
$file_used = (bool) db_query_range('SELECT 1 FROM {users} WHERE picture = :fid', 0, 1, array(':fid' => $file->fid))->fetchField();
if ($file_used) {
return array('user' => $count);
}
}
function user_file_delete($file) {
db_update('users')
->fields(array('picture' => 0))
->condition('picture', $file->fid)
->execute();
}
function user_search_info() {
return array(
'title' => 'Users',
);
}
function user_search_access() {
return user_access('access user profiles');
}
function user_search_execute($keys = NULL) {
$find = array();
$keys = preg_replace('!\*+!', '%', $keys);
$query = db_select('users')->extend('PagerDefault');
$query->fields('users', array('name', 'uid', 'mail'));
if (user_access('administer users')) {
$query->condition(db_or()->
where('LOWER(name) LIKE LOWER(:name)', array(':name' => "%$keys%"))->
where('LOWER(mail) LIKE LOWER(:mail)', array(':mail' => "%$keys%")));
}
else {
$query->where('LOWER(name) LIKE LOWER(:name)', array(':name' => "%$keys%"));
}
$result = $query
->limit(15)
->execute();
foreach ($result as $account) {
$find[] = array('title' => $account->name . ' (' . $account->mail . ')', 'link' => url('user/' . $account->uid, array('absolute' => TRUE)));
}
return $find;
}
function user_element_info() {
$types['user_profile_category'] = array(
'#theme_wrappers' => array('user_profile_category'),
);
$types['user_profile_item'] = array(
'#theme' => 'user_profile_item',
);
return $types;
}
function user_user_view($account) {
$account->content['user_picture'] = array(
'#markup' => theme('user_picture', array('account' => $account)),
'#weight' => -10,
);
if (!isset($account->content['summary'])) {
$account->content['summary'] = array();
}
$account->content['summary'] += array(
'#type' => 'user_profile_category',
'#attributes' => array('class' => array('user-member')),
'#weight' => 5,
'#title' => t('History'),
);
$account->content['summary']['member_for'] = array(
'#type' => 'user_profile_item',
'#title' => t('Member for'),
'#markup' => format_interval(REQUEST_TIME - $account->created),
);
}
function user_account_form(&$form, &$form_state) {
global $user;
$account = $form['#user'];
$register = ($form['#user']->uid > 0 ? FALSE : TRUE);
$admin = user_access('administer users');
$form['#validate'][] = 'user_account_form_validate';
$form['account'] = array(
'#type' => 'fieldset',
'#title' => t('Account information'),
'#weight' => -10,
);
$form['account']['name'] = array(
'#type' => 'textfield',
'#title' => t('Username'),
'#maxlength' => USERNAME_MAX_LENGTH,
'#description' => t('Spaces are allowed; punctuation is not allowed except for periods, hyphens, apostrophes, and underscores.'),
'#required' => TRUE,
'#attributes' => array('class' => array('username')),
'#default_value' => (!$register ? $account->name : ''),
'#access' => ($register || ($user->uid == $account->uid && user_access('change own username')) || $admin),
);
$form['account']['mail'] = array(
'#type' => 'textfield',
'#title' => t('E-mail address'),
'#maxlength' => EMAIL_MAX_LENGTH,
'#description' => t('A valid e-mail address. All e-mails from the system will be sent to this address. The e-mail address is not made public and will only be used if you wish to receive a new password or wish to receive certain news or notifications by e-mail.'),
'#required' => TRUE,
'#default_value' => (!$register ? $account->mail : ''),
);
if (!$register) {
$form['account']['pass'] = array(
'#type' => 'password_confirm',
'#size' => 25,
'#description' => t('To change the current user password, enter the new password in both fields.'),
);
}
elseif (!variable_get('user_email_verification', TRUE) || $admin) {
$form['account']['pass'] = array(
'#type' => 'password_confirm',
'#size' => 25,
'#description' => t('Provide a password for the new account in both fields.'),
'#required' => TRUE,
);
}
if ($admin) {
$status = (isset($account->status) ? $account->status : 1);
}
else {
$status = (variable_get('user_register', 1) == 1);
}
$form['account']['status'] = array(
'#type' => 'radios',
'#title' => t('Status'),
'#default_value' => $status,
'#options' => array(t('Blocked'), t('Active')),
'#access' => $admin,
);
$roles = user_roles(TRUE);
$checkbox_authenticated = array(
'#type' => 'checkbox',
'#title' => $roles[DRUPAL_AUTHENTICATED_RID],
'#default_value' => TRUE,
'#disabled' => TRUE,
);
unset($roles[DRUPAL_AUTHENTICATED_RID]);
$form['account']['roles'] = array(
'#type' => 'checkboxes',
'#title' => t('Roles'),
'#default_value' => (!$register && isset($account->roles) ? array_keys($account->roles) : array()),
'#options' => $roles,
'#access' => $roles && user_access('administer permissions'),
DRUPAL_AUTHENTICATED_RID => $checkbox_authenticated,
);
$form['account']['notify'] = array(
'#type' => 'checkbox',
'#title' => t('Notify user of new account'),
'#access' => $register && $admin,
);
$form['signature_settings'] = array(
'#type' => 'fieldset',
'#title' => t('Signature settings'),
'#weight' => 1,
'#access' => (!$register && variable_get('user_signatures', 0)),
);
$form['signature_settings']['signature'] = array(
'#type' => 'textarea',
'#title' => t('Signature'),
'#default_value' => isset($account->signature) ? $account->signature : '',
'#description' => t('Your signature will be publicly displayed at the end of your comments.'),
);
$form['picture'] = array(
'#type' => 'fieldset',
'#title' => t('Picture'),
'#weight' => 1,
'#access' => (!$register && variable_get('user_pictures', 0)),
);
$form['picture']['picture'] = array(
'#type' => 'value',
'#value' => isset($account->picture) ? $account->picture : NULL,
);
$form['picture']['picture_current'] = array(
'#markup' => theme('user_picture', array('account' => $account)),
);
$form['picture']['picture_delete'] = array(
'#type' => 'checkbox',
'#title' => t('Delete picture'),
'#access' => !empty($account->picture->fid),
'#description' => t('Check this box to delete your current picture.'),
);
$form['picture']['picture_upload'] = array(
'#type' => 'file',
'#title' => t('Upload picture'),
'#size' => 48,
'#description' => t('Your virtual face or picture. Maximum dimensions are %dimensions pixels and the maximum size is %size kB.', array('%dimensions' => variable_get('user_picture_dimensions', '85x85'), '%size' => variable_get('user_picture_file_size', '30'))) . ' ' . variable_get('user_picture_guidelines', ''),
);
$form['#validate'][] = 'user_validate_picture';
}
function user_account_form_validate($form, &$form_state) {
if ($form['#user_category'] == 'account' || $form['#user_category'] == 'register') {
$account = $form['#user'];
if (isset($form_state['values']['name'])) {
if ($error = user_validate_name($form_state['values']['name'])) {
form_set_error('name', $error);
}
elseif ((bool) db_query_range("SELECT 1 FROM {users} WHERE uid <> :uid AND LOWER(name) = LOWER(:name)", 0, 1, array(':uid' => $account->uid, ':name' => $form_state['values']['name']))->fetchField()) {
form_set_error('name', t('The name %name is already taken.', array('%name' => $form_state['values']['name'])));
}
}
if ($error = user_validate_mail($form_state['values']['mail'])) {
form_set_error('mail', $error);
}
elseif ((bool) db_query_range("SELECT 1 FROM {users} WHERE uid <> :uid AND LOWER(mail) = LOWER(:mail)", 0, 1, array(':uid' => $account->uid, ':mail' => $form_state['values']['mail']))->fetchField()) {
if ($GLOBALS['user']->uid) {
form_set_error('mail', t('The e-mail address %email is already taken.', array('%email' => $form_state['values']['mail'])));
}
else {
form_set_error('mail', t('The e-mail address %email is already registered. <a href="@password">Have you forgotten your password?</a>', array('%email' => $form_state['values']['mail'], '@password' => url('user/password'))));
}
}
if (isset($form_state['values']['signature'])) {
$user_schema = drupal_get_schema('users');
if (drupal_strlen($form_state['values']['signature']) > $user_schema['fields']['signature']['length']) {
form_set_error('signature', t('The signature is too long: it must be %max characters or less.', array('%max' => $user_schema['fields']['signature']['length'])));
}
}
}
}
function user_user_presave(&$edit, $account, $category) {
if ($category == 'account' || $category == 'register') {
if (!empty($edit['picture_upload'])) {
$edit['picture'] = $edit['picture_upload'];
}
elseif (!empty($edit['picture_delete'])) {
$edit['picture'] = NULL;
}
$edit['picture_upload'] = NULL;
$edit['picture_delete'] = NULL;
if (isset($edit['roles'])) {
$edit['roles'] = array_filter($edit['roles']);
}
}
}
function user_user_categories() {
return array(array(
'name' => 'account',
'title' => t('Account settings'),
'weight' => 1,
));
}
function user_login_block($form) {
$form['#action'] = url($_GET['q'], array('query' => drupal_get_destination()));
$form['#id'] = 'user-login-form';
$form['#validate'] = user_login_default_validators();
$form['#submit'][] = 'user_login_submit';
$form['name'] = array('#type' => 'textfield',
'#title' => t('Username'),
'#maxlength' => USERNAME_MAX_LENGTH,
'#size' => 15,
'#required' => TRUE,
);
$form['pass'] = array('#type' => 'password',
'#title' => t('Password'),
'#maxlength' => 60,
'#size' => 15,
'#required' => TRUE,
);
$form['submit'] = array('#type' => 'submit',
'#value' => t('Log in'),
);
$items = array();
if (variable_get('user_register', 1)) {
$items[] = l(t('Create new account'), 'user/register', array('attributes' => array('title' => t('Create a new user account.'))));
}
$items[] = l(t('Request new password'), 'user/password', array('attributes' => array('title' => t('Request new password via e-mail.'))));
$form['links'] = array('#markup' => theme('item_list', array('items' => $items)));
return $form;
}
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['online']['info'] = t('Who\'s online');
$blocks['online']['cache'] = DRUPAL_NO_CACHE;
return $blocks;
}
function user_block_configure($delta = '') {
global $user;
switch ($delta) {
case 'new':
$form['user_block_whois_new_count'] = array(
'#type' => 'select',
'#title' => t('Number of users to display'),
'#default_value' => variable_get('user_block_whois_new_count', 5),
'#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' => variable_get('user_block_seconds_online', 900), '#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' => variable_get('user_block_max_list_count', 10), '#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;
switch ($delta) {
case 'new':
variable_set('user_block_whois_new_count', $edit['user_block_whois_new_count']);
break;
case 'online':
variable_set('user_block_seconds_online', $edit['user_block_seconds_online']);
variable_set('user_block_max_list_count', $edit['user_block_max_list_count']);
break;
}
}
function user_block_view($delta = '') {
global $user;
$block = array();
switch ($delta) {
case 'login':
if (!$user->uid && !(arg(0) == 'user' && !is_numeric(arg(1)))) {
$block['subject'] = t('User login');
$block['content'] = drupal_get_form('user_login_block');
}
return $block;
case 'new':
if (user_access('access content')) {
$items = db_query_range('SELECT uid, name FROM {users} WHERE status <> 0 AND access <> 0 ORDER BY created DESC', 0, variable_get('user_block_whois_new_count', 5))->fetchAll();
$output = theme('user_list', array('users' => $items));
$block['subject'] = t('Who\'s new');
$block['content'] = $output;
}
return $block;
case 'online':
if (user_access('access content')) {
$interval = REQUEST_TIME - variable_get('user_block_seconds_online', 900);
$authenticated_count = db_query("SELECT COUNT(DISTINCT s.uid) FROM {sessions} s WHERE s.timestamp >= :timestamp AND s.uid > 0", array(':timestamp' => $interval))->fetchField();
$output = format_plural($authenticated_count, 'There is currently 1 user online.', 'There are currently @count users online.');
$max_users = variable_get('user_block_max_list_count', 10);
if ($authenticated_count && $max_users) {
$items = db_query_range('SELECT u.uid, u.name, MAX(s.timestamp) AS max_timestamp FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.timestamp >= :interval AND s.uid > 0 GROUP BY u.uid, u.name ORDER BY max_timestamp DESC', 0, $max_users, array(':interval' => $interval))->fetchAll();
$output .= theme('user_list', array('users' => $items));
}
$block['subject'] = t('Who\'s online');
$block['content'] = $output;
}
return $block;
}
}
function template_preprocess_user_picture(&$variables) {
$variables['user_picture'] = '';
if (variable_get('user_pictures', 0)) {
$account = $variables['account'];
if (!empty($account->picture)) {
if (is_numeric($account->picture)) {
$account->picture = file_load($account->picture);
}
if (!empty($account->picture->uri)) {
$filepath = $account->picture->uri;
}
}
elseif (variable_get('user_picture_default', '')) {
$filepath = variable_get('user_picture_default', '');
}
if (isset($filepath)) {
$alt = t("@user's picture", array('@user' => format_username($account)));
if (module_exists('image') && $style = variable_get('user_picture_style', '')) {
$variables['user_picture'] = theme('image_style', array('style_name' => $style, 'path' => $filepath, 'alt' => $alt, 'title' => $alt, 'attributes' => array(), 'getsize' => FALSE));
}
else {
$variables['user_picture'] = theme('image', array('path' => $filepath, 'alt' => $alt, 'title' => $alt, 'attributes' => array(), 'getsize' => FALSE));
}
if (!empty($account->uid) && user_access('access user profiles')) {
$attributes = array('attributes' => array('title' => t('View user profile.')), 'html' => TRUE);
$variables['user_picture'] = l($variables['user_picture'], "user/$account->uid", $attributes);
}
}
}
}
function theme_user_list($variables) {
$users = $variables['users'];
$title = $variables['title'];
if (!empty($users)) {
foreach ($users as $user) {
$items[] = theme('username', array('account' => $user));
}
}
return theme('item_list', array('items' => $items, 'title' => $title));
}
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() && variable_get('user_register', 1);
}
function user_view_access($account) {
return $account && $account->uid &&
(
($GLOBALS['user']->uid == $account->uid) ||
user_access('administer users') ||
($account->access && $account->status && user_access('access user profiles'))
);
}
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_load_self($arg) {
$arg[1] = user_load($GLOBALS['user']->uid);
return $arg;
}
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',
'page callback' => 'user_page',
'access callback' => TRUE,
'type' => MENU_CALLBACK,
'file' => 'user.pages.inc',
);
$items['user/login'] = array(
'title' => 'Log in',
'access callback' => 'user_is_anonymous',
'type' => MENU_DEFAULT_LOCAL_TASK,
);
$items['user/register'] = array(
'title' => 'Create new account',
'page callback' => 'drupal_get_form',
'page arguments' => array('user_register_form'),
'access callback' => 'user_register_access',
'type' => MENU_LOCAL_TASK,
);
$items['user/password'] = array(
'title' => 'Request new password',
'page callback' => 'drupal_get_form',
'page arguments' => array('user_pass'),
'access callback' => 'user_is_anonymous',
'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' => 'user-menu',
'file' => 'user.pages.inc',
);
$items['admin/people'] = array(
'title' => 'People',
'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/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 and permissions',
'description' => 'Configure user accounts, roles and permissions.',
'position' => 'right',
'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 user pictures.',
'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['admin/config/people/roles'] = array(
'title' => 'Roles',
'description' => 'List, edit, or add user roles.',
'page callback' => 'drupal_get_form',
'page arguments' => array('user_admin_new_role'),
'access arguments' => array('administer permissions'),
'file' => 'user.admin.inc',
'weight' => -9,
);
$items['admin/config/people/roles/edit'] = array(
'title' => 'Edit role',
'page arguments' => array('user_admin_role'),
'access arguments' => array('administer permissions'),
'type' => MENU_CALLBACK,
);
$items['admin/config/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',
'weight' => -8,
);
$items['user/%user_uid_optional'] = array(
'title' => 'My account',
'title callback' => 'user_page_title',
'title arguments' => array(1),
'page callback' => 'user_build',
'page arguments' => array(1),
'access callback' => 'user_view_access',
'access arguments' => array(1),
'weight' => -10,
'menu_name' => 'user-menu',
'file' => 'user.pages.inc',
);
$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),
'type' => MENU_CALLBACK,
'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),
'type' => MENU_CALLBACK,
'file' => 'user.pages.inc',
);
$items['user/%user/edit'] = array(
'title' => 'Edit',
'title callback' => 'user_page_title',
'title arguments' => array(1),
'page callback' => 'drupal_get_form',
'page arguments' => array('user_profile_form', 1),
'access callback' => 'user_edit_access',
'access arguments' => array(1),
'type' => MENU_LOCAL_TASK,
'file' => 'user.pages.inc',
);
$items['user/%user_category/edit/account'] = array(
'title' => 'Account',
'type' => MENU_DEFAULT_LOCAL_TASK,
'load arguments' => array('%map', '%index'),
);
if (($categories = _user_categories()) && (count($categories) > 1)) {
foreach ($categories as $key => $category) {
if ($category['name'] != 'account') {
$items['user/%user_category/edit/' . $category['name']] = array(
'title callback' => 'check_plain',
'title arguments' => array($category['title']),
'page callback' => 'drupal_get_form',
'page arguments' => array('user_profile_form', 1, 3),
'access callback' => isset($category['access callback']) ? $category['access callback'] : 'user_edit_access',
'access arguments' => isset($category['access arguments']) ? $category['access arguments'] : array(1),
'type' => MENU_LOCAL_TASK,
'weight' => $category['weight'],
'load arguments' => array('%map', '%index'),
'tab_parent' => 'user/%/edit',
'file' => 'user.pages.inc',
);
}
}
}
return $items;
}
function user_init() {
drupal_add_css(drupal_get_path('module', 'user') . '/user.css');
}
function user_uid_optional_load($uid = NULL) {
if (!isset($uid)) {
$uid = $GLOBALS['user']->uid;
}
return user_load($uid);
}
function user_category_load($uid, &$map, $index) {
static $user_categories, $accounts;
if (!isset($accounts[$uid])) {
$accounts[$uid] = user_load($uid);
}
$valid = TRUE;
if ($account = $accounts[$uid]) {
$category_index = $index + 2;
$category_path = implode('/', array_slice($map, $category_index));
if ($category_path) {
$valid = FALSE;
if (!isset($user_categories)) {
$user_categories = _user_categories();
}
foreach ($user_categories as $category) {
if ($category['name'] == $category_path) {
$valid = TRUE;
$map = array_slice($map, 0, $category_index);
$map[$category_index] = $category_path;
break;
}
}
}
}
return $valid ? $account : FALSE;
}
function user_uid_optional_to_arg($arg) {
return empty($arg) || $arg == '%' ? $GLOBALS['user']->uid : $arg;
}
function user_page_title($account) {
return format_username($account);
}
function user_get_authmaps($authname = NULL) {
$authmaps = db_query("SELECT authname, module 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_state) {
global $user;
if ($user->uid) {
drupal_goto('user/' . $user->uid);
}
$form['name'] = array('#type' => 'textfield',
'#title' => t('Username'),
'#size' => 60,
'#maxlength' => USERNAME_MAX_LENGTH,
'#required' => TRUE,
);
$form['name']['#description'] = t('Enter your @s username.', array('@s' => variable_get('site_name', 'Drupal')));
$form['pass'] = array('#type' => 'password',
'#title' => t('Password'),
'#description' => t('Enter the password that accompanies your username.'),
'#required' => TRUE,
);
$form['#validate'] = user_login_default_validators();
$form['submit'] = array('#type' => 'submit', '#value' => t('Log in'), '#weight' => 2);
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']);
if (!empty($form_state['values']['name']) && !empty($password)) {
if (!flood_is_allowed('failed_login_attempt_ip', variable_get('user_failed_login_ip_limit', 50), variable_get('user_failed_login_ip_window', 3600))) {
$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 (variable_get('user_failed_login_identifier_uid_only', FALSE)) {
$identifier = $account->uid;
}
else {
$identifier = $account->uid . '-' . ip_address();
}
$form_state['flood_control_user_identifier'] = $identifier;
if (!flood_is_allowed('failed_login_attempt_user', variable_get('user_failed_login_user_limit', 5), variable_get('user_failed_login_user_window', 21600), $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) {
if (empty($form_state['uid'])) {
flood_register_event('failed_login_attempt_ip', variable_get('user_failed_login_ip_window', 3600));
if (isset($form_state['flood_control_user_identifier'])) {
flood_register_event('failed_login_attempt_user', variable_get('user_failed_login_user_window', 21600), $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(variable_get('user_failed_login_user_limit', 5), 'Sorry, there has been more than one failed login attempt for this account. It is temporarily blocked. Please 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. Please 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. Please 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'])) {
flood_clear_event('failed_login_attempt_user', $form_state['flood_control_user_identifier']);
}
}
function user_authenticate($name, $password) {
$uid = FALSE;
if (!empty($name) && !empty($password)) {
$account = db_query("SELECT * FROM {users} WHERE name = :name AND status = 1", array(':name' => $name))->fetchObject();
if ($account) {
require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
if (user_check_password($password, $account)) {
$uid = $account->uid;
if (user_needs_new_hash($account)) {
$new_hash = user_hash_password($password);
if ($new_hash) {
db_update('users')
->fields(array('pass' => $new_hash))
->condition('uid', $account->uid)
->execute();
}
}
}
}
}
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();
user_module_invoke('login', $edit, $user);
}
function user_login_submit($form, &$form_state) {
global $user;
$user = user_load($form_state['uid']);
user_login_finalize();
$form_state['redirect'] = 'user/' . $user->uid;
}
function user_external_login_register($name, $module) {
$account = user_load_by_name($name);
if (!$account->uid) {
$userinfo = array(
'name' => $name,
'pass' => user_password(),
'init' => $name,
'status' => 1,
'access' => REQUEST_TIME
);
$account = user_save(drupal_anonymous_user(), $userinfo);
if (!$account) {
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_submit(array(), $form_state);
}
function user_pass_reset_url($account) {
$timestamp = REQUEST_TIME;
return url("user/reset/$account->uid/$timestamp/" . user_pass_rehash($account->pass, $timestamp, $account->login), array('absolute' => TRUE));
}
function user_cancel_url($account) {
$timestamp = REQUEST_TIME;
return url("user/$account->uid/cancel/confirm/$timestamp/" . user_pass_rehash($account->pass, $timestamp, $account->login), array('absolute' => TRUE));
}
function user_pass_rehash($password, $timestamp, $login) {
return md5($timestamp . $password . $login);
}
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);
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);
}
db_update('users')
->fields(array('status' => 0))
->condition('uid', $account->uid)
->execute();
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);
}
db_delete('users')
->condition('uid', $account->uid)
->execute();
db_delete('users_roles')
->condition('uid', $account->uid)
->execute();
db_delete('authmap')
->condition('uid', $account->uid)
->execute();
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();
}
else {
drupal_session_destroy_uid($account->uid);
}
cache_clear_all();
}
function user_build($account, $build_mode = 'full') {
user_build_content($account, $build_mode);
$build = $account->content;
unset($account->content);
$build += array(
'#theme' => 'user_profile',
'#account' => $account,
'#build_mode' => $build_mode,
);
drupal_alter('user_build', $build);
return $build;
}
function user_build_content($account, $build_mode = 'full') {
$account->content = array();
field_attach_prepare_view('user', array($account->uid => $account), $build_mode);
$account->content += field_attach_view('user', $account, $build_mode);
module_invoke_all('user_view', $account, $build_mode);
}
function user_mail($key, &$message, $params) {
$language = $message['language'];
$variables = array('user' => $params['account']);
$message['subject'] .= _user_mail_text($key . '_subject', $language, $variables);
$message['body'][] = _user_mail_text($key . '_body', $language, $variables);
}
function _user_mail_text($key, $language = NULL, $variables = array()) {
$langcode = isset($language) ? $language->language : NULL;
if ($admin_setting = variable_get('user_mail_' . $key, FALSE)) {
$text = $admin_setting;
}
else {
switch ($key) {
case 'register_no_approval_required_subject':
$text = t('Account details for [user:name] at [site:name]', array(), array('langcode' => $langcode));
break;
case 'register_no_approval_required_body':
$text = t("[user:name],
Thank you for registering at [site:name]. You may now log in to [site:login-url] using the following username and password:
username: [user:name]
password: [user:password]
You may also log in by clicking on this link or copying and pasting it in your browser:
[user:one-time-login-url]
This is a one-time login, so it can be used only once.
After logging in, you will be redirected to [user:edit-url] so you can change your password.
-- [site:name] team", array(), array('langcode' => $langcode));
break;
case 'register_admin_created_subject':
$text = t('An administrator created an account for you at [site:name]', array(), array('langcode' => $langcode));
break;
case 'register_admin_created_body':
$text = t("[user:name],
A site administrator at [site:name] has created an account for you. You may now log in to [site:login-url] using the following username and password:
username: [user:name]
password: [user:password]
You may also log in by clicking on this link or copying and pasting it in your browser:
[user:one-time-login-url]
This is a one-time login, so it can be used only once.
After logging in, you will be redirected to [user:edit-url] so you can change your password.
-- [site:name] team", array(), array('langcode' => $langcode));
break;
case 'register_pending_approval_subject':
case 'register_pending_approval_admin_subject':
$text = t('Account details for [user:name] at [site:name] (pending admin approval)', array(), array('langcode' => $langcode));
break;
case 'register_pending_approval_body':
$text = t("[user:name],
Thank you for registering at [site:name]. Your application for an account is currently pending approval. Once it has been approved, you will receive another e-mail containing information about how to log in, set your password, and other details.
-- [site:name] team", array(), array('langcode' => $langcode));
break;
case 'register_pending_approval_admin_body':
$text = t("[user:name] has applied for an account.
[user:edit-url]", array(), array('langcode' => $langcode));
break;
case 'password_reset_subject':
$text = t('Replacement login information for [user:name] at [site:name]', array(), array('langcode' => $langcode));
break;
case 'password_reset_body':
$text = t("[user:name],
A request to reset the password for your account has been made at [site:name].
You may now log in to [site:uri-brief] by clicking on this link or copying and pasting it in your browser:
[user:one-time-login-url]
This is a one-time login, so it can be used only once. It expires after one day and nothing will happen if it's not used.
After logging in, you will be redirected to [user:edit-url] so you can change your password.", array(), array('langcode' => $langcode));
break;
case 'status_activated_subject':
$text = t('Account details for [user:name] at [site:name] (approved)', array(), array('langcode' => $langcode));
break;
case 'status_activated_body':
$text = t("[user:name],
Your account at [site:name] has been activated.
You may now log in by clicking on this link or copying and pasting it in your browser:
[site:login-url]
This is a one-time login, so it can be used only once.
After logging in, you will be redirected to [user:edit-url] so you can change your password.
Once you have set your own password, you will be able to log in to [site:login-url] in the future using:
username: [user:name]", array(), array('langcode' => $langcode));
break;
case 'status_blocked_subject':
$text = t('Account details for [user:name] at [site:name] (blocked)', array(), array('langcode' => $langcode));
break;
case 'status_blocked_body':
$text = t("[user:name],\n\nYour account on [site:name] has been blocked.", array(), array('langcode' => $langcode));
break;
case 'cancel_confirm_subject':
$text = t('Account cancellation request for [user:name] at [site:name]', array(), array('langcode' => $langcode));
break;
case 'cancel_confirm_body':
$text = t("[user:name],
A request to cancel your account has been made at [site:name].
You may now cancel your account on [site:url-brief] by clicking this link or copying and pasting it into your browser:
[user:cancel-url]
NOTE: The cancellation of your account is not reversible.
This link expires in one day and nothing will happen if it is not used.", array(), array('langcode' => $langcode));
break;
case 'status_canceled_subject':
$text = t('Account details for [user:name] at [site:name] (canceled)', array(), array('langcode' => $langcode));
break;
case 'status_canceled_body':
$text = t("[user:name],
Your account on [site:name] has been canceled.", array(), array('langcode' => $langcode));
break;
}
}
return token_replace($text, $variables, array('language' => $language, 'callback' => 'user_mail_tokens'));
}
function user_mail_tokens(&$replacements, $data, $options) {
if (isset($data['user'])) {
$replacements['[user:one-time-login-url]'] = user_pass_reset_url($data['user']);
$replacements['[user:cancel-url]'] = user_cancel_url($data['user']);
if (isset($data['user']->password) && !empty($data['user']->password)) {
$replacements['[user:password]'] = $data['user']->password;
}
}
}
function user_roles($membersonly = FALSE, $permission = NULL) {
$roles = array(
DRUPAL_ANONYMOUS_RID => NULL,
DRUPAL_AUTHENTICATED_RID => NULL,
);
if (!empty($permission)) {
$result = db_query("SELECT r.* FROM {role} r INNER JOIN {role_permission} p ON r.rid = p.rid WHERE p.permission = :permission ORDER BY r.name", array(':permission' => $permission));
}
else {
$result = db_query('SELECT * FROM {role} ORDER BY name');
}
foreach ($result as $role) {
switch ($role->rid) {
case DRUPAL_ANONYMOUS_RID:
if (!$membersonly) {
$roles[$role->rid] = t($role->name);
}
break;
case DRUPAL_AUTHENTICATED_RID:
$roles[$role->rid] = t($role->name);
break;
default:
$roles[$role->rid] = $role->name;
}
}
return array_filter($roles);
}
function user_role_load($role) {
$field = is_int($role) ? 'rid' : 'name';
return db_select('role', 'r')
->fields('r')
->condition($field, $role)
->execute()
->fetchObject();
}
function user_role_save($role) {
if ($role->name) {
$role->name = trim($role->name);
}
if (!empty($role->rid) && $role->name) {
$status = drupal_write_record('role', $role, 'rid');
module_invoke_all('user_role_update', $role);
}
else {
$status = drupal_write_record('role', $role);
module_invoke_all('user_role_insert', $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_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()) {
foreach ($permissions as $name) {
db_merge('role_permission')
->key(array(
'rid' => $rid,
'permission' => $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) {
user_save($account, array('status' => 1));
}
}
}
function user_user_operations_block($accounts) {
$accounts = user_load_multiple($accounts);
foreach ($accounts as $account) {
if ($account !== FALSE && $account->status == 1) {
user_save($account, array('status' => 0));
}
}
}
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);
user_save($account, array('roles' => $roles));
}
}
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));
user_save($account, array('roles' => $roles));
}
}
break;
}
}
function user_multiple_cancel_confirm($form, &$form_state) {
$edit = $form_state['input'];
$form['accounts'] = array('#prefix' => '<ul>', '#suffix' => '</ul>', '#tree' => TRUE);
foreach (array_filter($edit['accounts']) as $uid => $value) {
$user = db_query('SELECT name FROM {users} WHERE uid = :uid', array(':uid' => $uid))->fetchField();
$form['accounts'][$uid] = array('#type' => 'hidden', '#value' => $uid, '#prefix' => '<li>', '#suffix' => check_plain($user) . "</li>\n");
}
$form['operation'] = array('#type' => 'hidden', '#value' => 'cancel');
module_load_include('inc', 'user', 'user.pages');
$form['user_cancel_method'] = array(
'#type' => 'item',
'#title' => t('When cancelling these accounts'),
);
$form['user_cancel_method'] += user_cancel_methods();
foreach (element_children($form['user_cancel_method']) as $element) {
unset($form['user_cancel_method'][$element]['#description']);
}
$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' => variable_get('user_mail_status_canceled_notify', FALSE),
'#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 == $user->uid) {
$admin_form_state = $form_state;
unset($admin_form_state['values']['user_cancel_confirm']);
$admin_form_state['values']['_account'] = $user;
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';
return;
}
function _user_categories() {
$categories = module_invoke_all('user_categories');
usort($categories, '_user_sort');
return $categories;
}
function _user_sort($a, $b) {
$a = (array)$a + array('weight' => 0, 'title' => '');
$b = (array)$b + array('weight' => 0, 'title' => '');
return $a['weight'] < $b['weight'] ? -1 : ($a['weight'] > $b['weight'] ? 1 : ($a['title'] < $b['title'] ? -1 : 1));
}
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(SelectQuery $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 = new stdClass();
$account->uid = 'user_filter';
$account->roles = array(DRUPAL_AUTHENTICATED_RID => 1);
if (user_access($value, $account)) {
continue;
}
$query->leftJoin('role_permission', 'p', 'ur.rid = p.rid');
$query->condition(db_or()->condition('u.uid', 1)->condition('p.permission', $value));
}
else {
$query->condition($filters[$key]['field'], $value);
}
}
}
function user_forms() {
$forms['user_admin_access_add_form']['callback'] = 'user_admin_access_form';
$forms['user_admin_access_edit_form']['callback'] = 'user_admin_access_form';
$forms['user_admin_new_role']['callback'] = 'user_admin_role';
return $forms;
}
function user_comment_view($comment) {
if (variable_get('user_signatures', 0) && !empty($comment->signature)) {
$comment->signature = check_markup($comment->signature, $comment->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_language($account, $default = NULL) {
$language_list = language_list();
if ($account->language && isset($language_list[$account->language])) {
return $language_list[$account->language];
}
else {
return $default ? $default : language_default();
}
}
function _user_mail_notify($op, $account, $language = NULL) {
$default_notify = ($op != 'status_canceled' && $op != 'status_blocked');
$notify = variable_get('user_mail_' . $op . '_notify', $default_notify);
if ($notify) {
$params['account'] = $account;
$language = $language ? $language : user_preferred_language($account);
$mail = drupal_mail('user', $op, $account->mail, $language, $params);
if ($op == 'register_pending_approval') {
drupal_mail('user', 'register_pending_approval_admin', variable_get('site_mail', ini_get('sendmail_from')), language_default(), $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']['js'][] = drupal_get_path('module', 'user') . '/user.js';
$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_fields = db_query("SELECT uid, name, picture, data FROM {users} WHERE uid IN (:uids)", array(':uids' => $uids))->fetchAllAssoc('uid');
foreach ($uids as $nid => $uid) {
$nodes[$nid]->name = $user_fields[$uid]->name;
$nodes[$nid]->picture = $user_fields[$uid]->picture;
$nodes[$nid]->data = $user_fields[$uid]->data;
}
}
function user_image_style_delete($style) {
user_image_style_save($style);
}
function user_image_style_save($style) {
if (isset($style['old_name']) && $style['old_name'] == variable_get('user_picture_style', '')) {
variable_set('user_picture_style', $style['name']);
}
}
function user_action_info() {
return array(
'user_block_user_action' => array(
'label' => t('Block current user'),
'type' => 'user',
'configurable' => FALSE,
'triggers' => array(),
),
);
}
function user_block_user_action(&$object, $context = array()) {
if (isset($object->uid)) {
$uid = $object->uid;
}
elseif (isset($context['uid'])) {
$uid = $context['uid'];
}
else {
global $user;
$uid = $user->uid;
}
db_update('users')
->fields(array('status' => 0))
->condition('uid', $uid)
->execute();
drupal_session_destroy_uid($uid);
watchdog('action', 'Blocked user %name.', array('%name' => $user->name));
}
function user_register_form($form, &$form_state) {
global $user;
$admin = user_access('administer users');
if (!$admin && $user->uid) {
drupal_goto('user/' . $user->uid);
}
$form['#user'] = drupal_anonymous_user();
$form['#user_category'] = 'register';
$form['#attached']['library'][] = array('system', 'cookie');
$form['#attributes']['class'][] = 'user-info-from-cookie';
user_account_form($form, $form_state);
if ($admin) {
$form_state['redirect'] = $_GET['q'];
}
if (count(element_children($form)) == 1) {
$form['account']['#type'] = 'markup';
}
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Create new account'),
'#weight' => 30,
);
$form['#submit'][] = 'user_register_submit';
return $form;
}
function user_register_submit($form, &$form_state) {
$admin = user_access('administer users');
if (!variable_get('user_email_verification', TRUE) || $admin) {
$pass = $form_state['values']['pass'];
}
else {
$pass = user_password();
}
$notify = !empty($form_state['values']['notify']);
form_state_values_clean($form_state);
unset($form_state['values']['notify']);
$form_state['values']['pass'] = $pass;
$form_state['values']['init'] = $form_state['values']['mail'];
$account = $form['#user'];
$account = user_save($account, $form_state['values']);
if (!$account) {
drupal_set_message(t("Error saving user account."), 'error');
$form_state['redirect'] = '';
return;
}
$form_state['user'] = $account;
$form_state['values']['uid'] = $account->uid;
watchdog('user', 'New user: %name (%email).', array('%name' => $form_state['values']['name'], '%email' => $form_state['values']['mail']), WATCHDOG_NOTICE, l(t('edit'), 'user/' . $account->uid . '/edit'));
$account->password = $pass;
if ($admin && !$notify) {
drupal_set_message(t('Created a new user account for <a href="@url">%name</a>. No e-mail has been sent.', array('@url' => url("user/$account->uid"), '%name' => $account->name)));
}
elseif (!$admin && !variable_get('user_email_verification', TRUE) && $account->status) {
_user_mail_notify('register_no_approval_required', $account);
$form_state['uid'] = $account->uid;
user_login_submit(array(), $form_state);
drupal_set_message(t('Registration successful. You are now logged in.'));
$form_state['redirect'] = '';
}
elseif ($account->status || $notify) {
$op = $notify ? 'register_admin_created' : 'register_no_approval_required';
_user_mail_notify($op, $account);
if ($notify) {
drupal_set_message(t('Password and further instructions have been e-mailed to the new user <a href="@url">%name</a>.', array('@url' => url("user/$account->uid"), '%name' => $account->name)));
}
else {
drupal_set_message(t('Your password and further instructions have been sent to your e-mail address.'));
$form_state['redirect'] = '';
}
}
else {
_user_mail_notify('register_pending_approval', $account);
drupal_set_message(t('Thank you for applying for an account. Your account is currently pending approval by the site administrator.<br />In the meantime, a welcome message with further instructions has been sent to your e-mail address.'));
$form_state['redirect'] = '';
}
}
function user_modules_installed($modules) {
$rid = variable_get('user_admin_role', 0);
if ($rid) {
foreach ($modules as $module) {
if ($permissions = module_invoke($module, 'permission')) {
foreach (array_keys($permissions) as $permission) {
db_insert('role_permission')
->fields(array(
'rid' => $rid,
'permission' => $permission,
))->execute();
}
}
}
}
}
function user_modules_uninstalled($modules) {
$permissions = array();
foreach ($modules as $module) {
if (function_exists($module . '_permission')) {
$permissions = array_merge($permissions, array_keys(module_invoke($module, 'permission')));
}
}
if (!empty($permissions)) {
db_delete('role_permission')
->condition('permission', $permissions, 'IN')
->execute();
}
}
function user_login_destination() {
$destination = drupal_get_destination();
if ($destination['destination'] == 'user/login') {
$destination['destination'] = 'user';
}
return $destination;
}
function user_cookie_save(array $values, array $fields = array('name', 'mail', 'homepage')) {
foreach ($fields as $field) {
if (isset($values[$field])) {
setrawcookie('Drupal.visitor.' . $field, rawurlencode($values[$field]), REQUEST_TIME + 31536000, '/');
}
}
}
function user_rdf_mapping() {
return array(
array(
'type' => 'user',
'bundle' => RDF_DEFAULT_BUNDLE,
'mapping' => array(
'rdftype' => array('sioc:User'),
'name' => array(
'predicates' => array('foaf:name'),
),
'homepage' => array(
'predicates' => array('foaf:page'),
'type' => 'rel',
),
),
),
);
}