Index: role_delegation.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/role_delegation/role_delegation.module,v
retrieving revision 1.18
diff -u -r1.18 role_delegation.module
--- role_delegation.module	12 Jan 2010 20:40:44 -0000	1.18
+++ role_delegation.module	10 Nov 2010 10:01:11 -0000
@@ -206,6 +206,87 @@
 }
 
 /**
+ * Implements hook_user_operations().
+ */
+function role_delegation_user_operations($form = array(), $form_state = array()) {
+  // Only provide role add/remove operations when user can't assign permissions
+  // without Role Delegation.
+  if (user_access('administer permissions')) {
+    return;
+  }
+
+  // Provide add/remove operations for delegated roles.
+  $roles = _role_delegation_roles();
+  $add_roles = array();
+  $remove_roles = array();
+  foreach ($roles as $rid => $role) {
+    if (user_access('assign all roles') || user_access("assign $role role")) {
+      $add_roles['role_delegation_add_role-' . $rid]['label'] = t('Add role: !role', array('!role' => $role));
+      $remove_roles['role_delegation_remove_role-' . $rid]['label'] = t('Remove role: !role', array('!role' => $role));
+    }
+  }
+  $operations = $add_roles + $remove_roles;
+  if (!count($operations)) {
+    return;
+  }
+
+  // If the form has been posted, insert the proper data for role editing if necessary.
+  if (!empty($form_state['submitted'])) {
+    $operation_rid = explode('-', $form_state['values']['operation']);
+    $operation = $operation_rid[0];
+    if ($operation == 'role_delegation_add_role' || $operation == 'role_delegation_remove_role') {
+      $rid = $operation_rid[1];
+      if ($operations[$form_state['values']['operation']]) {
+        $operations[$form_state['values']['operation']] += array(
+          // use the standard add_role and remove_role operations:
+          'callback' => 'user_multiple_role_edit',
+          'callback arguments' => array(str_replace('role_delegation_', '', $operation), $rid),
+        );
+      }
+      else {
+        watchdog('security', 'Detected malicious attempt to alter protected user fields.', array(), WATCHDOG_WARNING);
+        return;
+      }
+    }
+  }
+
+  return $operations;
+}
+
+/**
+ * Implements hook_form_user_admin_account_alter().
+ * In the user bulk update form, separate out the role delegation operations
+ * and group and relabel them under 'Add a role' and 'Remove a role' optgroups.
+ */
+function role_delegation_form_user_admin_account_alter(&$form, $form_state, $form_id) {
+  $options = $form['options']['operation']['#options'];
+  $roles = _role_delegation_roles();
+  $add_roles = array();
+  $remove_roles = array();
+  foreach ($options as $option => $label) {
+    $operation_rid = explode('-', $option);
+    $operation = $operation_rid[0];
+    if ($operation == 'role_delegation_add_role') {
+      $rid = $operation_rid[1];
+      $add_roles[$option] = $roles[$rid];
+      unset($options[$option]);
+    }
+    elseif ($operation == 'role_delegation_remove_role') {
+      $rid = $operation_rid[1];
+      $remove_roles[$option] = $roles[$rid];
+      unset($options[$option]);
+    }
+  }
+  if (count($add_roles)) {
+    $form['options']['operation']['#options'] = $options + array(
+      t('Add a role to the selected users') => $add_roles,
+      t('Remove a role from the selected users') => $remove_roles,
+    );
+  }
+}
+
+
+/**
  * Implements hook_action_info().
  */
 function role_delegation_action_info() {
