From 0056cf3abb76dfa24aafe266495f463bccd4ef88 Mon Sep 17 00:00:00 2001
From: Dries Buytaert <dries@buytaert.net>
Date: Tue, 18 Nov 2008 15:06:47 +0000
Subject: [PATCH] - Rollback of patch #334671 by Steve Dondley: still tests
 failing.

---
 modules/user/user.module | 29 +++++++++++++--
 modules/user/user.test   | 80 ----------------------------------------
 2 files changed, 26 insertions(+), 83 deletions(-)

diff --git a/modules/user/user.module b/modules/user/user.module
index 50bf43fdd4f2..f1a8593b7985 100644
--- a/modules/user/user.module
+++ b/modules/user/user.module
@@ -139,6 +139,9 @@ function user_external_login($account, $edit = array()) {
  *   An associative array of attributes to search for in selecting the
  *   user, such as user name or e-mail address.
  *
+ * @return
+ *   A fully-loaded $user object upon successful user load or FALSE if user
+ *   cannot be loaded.
  */
 function user_load($array = array()) {
   // Dynamically compose a SQL query:
@@ -209,7 +212,7 @@ function user_load($array = array()) {
  *   (optional) The category for storing profile information in.
  *
  * @return
- *   A fully-loaded $user object.
+ *   A fully-loaded $user object upon successful save or FALSE if the save failed.
  */
 function user_save($account, $edit = array(), $category = 'account') {
   $table = drupal_get_schema('users');
@@ -253,7 +256,11 @@ function user_save($account, $edit = array(), $category = 'account') {
     $edit['data'] = $data;
     $edit['uid'] = $account->uid;
     // Save changes to the users table.
-    drupal_write_record('users', $edit, 'uid');
+    $success = drupal_write_record('users', $edit, 'uid');
+    if (!$success) {
+      // The query failed - better to abort the save than risk further data loss.
+      return FALSE;
+    }
 
     // Reload user roles if provided.
     if (isset($edit['roles']) && is_array($edit['roles'])) {
@@ -301,7 +308,12 @@ function user_save($account, $edit = array(), $category = 'account') {
       $edit['access'] = REQUEST_TIME;
     }
 
-    drupal_write_record('users', $edit);
+    $success = drupal_write_record('users', $edit);
+    if (!$success) {
+      // On a failed INSERT some other existing user's uid may be returned.
+      // We must abort to avoid overwriting their account.
+      return FALSE;
+    }
 
     // Build the initial user object.
     $user = user_load(array('uid' => $edit['uid']));
@@ -1401,6 +1413,11 @@ function user_external_login_register($name, $module) {
       'access' => REQUEST_TIME
     );
     $account = user_save('', $userinfo);
+    // Terminate if an error occured during user_save().
+    if (!$account) {
+      drupal_set_message(t("Error saving user account."), 'error');
+      return;
+    }
     user_set_authmaps($account, array("authname_$module" => $name));
     $user = $account;
     watchdog('user', 'New external user: %name using module %module.', array('%name' => $name, '%module' => $module), WATCHDOG_NOTICE, l(t('edit'), 'user/' . $user->uid . '/edit'));
@@ -2270,6 +2287,12 @@ function user_register_submit($form, &$form_state) {
     $merge_data['status'] = variable_get('user_register', 1) == 1;
   }
   $account = user_save('', array_merge($form_state['values'], $merge_data));
+  // Terminate if an error occured during user_save().
+  if (!$account) {
+    drupal_set_message(t("Error saving user account."), 'error');
+    $form_state['redirect'] = '';
+    return;
+  }
   $form_state['user'] = $account;
 
   watchdog('user', 'New user: %name (%email).', array('%name' => $name, '%email' => $mail), WATCHDOG_NOTICE, l(t('edit'), 'user/' . $account->uid . '/edit'));
diff --git a/modules/user/user.test b/modules/user/user.test
index 82f1ca66e1fc..91e1df32edce 100644
--- a/modules/user/user.test
+++ b/modules/user/user.test
@@ -570,83 +570,3 @@ class UserAutocompleteTestCase extends DrupalWebTestCase {
     $this->assertRaw($this->unprivileged_user->name, t('User name found in autocompletion results.'));
   }
 }
-
-/**
- * Test user roles.
- */
-class RoleAdministrationTestCase extends DrupalWebTestCase {
-
-  /**
-   * Implementation of getInfo().
-   */
-  function getInfo() {
-    return array(
-      'name' => t('Role administration'),
-      'description' => t('Tests addition and deletion of roles and whether users can be assigned and removed from roles.'),
-      'group' => t('User')
-    );
-  }
-
-  /**
-   * Implementation of setUp().
-   */
-  function setUp() {
-    parent::setUp();
-    $this->admin_user = $this->drupalCreateUser(array('administer users', 'administer permissions'));
-    $this->drupalLogin($this->admin_user);
-  }
-
-  /**
-   * Add a role to the site.
-   */
-  function testAddRole() {
-    $edit['name'] = 'test_role';
-    $this->drupalPost('admin/user/roles', $edit, t('Add role'));
-    $this->assertText(t('The role has been added.'), t('New role submitted through form.'));
-
-    $result = db_query('SELECT rid FROM {role} WHERE name = "test_role"');
-    $this->assertTrue($result->fetch(), 'New role added to database.');
-  }
-
-  /**
-   * Delete a role from the site.
-   */
-  function testDeleteRole() {
-    // Determine largest rid
-    $rid = db_query('SELECT max(rid) FROM {role}')->fetchField();
-
-    $this->drupalPost('admin/user/roles/edit/' . $rid, array(), t('Delete role'));
-    $this->assertText(t('The role has been deleted.'), t('Role deleted through form.'));
-    $result = db_query('SELECT rid FROM {role} WHERE rid = :rid', array(':rid' => $rid));
-    $this->assertFalse($result->fetch(), 'Role deleted from database.');
-  }
-
-  /**
-   * Adds a user to an existing role and removes them from the role.
-   */
-  function testAddAndRemoveUserFromRole() {
-    // Add a user to an existing role
-    $regular_user = $this->drupalCreateUser(array());
-    $rid = db_query('SELECT max(rid) FROM {role}')->fetchField();
-    $uid = $regular_user->uid;
-    $edit['roles[' . $rid . ']'] = $rid;
-    $this->drupalPost("user/$uid/edit", $edit, t('Save'));
-    $this->assertText(t('The changes have been saved.'), t('User added to role through form.'));
-    $result = db_query('SELECT * FROM {users_roles} WHERE uid = :uid AND rid = :rid',
-        array(':uid' => $uid,
-              ':rid' => $rid)
-    );  
-    $this->assertTrue($result->fetch(), 'Assigned user to a role');
-
-    // Remove a user from an existing role
-    $edit['roles[' . $rid . ']'] = FALSE;
-    $this->drupalPost("user/$uid/edit", $edit, t('Save'));
-    $this->assertText(t('The changes have been saved.'), t('User removed from role through form.'));
-    $result = db_query('SELECT * FROM {users_roles} WHERE uid = :uid AND rid = :rid',
-        array(':uid' => $uid,
-              ':rid' => $rid)
-    );  
-    $this->assertFalse($result->fetch(), 'Removed user from a role');
-  }
-    
-}
-- 
GitLab