diff --git a/core/modules/field_ui/field_ui.install b/core/modules/field_ui/field_ui.install index cccc30a..f0ad035 100644 --- a/core/modules/field_ui/field_ui.install +++ b/core/modules/field_ui/field_ui.install @@ -9,6 +9,7 @@ * Upgrade Field UI permissions. */ function field_ui_update_8001() { + $permissions = array( 'administer comments' => array( 'administer comment fields', @@ -28,26 +29,22 @@ function field_ui_update_8001() { ), ); - // There's no guarantee hook_permission() will be available for all - // modules, so get the current known permissions to make sure this - // update doesn't crash. - $modules = user_permission_get_modules(); - - $all_roles_permissions = user_role_permissions(user_roles()); - foreach ($all_roles_permissions as $role_id => $role_permissions) { - $new_permissions = array(); - foreach ($permissions as $entity_permission => $field_ui_permissions) { - if (isset($role_permissions[$entity_permission])) { - if (isset($modules[$field_ui_permissions[0]])) { - $new_permissions[] = $field_ui_permissions[0]; - } - if (isset($modules[$field_ui_permissions[1]])) { - $new_permissions[] = $field_ui_permissions[1]; - } + // We can not call user_permission_get_modules() as that will start + // invoking hooks which we can't during update hooks. Directly query + // for the permissions and insert them into the database. + foreach ($permissions as $old_permission => $new_permissions) { + $results = db_query("SELECT rid FROM {role_permission} WHERE permission = :permission", array(':permission' => $old_permission)); + foreach ($results as $record) { + $query = db_insert('role_permission')->fields(array('rid', 'permission', 'module')); + foreach ($new_permissions as $new_permission) { + $query->values(array($record->rid, $new_permission, 'field_ui')); } + $query->execute(); } - if (!empty($new_permissions)) { - user_role_grant_permissions($role_id, $new_permissions); - } + + // Remove old permission. + db_delete('role_permission') + ->condition('permission', $old_permission) + ->execute(); } } diff --git a/core/modules/system/lib/Drupal/system/Tests/Upgrade/FieldUIUpgradePathTest.php b/core/modules/system/lib/Drupal/system/Tests/Upgrade/FieldUIUpgradePathTest.php index cd800af..3ec88b3 100644 --- a/core/modules/system/lib/Drupal/system/Tests/Upgrade/FieldUIUpgradePathTest.php +++ b/core/modules/system/lib/Drupal/system/Tests/Upgrade/FieldUIUpgradePathTest.php @@ -64,12 +64,12 @@ function testFieldUIPermissions() { ); $role_permissions = user_role_permissions(array($this->normal_role_id => $this->normal_role_name, $this->admin_role_id => $this->admin_role_name)); - foreach ($permissions as $entity_permission => $field_ui_permissions) { - $this->assertFalse(isset($role_permissions[$this->normal_role_id][$entity_permission]), format_string('%role_name does not have the %permission permission', array('%role_name' => $this->normal_role_name, '%permission' => $entity_permission))); - $this->assertTrue(isset($role_permissions[$this->admin_role_id][$entity_permission]), format_string('%role_name has the %permission permission', array('%role_name' => $this->admin_role_name, '%permission' => $entity_permission))); - foreach ($field_ui_permissions as $field_ui_permission) { - $this->assertFalse(isset($role_permissions[$this->normal_role_id][$field_ui_permission]), format_string('%role_name does not have the %permission permission', array('%role_name' => $this->normal_role_name, '%permission' => $field_ui_permission))); - $this->assertTrue(isset($role_permissions[$this->admin_role_id][$field_ui_permission]), format_string('%role_name has the %permission permission', array('%role_name' => $this->admin_role_name, '%permission' => $field_ui_permission))); + foreach ($permissions as $old_permission => $new_permissions) { + $this->assertFalse(isset($role_permissions[$this->normal_role_id][$old_permission]), format_string('%role_name does not have the old %permission permission', array('%role_name' => $this->normal_role_name, '%permission' => $old_permission))); + $this->assertFalse(isset($role_permissions[$this->admin_role_id][$old_permission]), format_string('%role_name does not have the old %permission permission', array('%role_name' => $this->admin_role_name, '%permission' => $old_permission))); + foreach ($new_permissions as $new_permission) { + $this->assertFalse(isset($role_permissions[$this->normal_role_id][$new_permission]), format_string('%role_name does not have the new %permission permission', array('%role_name' => $this->normal_role_name, '%permission' => $new_permission))); + $this->assertTrue(isset($role_permissions[$this->admin_role_id][$new_permission]), format_string('%role_name has the new %permission permission', array('%role_name' => $this->admin_role_name, '%permission' => $new_permission))); } } }