

From: Damien Tournoud <damien@tournoud.net>


---
 node/node.module |   13 ++++++++-----
 user/user.module |   55 ++++++++++++++++++++++++++++++++++++++++++------------
 user/user.test   |    4 ++++
 3 files changed, 55 insertions(+), 17 deletions(-)

diff --git modules/node/node.module modules/node/node.module
index dd759bb..9b6f59e 100644
--- modules/node/node.module
+++ modules/node/node.module
@@ -510,11 +510,14 @@ function node_type_save($info) {
       ->fields($fields)
       ->condition('type', $existing_type)
       ->execute();
+    // Clear the node type cache.
+    drupal_static_reset('_node_types_build');
 
     if (!empty($type->old_type) && $type->old_type != $type->type) {
       field_attach_rename_bundle('node', $type->old_type, $type->type);
     }
     node_configure_fields($type);
+
     module_invoke_all('node_type_update', $type);
     $status = SAVED_UPDATED;
   }
@@ -523,16 +526,16 @@ function node_type_save($info) {
     db_insert('node_type')
       ->fields($fields)
       ->execute();
+    // Clear the node type cache.
+    drupal_static_reset('_node_types_build');
 
     field_attach_create_bundle('node', $type->type);
     node_configure_fields($type);
+
     module_invoke_all('node_type_insert', $type);
     $status = SAVED_NEW;
   }
 
-  // Clear the node type cache.
-  drupal_static_reset('_node_types_build');
-
   return $status;
 }
 
@@ -626,10 +629,11 @@ function node_type_delete($type) {
   db_delete('node_type')
     ->condition('type', $type)
     ->execute();
-  module_invoke_all('node_type_delete', $info);
 
   // Clear the node type cache.
   drupal_static_reset('_node_types_build');
+
+  module_invoke_all('node_type_delete', $info);
 }
 
 /**
@@ -2910,7 +2914,6 @@ function node_list_permissions($type) {
  *   An array of node types managed by this module.
  */
 function node_permissions_get_configured_types() {
-
   $configured_types = array();
 
   foreach (node_type_get_types() as $type => $info) {
diff --git modules/user/user.module modules/user/user.module
index 4cb5a7a..7220e92 100644
--- modules/user/user.module
+++ modules/user/user.module
@@ -3463,18 +3463,7 @@ function user_register_submit($form, &$form_state) {
  */
 function user_modules_installed($modules) {
   // Assign all available permissions to the administrator role.
-  $rid = variable_get('user_admin_role', 0);
-  if ($rid) {
-    $permissions = array();
-    foreach ($modules as $module) {
-      if ($module_permissions = module_invoke($module, 'permission')) {
-        $permissions = array_merge($permissions, array_keys($module_permissions));
-      }
-    }
-    if (!empty($permissions)) {
-      user_role_grant_permissions($rid, $permissions);
-    }
-  }
+  user_administrator_reset($modules);
 }
 
 /**
@@ -3544,3 +3533,45 @@ function user_rdf_mapping() {
     ),
   );
 }
+
+/**
+ * Reset the permissions for the administrator role.
+ *
+ * This function needs to be called any time the list of permissions is
+ * updated, such as when a module is enabled or when a node type is created.
+ *
+ * @param $modules
+ *   Optionally, a list of modules for which to grant permission for the
+ *   administrator role.
+ */
+function user_administrator_reset($modules = NULL) {
+  $rid = variable_get('user_admin_role', 0);
+  if ($rid) {
+    if (!$modules) {
+      $modules = module_list();
+    }
+    $permissions = array();
+    foreach ($modules as $module) {
+      if ($module_permissions = module_invoke($module, 'permission')) {
+        $permissions = array_merge($permissions, array_keys($module_permissions));
+      }
+    }
+    if (!empty($permissions)) {
+      user_role_grant_permissions($rid, $permissions);
+    }
+  }
+}
+
+/**
+ * Implements hook_node_type_insert().
+ */
+function user_node_type_insert($type) {
+  user_administrator_reset();
+}
+
+/**
+ * Implements hook_node_type_update().
+ */
+function user_node_type_update() {
+  user_administrator_reset();
+}
diff --git modules/user/user.test modules/user/user.test
index 30572cb..26e2255 100644
--- modules/user/user.test
+++ modules/user/user.test
@@ -1000,6 +1000,10 @@ class UserPermissionsTestCase extends DrupalWebTestCase {
     $edit['modules[Core][aggregator][enable]'] = TRUE;
     $this->drupalPost('admin/modules', $edit, t('Save configuration'));
     $this->assertTrue(user_access('administer news feeds', $this->admin_user), t('The permission was automatically assigned to the administrator role'));
+
+    $type = $this->drupalCreateContentType();
+    debug(user_role_permissions($this->admin_user->roles));
+    $this->assertTrue(user_access('delete any ' . $type->type . ' content', $this->admin_user), t('The permission was automatically assigned to the administrator role'));
   }
 
   /**
