=== modified file 'sites/all/modules/role_delegation/role_delegation.module'
--- sites/all/modules/role_delegation/role_delegation.module	2009-09-14 09:46:34 +0000
+++ sites/all/modules/role_delegation/role_delegation.module	2009-10-10 20:41:31 +0000
@@ -230,3 +230,58 @@
   }
   $edit['roles'] = $edit['roles_preserve'] + array_filter($edit['roles_assign']);
 }
+
+/**
+ * Implementation of hook_user_operations().
+ */
+function role_delegation_user_operations($form_state = array())
+{
+  // Users with 'administer permissions' permission can already do everything
+  if (user_access('administer permissions')) {
+    return;
+  }
+
+  // Provide operations to add/remove roles for which this user has been delegated permission
+  $roles = _role_delegation_roles();
+  $add_roles = array();
+  $remove_roles = array();
+  foreach ($roles as $rid => $role) {
+    if (user_access('assign all roles') || user_access(_role_delegation_make_perm($role))) {
+      $add_roles['add_role-' . $rid] = $role;
+      $remove_roles['remove_role-' . $rid] = $role;
+    }
+  }
+  if (!count($add_roles)) {
+    return;
+  }
+  $operations = array(
+    t('Add a role to the selected users') => array(
+      'label' => $add_roles,
+    ),
+    t('Remove a role from the selected users') => array(
+      'label' => $remove_roles,
+    ),
+  );
+
+  // If the form has been posted, we need to 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 == 'add_role' || $operation == 'remove_role') {
+      $rid = $operation_rid[1];
+      if ($add_roles['add_role-' . $rid]) {
+        $operations[$form_state['values']['operation']] = array(
+          'callback' => 'user_multiple_role_edit',
+          'callback arguments' => array($operation, $rid),
+        );
+      }
+      else {
+        watchdog('security', 'Detected malicious attempt to alter protected user fields.', array(), WATCHDOG_WARNING);
+        return;
+      }
+    }
+  }
+
+  return $operations;
+}

