Index: modules/user/user.install =================================================================== RCS file: /cvs/drupal/drupal/modules/user/user.install,v retrieving revision 1.37 diff -u -p -r1.37 user.install --- modules/user/user.install 27 Jan 2010 18:56:19 -0000 1.37 +++ modules/user/user.install 3 Feb 2010 22:14:40 -0000 @@ -65,6 +65,13 @@ function user_schema() { 'default' => '', 'description' => 'A single permission granted to the role identified by rid.', ), + 'module' => array( + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '', + 'description' => "The module declaring the permission.", + ), ), 'primary key' => array('rid', 'permission'), 'indexes' => array( @@ -490,3 +497,28 @@ function user_update_7005(&$sandbox) { * The next series of updates should start at 8000. */ +/** + * Add module data to {role_permission}. + */ +function user_update_7006(&$sandbox) { + $module_field = array( + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '', + 'description' => "The module declaring the permission.", + ); + // Check that the field hasn't been updated in an aborted run of this + // update. + if (!db_column_exists('role_permission', 'module')) { + // Add a new field for the fid. + db_add_field('role_permission', 'module', $module_field); + } + $permissions = user_permissions_get_modules(); + foreach ($permissions as $key => $value) { + db_update('role_permission') + ->fields(array('module' => $value)) + ->condition('permission', $key) + ->execute(); + } +} Index: modules/user/user.module =================================================================== RCS file: /cvs/drupal/drupal/modules/user/user.module,v retrieving revision 1.1116 diff -u -p -r1.1116 user.module --- modules/user/user.module 30 Jan 2010 07:59:26 -0000 1.1116 +++ modules/user/user.module 3 Feb 2010 22:14:45 -0000 @@ -2534,6 +2534,23 @@ function user_role_delete($role) { } /** + * Determine the modules that permissions belong to. + * + * @return + * An associative array in the format $permission => $module. + */ +function user_permission_get_modules() { + $permissions = array(); + foreach (module_implements('permission') as $module) { + $perms = module_invoke($module, 'permission'); + foreach ($perms as $key => $value) { + $permissions[$key] = $module; + } + } + return $permissions; +} + +/** * Change permissions for a user role. * * This function may be used to grant and revoke multiple permissions at once. @@ -2583,12 +2600,14 @@ function user_role_change_permissions($r * @see user_role_revoke_permissions() */ function user_role_grant_permissions($rid, array $permissions = array()) { + $modules = user_permission_get_modules(); // Grant new permissions for the role. foreach ($permissions as $name) { db_merge('role_permission') ->key(array( 'rid' => $rid, 'permission' => $name, + 'module' => $modules[$name], )) ->execute(); } @@ -3332,17 +3351,9 @@ function user_modules_installed($modules * Implements hook_modules_uninstalled(). */ function user_modules_uninstalled($modules) { - $permissions = array(); - foreach ($modules as $module) { - if (function_exists($module . '_permission')) { - $permissions = array_merge($permissions, array_keys(module_invoke($module, 'permission'))); - } - } - if (!empty($permissions)) { - db_delete('role_permission') - ->condition('permission', $permissions, 'IN') - ->execute(); - } + db_delete('role_permission') + ->condition('module', $modules, 'IN') + ->execute(); } /**