annotate modules/user/user.install @ 0:ff03f76ab3fe

initial version
author danieleb <danielebarchiesi@me.com>
date Wed, 21 Aug 2013 18:51:11 +0100
parents
children
rev   line source
danielebarchiesi@0 1 <?php
danielebarchiesi@0 2
danielebarchiesi@0 3 /**
danielebarchiesi@0 4 * @file
danielebarchiesi@0 5 * Install, update and uninstall functions for the user module.
danielebarchiesi@0 6 */
danielebarchiesi@0 7
danielebarchiesi@0 8 /**
danielebarchiesi@0 9 * Implements hook_schema().
danielebarchiesi@0 10 */
danielebarchiesi@0 11 function user_schema() {
danielebarchiesi@0 12 $schema['authmap'] = array(
danielebarchiesi@0 13 'description' => 'Stores distributed authentication mapping.',
danielebarchiesi@0 14 'fields' => array(
danielebarchiesi@0 15 'aid' => array(
danielebarchiesi@0 16 'description' => 'Primary Key: Unique authmap ID.',
danielebarchiesi@0 17 'type' => 'serial',
danielebarchiesi@0 18 'unsigned' => TRUE,
danielebarchiesi@0 19 'not null' => TRUE,
danielebarchiesi@0 20 ),
danielebarchiesi@0 21 'uid' => array(
danielebarchiesi@0 22 'type' => 'int',
danielebarchiesi@0 23 'not null' => TRUE,
danielebarchiesi@0 24 'default' => 0,
danielebarchiesi@0 25 'description' => "User's {users}.uid.",
danielebarchiesi@0 26 ),
danielebarchiesi@0 27 'authname' => array(
danielebarchiesi@0 28 'type' => 'varchar',
danielebarchiesi@0 29 'length' => 128,
danielebarchiesi@0 30 'not null' => TRUE,
danielebarchiesi@0 31 'default' => '',
danielebarchiesi@0 32 'description' => 'Unique authentication name.',
danielebarchiesi@0 33 ),
danielebarchiesi@0 34 'module' => array(
danielebarchiesi@0 35 'type' => 'varchar',
danielebarchiesi@0 36 'length' => 128,
danielebarchiesi@0 37 'not null' => TRUE,
danielebarchiesi@0 38 'default' => '',
danielebarchiesi@0 39 'description' => 'Module which is controlling the authentication.',
danielebarchiesi@0 40 ),
danielebarchiesi@0 41 ),
danielebarchiesi@0 42 'unique keys' => array(
danielebarchiesi@0 43 'authname' => array('authname'),
danielebarchiesi@0 44 ),
danielebarchiesi@0 45 'primary key' => array('aid'),
danielebarchiesi@0 46 'foreign keys' => array(
danielebarchiesi@0 47 'user' => array(
danielebarchiesi@0 48 'table' => 'users',
danielebarchiesi@0 49 'columns' => array('uid' => 'uid'),
danielebarchiesi@0 50 ),
danielebarchiesi@0 51 ),
danielebarchiesi@0 52 );
danielebarchiesi@0 53
danielebarchiesi@0 54 $schema['role_permission'] = array(
danielebarchiesi@0 55 'description' => 'Stores the permissions assigned to user roles.',
danielebarchiesi@0 56 'fields' => array(
danielebarchiesi@0 57 'rid' => array(
danielebarchiesi@0 58 'type' => 'int',
danielebarchiesi@0 59 'unsigned' => TRUE,
danielebarchiesi@0 60 'not null' => TRUE,
danielebarchiesi@0 61 'description' => 'Foreign Key: {role}.rid.',
danielebarchiesi@0 62 ),
danielebarchiesi@0 63 'permission' => array(
danielebarchiesi@0 64 'type' => 'varchar',
danielebarchiesi@0 65 'length' => 128,
danielebarchiesi@0 66 'not null' => TRUE,
danielebarchiesi@0 67 'default' => '',
danielebarchiesi@0 68 'description' => 'A single permission granted to the role identified by rid.',
danielebarchiesi@0 69 ),
danielebarchiesi@0 70 'module' => array(
danielebarchiesi@0 71 'type' => 'varchar',
danielebarchiesi@0 72 'length' => 255,
danielebarchiesi@0 73 'not null' => TRUE,
danielebarchiesi@0 74 'default' => '',
danielebarchiesi@0 75 'description' => "The module declaring the permission.",
danielebarchiesi@0 76 ),
danielebarchiesi@0 77 ),
danielebarchiesi@0 78 'primary key' => array('rid', 'permission'),
danielebarchiesi@0 79 'indexes' => array(
danielebarchiesi@0 80 'permission' => array('permission'),
danielebarchiesi@0 81 ),
danielebarchiesi@0 82 'foreign keys' => array(
danielebarchiesi@0 83 'role' => array(
danielebarchiesi@0 84 'table' => 'roles',
danielebarchiesi@0 85 'columns' => array('rid' => 'rid'),
danielebarchiesi@0 86 ),
danielebarchiesi@0 87 ),
danielebarchiesi@0 88 );
danielebarchiesi@0 89
danielebarchiesi@0 90 $schema['role'] = array(
danielebarchiesi@0 91 'description' => 'Stores user roles.',
danielebarchiesi@0 92 'fields' => array(
danielebarchiesi@0 93 'rid' => array(
danielebarchiesi@0 94 'type' => 'serial',
danielebarchiesi@0 95 'unsigned' => TRUE,
danielebarchiesi@0 96 'not null' => TRUE,
danielebarchiesi@0 97 'description' => 'Primary Key: Unique role ID.',
danielebarchiesi@0 98 ),
danielebarchiesi@0 99 'name' => array(
danielebarchiesi@0 100 'type' => 'varchar',
danielebarchiesi@0 101 'length' => 64,
danielebarchiesi@0 102 'not null' => TRUE,
danielebarchiesi@0 103 'default' => '',
danielebarchiesi@0 104 'description' => 'Unique role name.',
danielebarchiesi@0 105 'translatable' => TRUE,
danielebarchiesi@0 106 ),
danielebarchiesi@0 107 'weight' => array(
danielebarchiesi@0 108 'type' => 'int',
danielebarchiesi@0 109 'not null' => TRUE,
danielebarchiesi@0 110 'default' => 0,
danielebarchiesi@0 111 'description' => 'The weight of this role in listings and the user interface.',
danielebarchiesi@0 112 ),
danielebarchiesi@0 113 ),
danielebarchiesi@0 114 'unique keys' => array(
danielebarchiesi@0 115 'name' => array('name'),
danielebarchiesi@0 116 ),
danielebarchiesi@0 117 'primary key' => array('rid'),
danielebarchiesi@0 118 'indexes' => array(
danielebarchiesi@0 119 'name_weight' => array('name', 'weight'),
danielebarchiesi@0 120 ),
danielebarchiesi@0 121 );
danielebarchiesi@0 122
danielebarchiesi@0 123 // The table name here is plural, despite Drupal table naming standards,
danielebarchiesi@0 124 // because "user" is a reserved word in many databases.
danielebarchiesi@0 125 $schema['users'] = array(
danielebarchiesi@0 126 'description' => 'Stores user data.',
danielebarchiesi@0 127 'fields' => array(
danielebarchiesi@0 128 'uid' => array(
danielebarchiesi@0 129 'type' => 'int',
danielebarchiesi@0 130 'unsigned' => TRUE,
danielebarchiesi@0 131 'not null' => TRUE,
danielebarchiesi@0 132 'description' => 'Primary Key: Unique user ID.',
danielebarchiesi@0 133 'default' => 0,
danielebarchiesi@0 134 ),
danielebarchiesi@0 135 'name' => array(
danielebarchiesi@0 136 'type' => 'varchar',
danielebarchiesi@0 137 'length' => 60,
danielebarchiesi@0 138 'not null' => TRUE,
danielebarchiesi@0 139 'default' => '',
danielebarchiesi@0 140 'description' => 'Unique user name.',
danielebarchiesi@0 141 ),
danielebarchiesi@0 142 'pass' => array(
danielebarchiesi@0 143 'type' => 'varchar',
danielebarchiesi@0 144 'length' => 128,
danielebarchiesi@0 145 'not null' => TRUE,
danielebarchiesi@0 146 'default' => '',
danielebarchiesi@0 147 'description' => "User's password (hashed).",
danielebarchiesi@0 148 ),
danielebarchiesi@0 149 'mail' => array(
danielebarchiesi@0 150 'type' => 'varchar',
danielebarchiesi@0 151 'length' => 254,
danielebarchiesi@0 152 'not null' => FALSE,
danielebarchiesi@0 153 'default' => '',
danielebarchiesi@0 154 'description' => "User's e-mail address.",
danielebarchiesi@0 155 ),
danielebarchiesi@0 156 'theme' => array(
danielebarchiesi@0 157 'type' => 'varchar',
danielebarchiesi@0 158 'length' => 255,
danielebarchiesi@0 159 'not null' => TRUE,
danielebarchiesi@0 160 'default' => '',
danielebarchiesi@0 161 'description' => "User's default theme.",
danielebarchiesi@0 162 ),
danielebarchiesi@0 163 'signature' => array(
danielebarchiesi@0 164 'type' => 'varchar',
danielebarchiesi@0 165 'length' => 255,
danielebarchiesi@0 166 'not null' => TRUE,
danielebarchiesi@0 167 'default' => '',
danielebarchiesi@0 168 'description' => "User's signature.",
danielebarchiesi@0 169 ),
danielebarchiesi@0 170 'signature_format' => array(
danielebarchiesi@0 171 'type' => 'varchar',
danielebarchiesi@0 172 'length' => 255,
danielebarchiesi@0 173 'not null' => FALSE,
danielebarchiesi@0 174 'description' => 'The {filter_format}.format of the signature.',
danielebarchiesi@0 175 ),
danielebarchiesi@0 176 'created' => array(
danielebarchiesi@0 177 'type' => 'int',
danielebarchiesi@0 178 'not null' => TRUE,
danielebarchiesi@0 179 'default' => 0,
danielebarchiesi@0 180 'description' => 'Timestamp for when user was created.',
danielebarchiesi@0 181 ),
danielebarchiesi@0 182 'access' => array(
danielebarchiesi@0 183 'type' => 'int',
danielebarchiesi@0 184 'not null' => TRUE,
danielebarchiesi@0 185 'default' => 0,
danielebarchiesi@0 186 'description' => 'Timestamp for previous time user accessed the site.',
danielebarchiesi@0 187 ),
danielebarchiesi@0 188 'login' => array(
danielebarchiesi@0 189 'type' => 'int',
danielebarchiesi@0 190 'not null' => TRUE,
danielebarchiesi@0 191 'default' => 0,
danielebarchiesi@0 192 'description' => "Timestamp for user's last login.",
danielebarchiesi@0 193 ),
danielebarchiesi@0 194 'status' => array(
danielebarchiesi@0 195 'type' => 'int',
danielebarchiesi@0 196 'not null' => TRUE,
danielebarchiesi@0 197 'default' => 0,
danielebarchiesi@0 198 'size' => 'tiny',
danielebarchiesi@0 199 'description' => 'Whether the user is active(1) or blocked(0).',
danielebarchiesi@0 200 ),
danielebarchiesi@0 201 'timezone' => array(
danielebarchiesi@0 202 'type' => 'varchar',
danielebarchiesi@0 203 'length' => 32,
danielebarchiesi@0 204 'not null' => FALSE,
danielebarchiesi@0 205 'description' => "User's time zone.",
danielebarchiesi@0 206 ),
danielebarchiesi@0 207 'language' => array(
danielebarchiesi@0 208 'type' => 'varchar',
danielebarchiesi@0 209 'length' => 12,
danielebarchiesi@0 210 'not null' => TRUE,
danielebarchiesi@0 211 'default' => '',
danielebarchiesi@0 212 'description' => "User's default language.",
danielebarchiesi@0 213 ),
danielebarchiesi@0 214 'picture' => array(
danielebarchiesi@0 215 'type' => 'int',
danielebarchiesi@0 216 'not null' => TRUE,
danielebarchiesi@0 217 'default' => 0,
danielebarchiesi@0 218 'description' => "Foreign key: {file_managed}.fid of user's picture.",
danielebarchiesi@0 219 ),
danielebarchiesi@0 220 'init' => array(
danielebarchiesi@0 221 'type' => 'varchar',
danielebarchiesi@0 222 'length' => 254,
danielebarchiesi@0 223 'not null' => FALSE,
danielebarchiesi@0 224 'default' => '',
danielebarchiesi@0 225 'description' => 'E-mail address used for initial account creation.',
danielebarchiesi@0 226 ),
danielebarchiesi@0 227 'data' => array(
danielebarchiesi@0 228 'type' => 'blob',
danielebarchiesi@0 229 'not null' => FALSE,
danielebarchiesi@0 230 'size' => 'big',
danielebarchiesi@0 231 'serialize' => TRUE,
danielebarchiesi@0 232 'description' => '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.',
danielebarchiesi@0 233 ),
danielebarchiesi@0 234 ),
danielebarchiesi@0 235 'indexes' => array(
danielebarchiesi@0 236 'access' => array('access'),
danielebarchiesi@0 237 'created' => array('created'),
danielebarchiesi@0 238 'mail' => array('mail'),
danielebarchiesi@0 239 'picture' => array('picture'),
danielebarchiesi@0 240 ),
danielebarchiesi@0 241 'unique keys' => array(
danielebarchiesi@0 242 'name' => array('name'),
danielebarchiesi@0 243 ),
danielebarchiesi@0 244 'primary key' => array('uid'),
danielebarchiesi@0 245 'foreign keys' => array(
danielebarchiesi@0 246 'signature_format' => array(
danielebarchiesi@0 247 'table' => 'filter_format',
danielebarchiesi@0 248 'columns' => array('signature_format' => 'format'),
danielebarchiesi@0 249 ),
danielebarchiesi@0 250 ),
danielebarchiesi@0 251 );
danielebarchiesi@0 252
danielebarchiesi@0 253 $schema['users_roles'] = array(
danielebarchiesi@0 254 'description' => 'Maps users to roles.',
danielebarchiesi@0 255 'fields' => array(
danielebarchiesi@0 256 'uid' => array(
danielebarchiesi@0 257 'type' => 'int',
danielebarchiesi@0 258 'unsigned' => TRUE,
danielebarchiesi@0 259 'not null' => TRUE,
danielebarchiesi@0 260 'default' => 0,
danielebarchiesi@0 261 'description' => 'Primary Key: {users}.uid for user.',
danielebarchiesi@0 262 ),
danielebarchiesi@0 263 'rid' => array(
danielebarchiesi@0 264 'type' => 'int',
danielebarchiesi@0 265 'unsigned' => TRUE,
danielebarchiesi@0 266 'not null' => TRUE,
danielebarchiesi@0 267 'default' => 0,
danielebarchiesi@0 268 'description' => 'Primary Key: {role}.rid for role.',
danielebarchiesi@0 269 ),
danielebarchiesi@0 270 ),
danielebarchiesi@0 271 'primary key' => array('uid', 'rid'),
danielebarchiesi@0 272 'indexes' => array(
danielebarchiesi@0 273 'rid' => array('rid'),
danielebarchiesi@0 274 ),
danielebarchiesi@0 275 'foreign keys' => array(
danielebarchiesi@0 276 'user' => array(
danielebarchiesi@0 277 'table' => 'users',
danielebarchiesi@0 278 'columns' => array('uid' => 'uid'),
danielebarchiesi@0 279 ),
danielebarchiesi@0 280 'role' => array(
danielebarchiesi@0 281 'table' => 'roles',
danielebarchiesi@0 282 'columns' => array('rid' => 'rid'),
danielebarchiesi@0 283 ),
danielebarchiesi@0 284 ),
danielebarchiesi@0 285 );
danielebarchiesi@0 286
danielebarchiesi@0 287 return $schema;
danielebarchiesi@0 288 }
danielebarchiesi@0 289
danielebarchiesi@0 290 /**
danielebarchiesi@0 291 * Implements hook_install().
danielebarchiesi@0 292 */
danielebarchiesi@0 293 function user_install() {
danielebarchiesi@0 294 // Insert a row for the anonymous user.
danielebarchiesi@0 295 db_insert('users')
danielebarchiesi@0 296 ->fields(array(
danielebarchiesi@0 297 'uid' => 0,
danielebarchiesi@0 298 'name' => '',
danielebarchiesi@0 299 'mail' => '',
danielebarchiesi@0 300 ))
danielebarchiesi@0 301 ->execute();
danielebarchiesi@0 302
danielebarchiesi@0 303 // We need some placeholders here as name and mail are uniques and data is
danielebarchiesi@0 304 // presumed to be a serialized array. This will be changed by the settings
danielebarchiesi@0 305 // form in the installer.
danielebarchiesi@0 306 db_insert('users')
danielebarchiesi@0 307 ->fields(array(
danielebarchiesi@0 308 'uid' => 1,
danielebarchiesi@0 309 'name' => 'placeholder-for-uid-1',
danielebarchiesi@0 310 'mail' => 'placeholder-for-uid-1',
danielebarchiesi@0 311 'created' => REQUEST_TIME,
danielebarchiesi@0 312 'status' => 1,
danielebarchiesi@0 313 'data' => NULL,
danielebarchiesi@0 314 ))
danielebarchiesi@0 315 ->execute();
danielebarchiesi@0 316
danielebarchiesi@0 317 // Built-in roles.
danielebarchiesi@0 318 $rid_anonymous = db_insert('role')
danielebarchiesi@0 319 ->fields(array('name' => 'anonymous user', 'weight' => 0))
danielebarchiesi@0 320 ->execute();
danielebarchiesi@0 321 $rid_authenticated = db_insert('role')
danielebarchiesi@0 322 ->fields(array('name' => 'authenticated user', 'weight' => 1))
danielebarchiesi@0 323 ->execute();
danielebarchiesi@0 324
danielebarchiesi@0 325 // Sanity check to ensure the anonymous and authenticated role IDs are the
danielebarchiesi@0 326 // same as the drupal defined constants. In certain situations, this will
danielebarchiesi@0 327 // not be true.
danielebarchiesi@0 328 if ($rid_anonymous != DRUPAL_ANONYMOUS_RID) {
danielebarchiesi@0 329 db_update('role')
danielebarchiesi@0 330 ->fields(array('rid' => DRUPAL_ANONYMOUS_RID))
danielebarchiesi@0 331 ->condition('rid', $rid_anonymous)
danielebarchiesi@0 332 ->execute();
danielebarchiesi@0 333 }
danielebarchiesi@0 334 if ($rid_authenticated != DRUPAL_AUTHENTICATED_RID) {
danielebarchiesi@0 335 db_update('role')
danielebarchiesi@0 336 ->fields(array('rid' => DRUPAL_AUTHENTICATED_RID))
danielebarchiesi@0 337 ->condition('rid', $rid_authenticated)
danielebarchiesi@0 338 ->execute();
danielebarchiesi@0 339 }
danielebarchiesi@0 340 }
danielebarchiesi@0 341
danielebarchiesi@0 342 /**
danielebarchiesi@0 343 * Implements hook_update_dependencies().
danielebarchiesi@0 344 */
danielebarchiesi@0 345 function user_update_dependencies() {
danielebarchiesi@0 346 // user_update_7006() updates data in the {role_permission} table, so it must
danielebarchiesi@0 347 // run after system_update_7007(), which populates that table.
danielebarchiesi@0 348 $dependencies['user'][7006] = array(
danielebarchiesi@0 349 'system' => 7007,
danielebarchiesi@0 350 );
danielebarchiesi@0 351
danielebarchiesi@0 352 // user_update_7010() needs to query the {filter_format} table to get a list
danielebarchiesi@0 353 // of existing text formats, so it must run after filter_update_7000(), which
danielebarchiesi@0 354 // creates that table.
danielebarchiesi@0 355 $dependencies['user'][7010] = array(
danielebarchiesi@0 356 'filter' => 7000,
danielebarchiesi@0 357 );
danielebarchiesi@0 358
danielebarchiesi@0 359 // user_update_7012() uses the file API, which relies on the {file_managed}
danielebarchiesi@0 360 // table, so it must run after system_update_7034(), which creates that
danielebarchiesi@0 361 // table.
danielebarchiesi@0 362 $dependencies['user'][7012] = array(
danielebarchiesi@0 363 'system' => 7034,
danielebarchiesi@0 364 );
danielebarchiesi@0 365
danielebarchiesi@0 366 // user_update_7013() uses the file usage API, which relies on the
danielebarchiesi@0 367 // {file_usage} table, so it must run after system_update_7059(), which
danielebarchiesi@0 368 // creates that table.
danielebarchiesi@0 369 $dependencies['user'][7013] = array(
danielebarchiesi@0 370 'system' => 7059,
danielebarchiesi@0 371 );
danielebarchiesi@0 372
danielebarchiesi@0 373 return $dependencies;
danielebarchiesi@0 374 }
danielebarchiesi@0 375
danielebarchiesi@0 376 /**
danielebarchiesi@0 377 * Utility function: grant a set of permissions to a role during update.
danielebarchiesi@0 378 *
danielebarchiesi@0 379 * This function is valid for a database schema version 7000.
danielebarchiesi@0 380 *
danielebarchiesi@0 381 * @param $rid
danielebarchiesi@0 382 * The role ID.
danielebarchiesi@0 383 * @param $permissions
danielebarchiesi@0 384 * An array of permissions names.
danielebarchiesi@0 385 * @param $module
danielebarchiesi@0 386 * The name of the module defining the permissions.
danielebarchiesi@0 387 * @ingroup update_api
danielebarchiesi@0 388 */
danielebarchiesi@0 389 function _update_7000_user_role_grant_permissions($rid, array $permissions, $module) {
danielebarchiesi@0 390 // Grant new permissions for the role.
danielebarchiesi@0 391 foreach ($permissions as $name) {
danielebarchiesi@0 392 db_merge('role_permission')
danielebarchiesi@0 393 ->key(array(
danielebarchiesi@0 394 'rid' => $rid,
danielebarchiesi@0 395 'permission' => $name,
danielebarchiesi@0 396 ))
danielebarchiesi@0 397 ->fields(array(
danielebarchiesi@0 398 'module' => $module,
danielebarchiesi@0 399 ))
danielebarchiesi@0 400 ->execute();
danielebarchiesi@0 401 }
danielebarchiesi@0 402 }
danielebarchiesi@0 403
danielebarchiesi@0 404 /**
danielebarchiesi@0 405 * @addtogroup updates-6.x-to-7.x
danielebarchiesi@0 406 * @{
danielebarchiesi@0 407 */
danielebarchiesi@0 408
danielebarchiesi@0 409 /**
danielebarchiesi@0 410 * Increase the length of the password field to accommodate better hashes.
danielebarchiesi@0 411 *
danielebarchiesi@0 412 * Also re-hashes all current passwords to improve security. This may be a
danielebarchiesi@0 413 * lengthy process, and is performed batch-wise.
danielebarchiesi@0 414 */
danielebarchiesi@0 415 function user_update_7000(&$sandbox) {
danielebarchiesi@0 416 $sandbox['#finished'] = 0;
danielebarchiesi@0 417 // Lower than DRUPAL_HASH_COUNT to make the update run at a reasonable speed.
danielebarchiesi@0 418 $hash_count_log2 = 11;
danielebarchiesi@0 419 // Multi-part update.
danielebarchiesi@0 420 if (!isset($sandbox['user_from'])) {
danielebarchiesi@0 421 db_change_field('users', 'pass', 'pass', array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''));
danielebarchiesi@0 422 $sandbox['user_from'] = 0;
danielebarchiesi@0 423 $sandbox['user_count'] = db_query("SELECT COUNT(uid) FROM {users}")->fetchField();
danielebarchiesi@0 424 }
danielebarchiesi@0 425 else {
danielebarchiesi@0 426 require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
danielebarchiesi@0 427 // Hash again all current hashed passwords.
danielebarchiesi@0 428 $has_rows = FALSE;
danielebarchiesi@0 429 // Update this many per page load.
danielebarchiesi@0 430 $count = 1000;
danielebarchiesi@0 431 $result = db_query_range("SELECT uid, pass FROM {users} WHERE uid > 0 ORDER BY uid", $sandbox['user_from'], $count);
danielebarchiesi@0 432 foreach ($result as $account) {
danielebarchiesi@0 433 $has_rows = TRUE;
danielebarchiesi@0 434
danielebarchiesi@0 435 // If the $account->pass value is not a MD5 hash (a 32 character
danielebarchiesi@0 436 // hexadecimal string) then skip it.
danielebarchiesi@0 437 if (!preg_match('/^[0-9a-f]{32}$/', $account->pass)) {
danielebarchiesi@0 438 continue;
danielebarchiesi@0 439 }
danielebarchiesi@0 440
danielebarchiesi@0 441 $new_hash = user_hash_password($account->pass, $hash_count_log2);
danielebarchiesi@0 442 if ($new_hash) {
danielebarchiesi@0 443 // Indicate an updated password.
danielebarchiesi@0 444 $new_hash = 'U' . $new_hash;
danielebarchiesi@0 445 db_update('users')
danielebarchiesi@0 446 ->fields(array('pass' => $new_hash))
danielebarchiesi@0 447 ->condition('uid', $account->uid)
danielebarchiesi@0 448 ->execute();
danielebarchiesi@0 449 }
danielebarchiesi@0 450 }
danielebarchiesi@0 451 $sandbox['#finished'] = $sandbox['user_from']/$sandbox['user_count'];
danielebarchiesi@0 452 $sandbox['user_from'] += $count;
danielebarchiesi@0 453 if (!$has_rows) {
danielebarchiesi@0 454 $sandbox['#finished'] = 1;
danielebarchiesi@0 455 return t('User passwords rehashed to improve security');
danielebarchiesi@0 456 }
danielebarchiesi@0 457 }
danielebarchiesi@0 458 }
danielebarchiesi@0 459
danielebarchiesi@0 460 /**
danielebarchiesi@0 461 * Remove the 'threshold', 'mode' and 'sort' columns from the {users} table.
danielebarchiesi@0 462 *
danielebarchiesi@0 463 * These fields were previously used to store per-user comment settings.
danielebarchiesi@0 464 */
danielebarchiesi@0 465
danielebarchiesi@0 466 function user_update_7001() {
danielebarchiesi@0 467 db_drop_field('users', 'threshold');
danielebarchiesi@0 468 db_drop_field('users', 'mode');
danielebarchiesi@0 469 db_drop_field('users', 'sort');
danielebarchiesi@0 470 }
danielebarchiesi@0 471
danielebarchiesi@0 472 /**
danielebarchiesi@0 473 * Convert user time zones from time zone offsets to time zone names.
danielebarchiesi@0 474 */
danielebarchiesi@0 475 function user_update_7002(&$sandbox) {
danielebarchiesi@0 476 $sandbox['#finished'] = 0;
danielebarchiesi@0 477
danielebarchiesi@0 478 // Multi-part update.
danielebarchiesi@0 479 if (!isset($sandbox['user_from'])) {
danielebarchiesi@0 480 db_change_field('users', 'timezone', 'timezone', array('type' => 'varchar', 'length' => 32, 'not null' => FALSE));
danielebarchiesi@0 481 $sandbox['user_from'] = 0;
danielebarchiesi@0 482 $sandbox['user_count'] = db_query("SELECT COUNT(uid) FROM {users}")->fetchField();
danielebarchiesi@0 483 $sandbox['user_not_migrated'] = 0;
danielebarchiesi@0 484 }
danielebarchiesi@0 485 else {
danielebarchiesi@0 486 $timezones = system_time_zones();
danielebarchiesi@0 487 // Update this many per page load.
danielebarchiesi@0 488 $count = 10000;
danielebarchiesi@0 489 $contributed_date_module = db_field_exists('users', 'timezone_name');
danielebarchiesi@0 490 $contributed_event_module = db_field_exists('users', 'timezone_id');
danielebarchiesi@0 491
danielebarchiesi@0 492 $results = db_query_range("SELECT uid FROM {users} ORDER BY uid", $sandbox['user_from'], $count);
danielebarchiesi@0 493 foreach ($results as $account) {
danielebarchiesi@0 494 $timezone = NULL;
danielebarchiesi@0 495 // If the contributed Date module has created a users.timezone_name
danielebarchiesi@0 496 // column, use this data to set each user's time zone.
danielebarchiesi@0 497 if ($contributed_date_module) {
danielebarchiesi@0 498 $date_timezone = db_query("SELECT timezone_name FROM {users} WHERE uid = :uid", array(':uid' => $account->uid))->fetchField();
danielebarchiesi@0 499 if (isset($timezones[$date_timezone])) {
danielebarchiesi@0 500 $timezone = $date_timezone;
danielebarchiesi@0 501 }
danielebarchiesi@0 502 }
danielebarchiesi@0 503 // If the contributed Event module has stored user time zone information
danielebarchiesi@0 504 // use that information to update the user accounts.
danielebarchiesi@0 505 if (!$timezone && $contributed_event_module) {
danielebarchiesi@0 506 try {
danielebarchiesi@0 507 $event_timezone = db_query("SELECT t.name FROM {users} u LEFT JOIN {event_timezones} t ON u.timezone_id = t.timezone WHERE u.uid = :uid", array(':uid' => $account->uid))->fetchField();
danielebarchiesi@0 508 $event_timezone = str_replace(' ', '_', $event_timezone);
danielebarchiesi@0 509 if (isset($timezones[$event_timezone])) {
danielebarchiesi@0 510 $timezone = $event_timezone;
danielebarchiesi@0 511 }
danielebarchiesi@0 512 }
danielebarchiesi@0 513 catch (PDOException $e) {
danielebarchiesi@0 514 // Ignore error if event_timezones table does not exist or unexpected
danielebarchiesi@0 515 // schema found.
danielebarchiesi@0 516 }
danielebarchiesi@0 517 }
danielebarchiesi@0 518 if ($timezone) {
danielebarchiesi@0 519 db_update('users')
danielebarchiesi@0 520 ->fields(array('timezone' => $timezone))
danielebarchiesi@0 521 ->condition('uid', $account->uid)
danielebarchiesi@0 522 ->execute();
danielebarchiesi@0 523 }
danielebarchiesi@0 524 else {
danielebarchiesi@0 525 $sandbox['user_not_migrated']++;
danielebarchiesi@0 526 db_update('users')
danielebarchiesi@0 527 ->fields(array('timezone' => NULL))
danielebarchiesi@0 528 ->condition('uid', $account->uid)
danielebarchiesi@0 529 ->execute();
danielebarchiesi@0 530 }
danielebarchiesi@0 531 $sandbox['user_from']++;
danielebarchiesi@0 532 }
danielebarchiesi@0 533
danielebarchiesi@0 534 $sandbox['#finished'] = $sandbox['user_from'] / $sandbox['user_count'];
danielebarchiesi@0 535 if ($sandbox['user_from'] == $sandbox['user_count']) {
danielebarchiesi@0 536 if ($sandbox['user_not_migrated'] > 0) {
danielebarchiesi@0 537 variable_set('empty_timezone_message', 1);
danielebarchiesi@0 538 drupal_set_message(format_string('Some user time zones have been emptied and need to be set to the correct values. Use the new <a href="@config-url">time zone options</a> to choose whether to remind users at login to set the correct time zone.', array('@config-url' => url('admin/config/regional/settings'))), 'warning');
danielebarchiesi@0 539 }
danielebarchiesi@0 540 return t('Migrated user time zones');
danielebarchiesi@0 541 }
danielebarchiesi@0 542 }
danielebarchiesi@0 543 }
danielebarchiesi@0 544
danielebarchiesi@0 545 /**
danielebarchiesi@0 546 * Update user settings for cancelling user accounts.
danielebarchiesi@0 547 *
danielebarchiesi@0 548 * Prior to 7.x, users were not able to cancel their accounts. When
danielebarchiesi@0 549 * administrators deleted an account, all contents were assigned to uid 0,
danielebarchiesi@0 550 * which is the same as the 'user_cancel_reassign' method now.
danielebarchiesi@0 551 */
danielebarchiesi@0 552 function user_update_7003() {
danielebarchiesi@0 553 // Set the default account cancellation method.
danielebarchiesi@0 554 variable_set('user_cancel_method', 'user_cancel_reassign');
danielebarchiesi@0 555 // Re-assign notification setting.
danielebarchiesi@0 556 if ($setting = variable_get('user_mail_status_deleted_notify', FALSE)) {
danielebarchiesi@0 557 variable_set('user_mail_status_canceled_notify', $setting);
danielebarchiesi@0 558 variable_del('user_mail_status_deleted_notify');
danielebarchiesi@0 559 }
danielebarchiesi@0 560 // Re-assign "Account deleted" mail strings to "Account canceled" mail.
danielebarchiesi@0 561 if ($setting = variable_get('user_mail_status_deleted_subject', FALSE)) {
danielebarchiesi@0 562 variable_set('user_mail_status_canceled_subject', $setting);
danielebarchiesi@0 563 variable_del('user_mail_status_deleted_subject');
danielebarchiesi@0 564 }
danielebarchiesi@0 565 if ($setting = variable_get('user_mail_status_deleted_body', FALSE)) {
danielebarchiesi@0 566 variable_set('user_mail_status_canceled_body', $setting);
danielebarchiesi@0 567 variable_del('user_mail_status_deleted_body');
danielebarchiesi@0 568 }
danielebarchiesi@0 569 }
danielebarchiesi@0 570
danielebarchiesi@0 571 /**
danielebarchiesi@0 572 * Changes the users table to allow longer e-mail addresses.
danielebarchiesi@0 573 */
danielebarchiesi@0 574 function user_update_7005(&$sandbox) {
danielebarchiesi@0 575 $mail_field = array(
danielebarchiesi@0 576 'type' => 'varchar',
danielebarchiesi@0 577 'length' => 254,
danielebarchiesi@0 578 'not null' => FALSE,
danielebarchiesi@0 579 'default' => '',
danielebarchiesi@0 580 'description' => "User's e-mail address.",
danielebarchiesi@0 581 );
danielebarchiesi@0 582 $init_field = array(
danielebarchiesi@0 583 'type' => 'varchar',
danielebarchiesi@0 584 'length' => 254,
danielebarchiesi@0 585 'not null' => FALSE,
danielebarchiesi@0 586 'default' => '',
danielebarchiesi@0 587 'description' => 'E-mail address used for initial account creation.',
danielebarchiesi@0 588 );
danielebarchiesi@0 589 db_drop_index('users', 'mail');
danielebarchiesi@0 590 db_change_field('users', 'mail', 'mail', $mail_field, array('indexes' => array('mail' => array('mail'))));
danielebarchiesi@0 591 db_change_field('users', 'init', 'init', $init_field);
danielebarchiesi@0 592 }
danielebarchiesi@0 593
danielebarchiesi@0 594 /**
danielebarchiesi@0 595 * Add module data to {role_permission}.
danielebarchiesi@0 596 */
danielebarchiesi@0 597 function user_update_7006(&$sandbox) {
danielebarchiesi@0 598 $module_field = array(
danielebarchiesi@0 599 'type' => 'varchar',
danielebarchiesi@0 600 'length' => 255,
danielebarchiesi@0 601 'not null' => TRUE,
danielebarchiesi@0 602 'default' => '',
danielebarchiesi@0 603 'description' => "The module declaring the permission.",
danielebarchiesi@0 604 );
danielebarchiesi@0 605 // Check that the field hasn't been updated in an aborted run of this
danielebarchiesi@0 606 // update.
danielebarchiesi@0 607 if (!db_field_exists('role_permission', 'module')) {
danielebarchiesi@0 608 // Add a new field for the fid.
danielebarchiesi@0 609 db_add_field('role_permission', 'module', $module_field);
danielebarchiesi@0 610 }
danielebarchiesi@0 611 }
danielebarchiesi@0 612
danielebarchiesi@0 613 /**
danielebarchiesi@0 614 * Add a weight column to user roles.
danielebarchiesi@0 615 */
danielebarchiesi@0 616 function user_update_7007() {
danielebarchiesi@0 617 db_add_field('role', 'weight', array('type' => 'int', 'not null' => TRUE, 'default' => 0));
danielebarchiesi@0 618 db_add_index('role', 'name_weight', array('name', 'weight'));
danielebarchiesi@0 619 }
danielebarchiesi@0 620
danielebarchiesi@0 621 /**
danielebarchiesi@0 622 * If 'user_register' variable was unset in Drupal 6, set it to be the same as
danielebarchiesi@0 623 * the Drupal 6 default setting.
danielebarchiesi@0 624 */
danielebarchiesi@0 625 function user_update_7008() {
danielebarchiesi@0 626 if (!isset($GLOBALS['conf']['user_register'])) {
danielebarchiesi@0 627 // Set to the Drupal 6 default, "visitors can create accounts".
danielebarchiesi@0 628 variable_set('user_register', USER_REGISTER_VISITORS);
danielebarchiesi@0 629 }
danielebarchiesi@0 630 }
danielebarchiesi@0 631
danielebarchiesi@0 632 /**
danielebarchiesi@0 633 * Converts fields that store serialized variables from text to blob.
danielebarchiesi@0 634 */
danielebarchiesi@0 635 function user_update_7009() {
danielebarchiesi@0 636 $spec = array(
danielebarchiesi@0 637 'type' => 'blob',
danielebarchiesi@0 638 'not null' => FALSE,
danielebarchiesi@0 639 'size' => 'big',
danielebarchiesi@0 640 'serialize' => TRUE,
danielebarchiesi@0 641 'description' => '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.',
danielebarchiesi@0 642 );
danielebarchiesi@0 643 db_change_field('users', 'data', 'data', $spec);
danielebarchiesi@0 644 }
danielebarchiesi@0 645
danielebarchiesi@0 646 /**
danielebarchiesi@0 647 * Update the {user}.signature_format column.
danielebarchiesi@0 648 */
danielebarchiesi@0 649 function user_update_7010() {
danielebarchiesi@0 650 // Update the database column to allow NULL values.
danielebarchiesi@0 651 db_change_field('users', 'signature_format', 'signature_format', array(
danielebarchiesi@0 652 'type' => 'int',
danielebarchiesi@0 653 'unsigned' => TRUE,
danielebarchiesi@0 654 'not null' => FALSE,
danielebarchiesi@0 655 'description' => 'The {filter_format}.format of the signature.',
danielebarchiesi@0 656 ));
danielebarchiesi@0 657
danielebarchiesi@0 658 // Replace the signature format with NULL if the signature is empty and does
danielebarchiesi@0 659 // not already have a stored text format.
danielebarchiesi@0 660 //
danielebarchiesi@0 661 // In Drupal 6, "0" (the former FILTER_FORMAT_DEFAULT constant) could be used
danielebarchiesi@0 662 // to indicate this situation, but in Drupal 7, only NULL is supported. This
danielebarchiesi@0 663 // update therefore preserves the ability of user accounts which were never
danielebarchiesi@0 664 // given a signature (for example, if the site did not have user signatures
danielebarchiesi@0 665 // enabled, or if the user never edited their account information) to not
danielebarchiesi@0 666 // have a particular text format assumed for them the first time the
danielebarchiesi@0 667 // signature is edited.
danielebarchiesi@0 668 db_update('users')
danielebarchiesi@0 669 ->fields(array('signature_format' => NULL))
danielebarchiesi@0 670 ->condition('signature', '')
danielebarchiesi@0 671 ->condition('signature_format', 0)
danielebarchiesi@0 672 ->execute();
danielebarchiesi@0 673
danielebarchiesi@0 674 // There are a number of situations in which a Drupal 6 site could store
danielebarchiesi@0 675 // content with a nonexistent text format. This includes text formats that
danielebarchiesi@0 676 // had later been deleted, or non-empty content stored with a value of "0"
danielebarchiesi@0 677 // (the former FILTER_FORMAT_DEFAULT constant). Drupal 6 would filter this
danielebarchiesi@0 678 // content using whatever the site-wide default text format was at the moment
danielebarchiesi@0 679 // the text was being displayed.
danielebarchiesi@0 680 //
danielebarchiesi@0 681 // In Drupal 7, this behavior is no longer supported, and all content must be
danielebarchiesi@0 682 // stored with an explicit text format (or it will not be displayed when it
danielebarchiesi@0 683 // is filtered). Therefore, to preserve the behavior of the site after the
danielebarchiesi@0 684 // upgrade, we must replace all instances described above with the current
danielebarchiesi@0 685 // value of the (old) site-wide default format at the moment of the upgrade.
danielebarchiesi@0 686 $existing_formats = db_query("SELECT format FROM {filter_format}")->fetchCol();
danielebarchiesi@0 687 $default_format = variable_get('filter_default_format', 1);
danielebarchiesi@0 688 db_update('users')
danielebarchiesi@0 689 ->fields(array('signature_format' => $default_format))
danielebarchiesi@0 690 ->isNotNull('signature_format')
danielebarchiesi@0 691 ->condition('signature_format', $existing_formats, 'NOT IN')
danielebarchiesi@0 692 ->execute();
danielebarchiesi@0 693 }
danielebarchiesi@0 694
danielebarchiesi@0 695 /**
danielebarchiesi@0 696 * Placeholder function.
danielebarchiesi@0 697 *
danielebarchiesi@0 698 * As a fix for user_update_7011() not updating email templates to use the new
danielebarchiesi@0 699 * tokens, user_update_7017() now targets email templates of Drupal 6 sites and
danielebarchiesi@0 700 * already upgraded sites.
danielebarchiesi@0 701 */
danielebarchiesi@0 702 function user_update_7011() {
danielebarchiesi@0 703 }
danielebarchiesi@0 704
danielebarchiesi@0 705 /**
danielebarchiesi@0 706 * Add the user's pictures to the {file_managed} table and make them managed
danielebarchiesi@0 707 * files.
danielebarchiesi@0 708 */
danielebarchiesi@0 709 function user_update_7012(&$sandbox) {
danielebarchiesi@0 710
danielebarchiesi@0 711 $picture_field = array(
danielebarchiesi@0 712 'type' => 'int',
danielebarchiesi@0 713 'not null' => TRUE,
danielebarchiesi@0 714 'default' => 0,
danielebarchiesi@0 715 'description' => "Foreign key: {file_managed}.fid of user's picture.",
danielebarchiesi@0 716 );
danielebarchiesi@0 717
danielebarchiesi@0 718 if (!isset($sandbox['progress'])) {
danielebarchiesi@0 719 // Check that the field hasn't been updated in an aborted run of this
danielebarchiesi@0 720 // update.
danielebarchiesi@0 721 if (!db_field_exists('users', 'picture_fid')) {
danielebarchiesi@0 722 // Add a new field for the fid.
danielebarchiesi@0 723 db_add_field('users', 'picture_fid', $picture_field);
danielebarchiesi@0 724 }
danielebarchiesi@0 725
danielebarchiesi@0 726 // Initialize batch update information.
danielebarchiesi@0 727 $sandbox['progress'] = 0;
danielebarchiesi@0 728 $sandbox['last_user_processed'] = -1;
danielebarchiesi@0 729 $sandbox['max'] = db_query("SELECT COUNT(*) FROM {users} WHERE picture <> ''")->fetchField();
danielebarchiesi@0 730 }
danielebarchiesi@0 731
danielebarchiesi@0 732 // As a batch operation move the photos into the {file_managed} table and
danielebarchiesi@0 733 // update the {users} records.
danielebarchiesi@0 734 $limit = 500;
danielebarchiesi@0 735 $result = db_query_range("SELECT uid, picture FROM {users} WHERE picture <> '' AND uid > :uid ORDER BY uid", 0, $limit, array(':uid' => $sandbox['last_user_processed']));
danielebarchiesi@0 736 foreach ($result as $user) {
danielebarchiesi@0 737 // Don't bother adding files that don't exist.
danielebarchiesi@0 738 if (file_exists($user->picture)) {
danielebarchiesi@0 739
danielebarchiesi@0 740 // Check if the file already exists.
danielebarchiesi@0 741 $files = file_load_multiple(array(), array('uri' => $user->picture));
danielebarchiesi@0 742 if (count($files)) {
danielebarchiesi@0 743 $file = reset($files);
danielebarchiesi@0 744 }
danielebarchiesi@0 745 else {
danielebarchiesi@0 746 // Create a file object.
danielebarchiesi@0 747 $file = new stdClass();
danielebarchiesi@0 748 $file->uri = $user->picture;
danielebarchiesi@0 749 $file->filename = drupal_basename($file->uri);
danielebarchiesi@0 750 $file->filemime = file_get_mimetype($file->uri);
danielebarchiesi@0 751 $file->uid = $user->uid;
danielebarchiesi@0 752 $file->status = FILE_STATUS_PERMANENT;
danielebarchiesi@0 753 $file = file_save($file);
danielebarchiesi@0 754 }
danielebarchiesi@0 755
danielebarchiesi@0 756 db_update('users')
danielebarchiesi@0 757 ->fields(array('picture_fid' => $file->fid))
danielebarchiesi@0 758 ->condition('uid', $user->uid)
danielebarchiesi@0 759 ->execute();
danielebarchiesi@0 760 }
danielebarchiesi@0 761
danielebarchiesi@0 762 // Update our progress information for the batch update.
danielebarchiesi@0 763 $sandbox['progress']++;
danielebarchiesi@0 764 $sandbox['last_user_processed'] = $user->uid;
danielebarchiesi@0 765 }
danielebarchiesi@0 766
danielebarchiesi@0 767 // Indicate our current progress to the batch update system. If there's no
danielebarchiesi@0 768 // max value then there's nothing to update and we're finished.
danielebarchiesi@0 769 $sandbox['#finished'] = empty($sandbox['max']) ? 1 : ($sandbox['progress'] / $sandbox['max']);
danielebarchiesi@0 770
danielebarchiesi@0 771 // When we're finished, drop the old picture field and rename the new one to
danielebarchiesi@0 772 // replace it.
danielebarchiesi@0 773 if (isset($sandbox['#finished']) && $sandbox['#finished'] == 1) {
danielebarchiesi@0 774 db_drop_field('users', 'picture');
danielebarchiesi@0 775 db_change_field('users', 'picture_fid', 'picture', $picture_field);
danielebarchiesi@0 776 }
danielebarchiesi@0 777 }
danielebarchiesi@0 778
danielebarchiesi@0 779 /**
danielebarchiesi@0 780 * Add user module file usage entries.
danielebarchiesi@0 781 */
danielebarchiesi@0 782 function user_update_7013(&$sandbox) {
danielebarchiesi@0 783 if (!isset($sandbox['progress'])) {
danielebarchiesi@0 784 // Initialize batch update information.
danielebarchiesi@0 785 $sandbox['progress'] = 0;
danielebarchiesi@0 786 $sandbox['last_uid_processed'] = -1;
danielebarchiesi@0 787 $sandbox['max'] = db_query("SELECT COUNT(*) FROM {users} u WHERE u.picture <> 0")->fetchField();
danielebarchiesi@0 788 }
danielebarchiesi@0 789
danielebarchiesi@0 790 // Add usage entries for the user picture files.
danielebarchiesi@0 791 $limit = 500;
danielebarchiesi@0 792 $result = db_query_range('SELECT f.*, u.uid as user_uid FROM {users} u INNER JOIN {file_managed} f ON u.picture = f.fid WHERE u.picture <> 0 AND u.uid > :uid ORDER BY u.uid', 0, $limit, array(':uid' => $sandbox['last_uid_processed']))->fetchAllAssoc('fid', PDO::FETCH_ASSOC);
danielebarchiesi@0 793 foreach ($result as $row) {
danielebarchiesi@0 794 $uid = $row['user_uid'];
danielebarchiesi@0 795 $file = (object) $row;
danielebarchiesi@0 796 file_usage_add($file, 'user', 'user', $uid);
danielebarchiesi@0 797
danielebarchiesi@0 798 // Update our progress information for the batch update.
danielebarchiesi@0 799 $sandbox['progress']++;
danielebarchiesi@0 800 $sandbox['last_uid_processed'] = $uid;
danielebarchiesi@0 801 }
danielebarchiesi@0 802
danielebarchiesi@0 803 // Indicate our current progress to the batch update system.
danielebarchiesi@0 804 $sandbox['#finished'] = empty($sandbox['max']) || ($sandbox['progress'] / $sandbox['max']);
danielebarchiesi@0 805 }
danielebarchiesi@0 806
danielebarchiesi@0 807 /**
danielebarchiesi@0 808 * Rename the 'post comments without approval' permission.
danielebarchiesi@0 809 *
danielebarchiesi@0 810 * In Drupal 7, this permission has been renamed to 'skip comment approval'.
danielebarchiesi@0 811 */
danielebarchiesi@0 812 function user_update_7014() {
danielebarchiesi@0 813 db_update('role_permission')
danielebarchiesi@0 814 ->fields(array('permission' => 'skip comment approval'))
danielebarchiesi@0 815 ->condition('permission', 'post comments without approval')
danielebarchiesi@0 816 ->execute();
danielebarchiesi@0 817
danielebarchiesi@0 818 return t("Renamed the 'post comments without approval' permission to 'skip comment approval'.");
danielebarchiesi@0 819 }
danielebarchiesi@0 820
danielebarchiesi@0 821 /**
danielebarchiesi@0 822 * Change {users}.signature_format into varchar.
danielebarchiesi@0 823 */
danielebarchiesi@0 824 function user_update_7015() {
danielebarchiesi@0 825 db_change_field('users', 'signature_format', 'signature_format', array(
danielebarchiesi@0 826 'type' => 'varchar',
danielebarchiesi@0 827 'length' => 255,
danielebarchiesi@0 828 'not null' => FALSE,
danielebarchiesi@0 829 'description' => 'The {filter_format}.format of the signature.',
danielebarchiesi@0 830 ));
danielebarchiesi@0 831 }
danielebarchiesi@0 832
danielebarchiesi@0 833 /**
danielebarchiesi@0 834 * @} End of "addtogroup updates-6.x-to-7.x".
danielebarchiesi@0 835 */
danielebarchiesi@0 836
danielebarchiesi@0 837 /**
danielebarchiesi@0 838 * @addtogroup updates-7.x-extra
danielebarchiesi@0 839 * @{
danielebarchiesi@0 840 */
danielebarchiesi@0 841
danielebarchiesi@0 842 /**
danielebarchiesi@0 843 * Update the database to match the schema.
danielebarchiesi@0 844 */
danielebarchiesi@0 845 function user_update_7016() {
danielebarchiesi@0 846 // Add field default.
danielebarchiesi@0 847 db_change_field('users', 'uid', 'uid', array(
danielebarchiesi@0 848 'type' => 'int',
danielebarchiesi@0 849 'unsigned' => TRUE,
danielebarchiesi@0 850 'not null' => TRUE,
danielebarchiesi@0 851 'default' => 0,
danielebarchiesi@0 852 ));
danielebarchiesi@0 853 }
danielebarchiesi@0 854
danielebarchiesi@0 855 /**
danielebarchiesi@0 856 * Update email templates to use new tokens.
danielebarchiesi@0 857 *
danielebarchiesi@0 858 * This function upgrades customized email templates from the old !token format
danielebarchiesi@0 859 * to the new core tokens format. Additionally, in Drupal 7 we no longer e-mail
danielebarchiesi@0 860 * plain text passwords to users, and there is no token for a plain text
danielebarchiesi@0 861 * password in the new token system. Therefore, it also modifies any saved
danielebarchiesi@0 862 * templates using the old '!password' token such that the token is removed, and
danielebarchiesi@0 863 * displays a warning to users that they may need to go and modify the wording
danielebarchiesi@0 864 * of their templates.
danielebarchiesi@0 865 */
danielebarchiesi@0 866 function user_update_7017() {
danielebarchiesi@0 867 $message = '';
danielebarchiesi@0 868
danielebarchiesi@0 869 $tokens = array(
danielebarchiesi@0 870 '!site' => '[site:name]',
danielebarchiesi@0 871 '!username' => '[user:name]',
danielebarchiesi@0 872 '!mailto' => '[user:mail]',
danielebarchiesi@0 873 '!login_uri' => '[site:login-url]',
danielebarchiesi@0 874 '!uri_brief' => '[site:url-brief]',
danielebarchiesi@0 875 '!edit_uri' => '[user:edit-url]',
danielebarchiesi@0 876 '!login_url' => '[user:one-time-login-url]',
danielebarchiesi@0 877 '!uri' => '[site:url]',
danielebarchiesi@0 878 '!date' => '[date:medium]',
danielebarchiesi@0 879 '!password' => '',
danielebarchiesi@0 880 );
danielebarchiesi@0 881
danielebarchiesi@0 882 $result = db_select('variable', 'v')
danielebarchiesi@0 883 ->fields('v', array('name'))
danielebarchiesi@0 884 ->condition('name', db_like('user_mail_') . '%', 'LIKE')
danielebarchiesi@0 885 ->execute();
danielebarchiesi@0 886
danielebarchiesi@0 887 foreach ($result as $row) {
danielebarchiesi@0 888 // Use variable_get() to get the unserialized value for free.
danielebarchiesi@0 889 if ($value = variable_get($row->name, FALSE)) {
danielebarchiesi@0 890
danielebarchiesi@0 891 if (empty($message) && (strpos($value, '!password') !== FALSE)) {
danielebarchiesi@0 892 $message = t('The ability to send users their passwords in plain text has been removed in Drupal 7. Your existing email templates have been modified to remove it. You should <a href="@template-url">review these templates</a> to make sure they read properly.', array('@template-url' => url('admin/config/people/accounts')));
danielebarchiesi@0 893 }
danielebarchiesi@0 894
danielebarchiesi@0 895 variable_set($row->name, str_replace(array_keys($tokens), $tokens, $value));
danielebarchiesi@0 896 }
danielebarchiesi@0 897 }
danielebarchiesi@0 898
danielebarchiesi@0 899 return $message;
danielebarchiesi@0 900 }
danielebarchiesi@0 901
danielebarchiesi@0 902 /**
danielebarchiesi@0 903 * Ensure there is an index on {users}.picture.
danielebarchiesi@0 904 */
danielebarchiesi@0 905 function user_update_7018() {
danielebarchiesi@0 906 if (!db_index_exists('users', 'picture')) {
danielebarchiesi@0 907 db_add_index('users', 'picture', array('picture'));
danielebarchiesi@0 908 }
danielebarchiesi@0 909 }
danielebarchiesi@0 910
danielebarchiesi@0 911 /**
danielebarchiesi@0 912 * @} End of "addtogroup updates-7.x-extra".
danielebarchiesi@0 913 */