Index: modules/user/user.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.admin.inc,v
retrieving revision 1.67
diff -u -p -r1.67 user.admin.inc
--- modules/user/user.admin.inc	11 Aug 2009 11:47:58 -0000	1.67
+++ modules/user/user.admin.inc	14 Aug 2009 07:21:34 -0000
@@ -6,24 +6,20 @@
  * Admin page callback file for the user module.
  */
 
-function user_admin($callback_arg = '') {
-  $op = isset($_POST['op']) ? $_POST['op'] : $callback_arg;
-
-  switch ($op) {
-    case t('Create new account'):
-    case 'create':
-      $build['user_register'] = drupal_get_form('user_register');
-      break;
-    default:
-      if (!empty($_POST['accounts']) && isset($_POST['operation']) && ($_POST['operation'] == 'cancel')) {
-        $build['user_multiple_cancel_confirm'] = drupal_get_form('user_multiple_cancel_confirm');
-      }
-      else {
-        $build['user_filter_form'] = drupal_get_form('user_filter_form');
-        $build['user_admin_account'] = drupal_get_form('user_admin_account');
-      }
+/**
+ * Form builder; Return user administration forms.
+ *
+ * @ingroup forms
+ */
+function user_admin_form(&$form_state) {
+  if (!empty($form_state['values']['accounts']) && isset($form_state['values']['operation']) && ($form_state['values']['operation'] == 'cancel')) {
+    return user_multiple_cancel_confirm($form_state);
+  }
+  else {
+    $form = user_filter_form();
+    $form['user_admin_account'] = user_admin_account();
+    return $form;
   }
-  return $build;
 }
 
 /**
@@ -42,6 +38,7 @@ function user_filter_form() {
     '#title' => t('Show only users where'),
     '#theme' => 'user_filters',
   );
+  $form['#submit'][] = 'user_filter_form_submit';
   foreach ($session as $filter) {
     list($type, $value) = $filter;
     // Merge an array of arrays into one if necessary.
@@ -82,8 +79,6 @@ function user_filter_form() {
     );
   }
 
-  drupal_add_js('misc/form.js');
-
   return $form;
 }
 
@@ -94,12 +89,14 @@ function user_filter_form_submit($form, 
   $op = $form_state['values']['op'];
   $filters = user_filters();
   switch ($op) {
-    case t('Filter'): case t('Refine'):
-      if (isset($form_state['values']['filter'])) {
+    case t('Filter'):
+    case t('Refine'):
+      if (!empty($form_state['values']['filter'])) {
         $filter = $form_state['values']['filter'];
-        // Merge an array of arrays into one if necessary.
-        $options = $filter == 'permission' ? call_user_func_array('array_merge', $filters[$filter]['options']) : $filters[$filter]['options'];
-        if (isset($options[$form_state['values'][$filter]])) {
+        // Flatten the options array to accommodate hierarchical/nested options.
+        $flat_options = form_options_flatten($filters[$filter]['options']);
+
+        if (isset($flat_options[$form_state['values'][$filter]])) {
           $_SESSION['user_overview_filter'][] = array($filter, $form_state['values'][$filter]);
         }
       }
@@ -113,9 +110,6 @@ function user_filter_form_submit($form, 
     case t('Update'):
       return;
   }
-
-  $form_state['redirect'] = 'admin/people';
-  return;
 }
 
 /**
@@ -153,6 +147,8 @@ function user_admin_account() {
     ->setCountQuery($count_query);
   $result = $query->execute();
 
+  $form['#theme'] = 'user_admin_account';
+
   $form['options'] = array(
     '#type' => 'fieldset',
     '#title' => t('Update options'),
@@ -171,6 +167,8 @@ function user_admin_account() {
   $form['options']['submit'] = array(
     '#type' => 'submit',
     '#value' => t('Update'),
+    '#submit' => array('user_admin_account_submit'),
+    '#validate' => array('user_admin_account_validate'),
   );
 
   $destination = drupal_get_destination();
@@ -221,6 +219,10 @@ function user_admin_account_submit($form
     call_user_func_array($function, $args);
 
     drupal_set_message(t('The update has been performed.'));
+  }  else {
+    // We need to rebuild the form to go to a second step. For example, to
+    // show the confirmation form for the deletion of nodes.
+    $form_state['rebuild'] = TRUE;
   }
 }
 
@@ -973,3 +975,83 @@ function user_modules_uninstalled($modul
       ->execute();
   }
 }
+
+/**
+ * Form builder; Mass-account cancellation form.
+ *
+ * @ingroup forms
+ * @see user_multiple_cancel_confirm_submit()
+ */
+function user_multiple_cancel_confirm(&$form_state) {
+  $edit = $form_state['input'];
+
+  $form['#submit'][] = 'user_multiple_cancel_confirm_submit';
+  $form['accounts'] = array('#prefix' => '<ul>', '#suffix' => '</ul>', '#tree' => TRUE);
+  // array_filter() returns only elements with TRUE values.
+  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();
+  // Remove method descriptions.
+  foreach (element_children($form['user_cancel_method']) as $element) {
+    unset($form['user_cancel_method'][$element]['#description']);
+  }
+
+  // Allow to send the account cancellation confirmation mail.
+  $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.'),
+  );
+  // Also allow to send account canceled notification mail, if enabled.
+  $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'));
+}
+
+/**
+ * Submit handler for mass-account cancellation form.
+ *
+ * @see user_multiple_cancel_confirm()
+ * @see user_cancel_confirm_form_submit()
+ */
+function user_multiple_cancel_confirm_submit($form, &$form_state) {
+  global $user;
+
+  if ($form_state['values']['confirm']) {
+    foreach ($form_state['values']['accounts'] as $uid => $value) {
+      // Prevent user administrators from deleting themselves without confirmation.
+      if ($uid == $user->uid) {
+        $admin_form_state = $form_state;
+        unset($admin_form_state['values']['user_cancel_confirm']);
+        $admin_form_state['values']['_account'] = $user;
+        drupal_function_exists('user_cancel_confirm_form_submit');
+        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;
+}
Index: modules/user/user.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.module,v
retrieving revision 1.1021
diff -u -p -r1.1021 user.module
--- modules/user/user.module	12 Aug 2009 12:36:05 -0000	1.1021
+++ modules/user/user.module	14 Aug 2009 07:21:36 -0000
@@ -1316,8 +1316,8 @@ function user_menu() {
   // User administration pages.
   $items['admin/people'] = array(
     'title' => 'People',
-    'page callback' => 'user_admin',
-    'page arguments' => array('list'),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('user_admin_form'),
     'access arguments' => array('administer users'),
     'weight' => -4,
   );
@@ -1328,7 +1328,8 @@ function user_menu() {
   );
   $items['admin/people/create'] = array(
     'title' => 'Add user',
-    'page arguments' => array('create'),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('user_register'),
     'access arguments' => array('administer users'),
     'type' => MENU_LOCAL_TASK,
   );
@@ -1400,8 +1401,8 @@ function user_menu() {
 
   $items['user/%user/edit'] = array(
     'title' => 'Edit',
-    'page callback' => 'user_edit',
-    'page 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,
@@ -1420,8 +1421,8 @@ function user_menu() {
         $items['user/%user_category/edit/' . $category['name']] = array(
           'title callback' => 'check_plain',
           'title arguments' => array($category['title']),
-          'page callback' => 'user_edit',
-          'page arguments' => array(1, 3),
+          '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,
@@ -2218,6 +2219,7 @@ function user_user_operations($form_stat
     ),
     'cancel' => array(
       'label' => t('Cancel the selected user accounts'),
+      'callback' => NULL,
     ),
   );
 
@@ -2330,78 +2332,6 @@ function user_multiple_role_edit($accoun
   }
 }
 
-function user_multiple_cancel_confirm(&$form_state) {
-  $edit = $form_state['input'];
-
-  $form['accounts'] = array('#prefix' => '<ul>', '#suffix' => '</ul>', '#tree' => TRUE);
-  // array_filter() returns only elements with TRUE values.
-  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();
-  // Remove method descriptions.
-  foreach (element_children($form['user_cancel_method']) as $element) {
-    unset($form['user_cancel_method'][$element]['#description']);
-  }
-
-  // Allow to send the account cancellation confirmation mail.
-  $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.'),
-  );
-  // Also allow to send account canceled notification mail, if enabled.
-  $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'));
-}
-
-/**
- * Submit handler for mass-account cancellation form.
- *
- * @see user_multiple_cancel_confirm()
- * @see user_cancel_confirm_form_submit()
- */
-function user_multiple_cancel_confirm_submit($form, &$form_state) {
-  global $user;
-
-  if ($form_state['values']['confirm']) {
-    foreach ($form_state['values']['accounts'] as $uid => $value) {
-      // Prevent user administrators from deleting themselves without confirmation.
-      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;
-}
-
 /**
  * Implement hook_help().
  */
Index: modules/user/user.pages.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.pages.inc,v
retrieving revision 1.48
diff -u -p -r1.48 user.pages.inc
--- modules/user/user.pages.inc	12 Aug 2009 12:36:05 -0000	1.48
+++ modules/user/user.pages.inc	14 Aug 2009 07:21:36 -0000
@@ -225,18 +225,6 @@ function template_preprocess_user_profil
 }
 
 /**
- * Form builder; Present the form to edit a given user or profile category.
- *
- * @ingroup forms
- * @see user_edit_validate()
- * @see user_edit_submit()
- */
-function user_edit($account, $category = 'account') {
-  drupal_set_title($account->name);
-  return drupal_get_form('user_profile_form', $account, $category);
-}
-
-/**
  * Form builder; edit a user account or one of their profile categories.
  *
  * @ingroup forms
@@ -247,6 +235,8 @@ function user_edit($account, $category =
 function user_profile_form($form_state, $account, $category = 'account') {
   global $user;
 
+  drupal_set_title($account->name);
+
   $edit = (empty($form_state['values'])) ? (array)$account : $form_state['values'];
 
   $form = _user_forms($edit, $account, $category);
@@ -262,7 +252,7 @@ function user_profile_form($form_state, 
       '#type' => 'submit',
       '#value' => t('Cancel account'),
       '#weight' => 31,
-      '#submit' => array('user_edit_cancel_submit'),
+      '#submit' => array('user_profile_form_cancel_submit'),
     );
   }
 
@@ -309,7 +299,7 @@ function user_profile_form_submit($form,
 /**
  * Submit function for the 'Cancel account' button on the user edit form.
  */
-function user_edit_cancel_submit($form, &$form_state) {
+function user_profile_form_cancel_submit($form, &$form_state) {
   $destination = '';
   if (isset($_REQUEST['destination'])) {
     $destination = drupal_get_destination();
@@ -323,7 +313,7 @@ function user_edit_cancel_submit($form, 
  * Form builder; confirm form for cancelling user account.
  *
  * @ingroup forms
- * @see user_edit_cancel_submit()
+ * @see user_profile_form_cancel_submit()
  */
 function user_cancel_confirm_form(&$form_state, $account) {
   global $user;
@@ -517,30 +507,6 @@ function user_cancel_confirm($account, $
   drupal_access_denied();
 }
 
-function user_edit_validate($form, &$form_state) {
-  user_module_invoke('validate', $form_state['values'], $form_state['values']['_account'], $form_state['values']['_category']);
-  // Validate input to ensure that non-privileged users can't alter protected data.
-  if ((!user_access('administer users') && array_intersect(array_keys($form_state['values']), array('uid', 'init', 'session'))) || (!user_access('administer permissions') && isset($form_state['values']['roles']))) {
-    watchdog('security', 'Detected malicious attempt to alter protected user fields.', array(), WATCHDOG_WARNING);
-    // set this to a value type field
-    form_set_error('category', t('Detected malicious attempt to alter protected user fields.'));
-  }
-}
-
-function user_edit_submit($form, &$form_state) {
-  $account = $form_state['values']['_account'];
-  $category = $form_state['values']['_category'];
-  unset($form_state['values']['_account'], $form_state['values']['op'], $form_state['values']['submit'], $form_state['values']['cancel'], $form_state['values']['form_token'], $form_state['values']['form_id'], $form_state['values']['_category'], $form_state['values']['form_build_id']);
-  user_module_invoke('submit', $form_state['values'], $account, $category);
-  user_save($account, $form_state['values'], $category);
-
-  // Clear the page cache because pages can contain usernames and/or profile information:
-  cache_clear_all();
-
-  drupal_set_message(t('The changes have been saved.'));
-  return;
-}
-
 /**
  * Access callback for path /user.
  *
