t('Stores distributed authentication mapping.'), 'fields' => array( 'aid' => array( 'description' => t('Primary Key: Unique authmap ID.'), 'type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE, ), 'uid' => array( 'type' => 'int', 'not null' => TRUE, 'default' => 0, 'description' => t("User's {users}.uid."), ), 'authname' => array( 'type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => '', 'description' => t('Unique authentication name.'), ), 'module' => array( 'type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => '', 'description' => t('Module which is controlling the authentication.'), ), ), 'unique keys' => array( 'authname' => array('authname'), ), 'primary key' => array('aid'), ); $schema['role_permission'] = array( 'description' => t('Stores the permissions assigned to user roles.'), 'fields' => array( 'rid' => array( 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'description' => t('Foreign Key: {role}.rid.'), ), 'permission' => array( 'type' => 'varchar', 'length' => 64, 'not null' => TRUE, 'default' => '', 'description' => t('A single permission granted to the role identified by rid.'), ), ), 'primary key' => array('rid', 'permission'), 'indexes' => array( 'permission' => array('permission'), ), ); $schema['role'] = array( 'description' => t('Stores user roles.'), 'fields' => array( 'rid' => array( 'type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE, 'description' => t('Primary Key: Unique role ID.'), ), 'name' => array( 'type' => 'varchar', 'length' => 64, 'not null' => TRUE, 'default' => '', 'description' => t('Unique role name.'), ), ), 'unique keys' => array( 'name' => array('name'), ), 'primary key' => array('rid'), ); $schema['users'] = array( 'description' => t('Stores user data.'), 'fields' => array( 'uid' => array( 'type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE, 'description' => t('Primary Key: Unique user ID.'), ), 'name' => array( 'type' => 'varchar', 'length' => 60, 'not null' => TRUE, 'default' => '', 'description' => t('Unique user name.'), ), 'pass' => array( 'type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => '', 'description' => t("User's password (hashed)."), ), 'mail' => array( 'type' => 'varchar', 'length' => 64, 'not null' => FALSE, 'default' => '', 'description' => t("User's email address."), ), 'theme' => array( 'type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => '', 'description' => t("User's default theme."), ), 'signature' => array( 'type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => '', 'description' => t("User's signature."), ), 'created' => array( 'type' => 'int', 'not null' => TRUE, 'default' => 0, 'description' => t('Timestamp for when user was created.'), ), 'access' => array( 'type' => 'int', 'not null' => TRUE, 'default' => 0, 'description' => t('Timestamp for previous time user accessed the site.'), ), 'login' => array( 'type' => 'int', 'not null' => TRUE, 'default' => 0, 'description' => t("Timestamp for user's last login."), ), 'status' => array( 'type' => 'int', 'not null' => TRUE, 'default' => 0, 'size' => 'tiny', 'description' => t('Whether the user is active(1) or blocked(0).'), ), 'timezone' => array( 'type' => 'varchar', 'length' => 8, 'not null' => FALSE, 'description' => t("User's timezone."), ), 'language' => array( 'type' => 'varchar', 'length' => 12, 'not null' => TRUE, 'default' => '', 'description' => t("User's default language."), ), 'picture' => array( 'type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => '', 'description' => t("Path to the user's uploaded picture."), ), 'init' => array( 'type' => 'varchar', 'length' => 64, 'not null' => FALSE, 'default' => '', 'description' => t('Email address used for initial account creation.'), ), 'data' => array( 'type' => 'text', 'not null' => FALSE, 'size' => 'big', 'serialize' => TRUE, 'description' => t('A serialized array of name value pairs that are related to the user. Any form values posted during user edit are stored and are loaded into the $user object during user_load(). Use of this field is discouraged and it will likely disappear in a future version of Drupal.'), ), ), 'indexes' => array( 'access' => array('access'), 'created' => array('created'), 'mail' => array('mail'), ), 'unique keys' => array( 'name' => array('name'), ), 'primary key' => array('uid'), ); $schema['users_roles'] = array( 'description' => t('Maps users to roles.'), 'fields' => array( 'uid' => array( 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'description' => t('Primary Key: {users}.uid for user.'), ), 'rid' => array( 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'description' => t('Primary Key: {role}.rid for role.'), ), ), 'primary key' => array('uid', 'rid'), 'indexes' => array( 'rid' => array('rid'), ), ); return $schema; } /** * @defgroup user-updates-6.x-to-7.x User updates from 6.x to 7.x * @{ */ /** * Increase the length of the password field to accommodate better hashes. * * Also re-hashes all current passwords to improve security. This may be a * lengthy process, and is performed batch-wise. */ function user_update_7000(&$sandbox) { $ret = array('#finished' => 0); // Lower than DRUPAL_HASH_COUNT to make the update run at a reasonable speed. $hash_count_log2 = 11; // Multi-part update. if (!isset($sandbox['user_from'])) { db_change_field($ret, 'users', 'pass', 'pass', array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => '')); $sandbox['user_from'] = 0; $sandbox['user_count'] = db_result(db_query("SELECT COUNT(uid) FROM {users}")); } else { require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc'); // Hash again all current hashed passwords. $has_rows = FALSE; // Update this many per page load. $count = 1000; $result = db_query_range("SELECT uid, pass FROM {users} WHERE uid > 0 ORDER BY uid", $sandbox['user_from'], $count); while ($account = db_fetch_array($result)) { $has_rows = TRUE; $new_hash = user_hash_password($account['pass'], $hash_count_log2); if ($new_hash) { // Indicate an updated password. $new_hash = 'U' . $new_hash; db_query("UPDATE {users} SET pass = '%s' WHERE uid = %d", $new_hash, $account['uid']); } } $ret['#finished'] = $sandbox['user_from']/$sandbox['user_count']; $sandbox['user_from'] += $count; if (!$has_rows) { $ret['#finished'] = 1; $ret[] = array('success' => TRUE, 'query' => "UPDATE {users} SET pass = 'U' . user_hash_password(pass) WHERE uid > 0"); } } return $ret; } /** * Remove the 'threshold', 'mode' and 'sort' columns from the {user} table. * * These fields were previously used to store per-user comment settings. */ function user_update_7001() { $ret = array(); db_drop_field($ret, 'users', 'threshold'); db_drop_field($ret, 'users', 'mode'); db_drop_field($ret, 'users', 'sort'); return $ret; } /** * @} End of "defgroup user-updates-6.x-to-7.x" * The next series of updates should start at 8000. */