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 21:52:05 -0000 @@ -206,6 +206,84 @@ } /** + * 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 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') { + if (array_key_exists($form_state['values']['operation'], $operations)) { + $rid = $operation_rid[1]; + $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() {