? 690610-112.patch ? p.patch Index: content_access.admin.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/content_access/Attic/content_access.admin.inc,v retrieving revision 1.1.2.24 diff -u -p -r1.1.2.24 content_access.admin.inc --- content_access.admin.inc 19 Jul 2010 11:40:11 -0000 1.1.2.24 +++ content_access.admin.inc 29 Jan 2011 19:06:12 -0000 @@ -13,14 +13,14 @@ define('CONTENT_ACCESS_MASS_UPDATE_THRES /** * Per node settings page. */ -function content_access_page(&$form_state, $node) { - drupal_set_title(t('Access control for %title', array('%title' => $node->title))); +function content_access_page($form, &$form_state, $node) { + drupal_set_title(t('Access control for @title', array('@title' => $node->title))); foreach (_content_access_get_operations() as $op) { $defaults[$op] = content_access_per_node_setting($op, $node); } - $form = content_access_role_based_form($defaults); + $form = content_access_role_based_form($form, $defaults); // Add a after_build handler that disables checkboxes, which are enforced by permissions. $form['per_role']['#after_build'] = array('content_access_force_permissions'); @@ -35,9 +35,9 @@ function content_access_page(&$form_stat ); foreach (array('view', 'update', 'delete') as $op) { $acl_id = content_access_get_acl_id($node, $op); - acl_node_add_acl($node->nid, $acl_id, $op == 'view', $op == 'update', $op == 'delete', content_access_get_settings('priority', $node->type)); - $form['acl'][$op] = acl_edit_form($acl_id, t('Grant !op access', array('!op' => $op))); - $form['acl'][$op]['#collapsed'] = !isset($_POST['acl_'. $acl_id]) && !unserialize($form['acl'][$op]['user_list']['#default_value']); + acl_node_add_acl($node->nid, $acl_id, (int) ($op == 'view'), (int) ($op == 'update'), (int) ($op == 'delete'), content_access_get_settings('priority', $node->type)); + $form['acl'][$op] = acl_edit_form($form_state, $acl_id, t('Grant !op access', array('!op' => $op))); + $form['acl'][$op]['#collapsed'] = !isset($_POST['acl_' . $acl_id]) && !unserialize($form['acl'][$op]['user_list']['#default_value']); } } @@ -70,6 +70,7 @@ function content_access_page_submit($for // Set the settings so that further calls will return this settings. $settings[$op] = array_keys(array_filter($form_state['values'][$op])); } + // Save per-node settings. content_access_save_per_node_settings($node, $settings); @@ -94,9 +95,11 @@ function content_access_page_reset($form } /** - * Per content type administration page form. + * Per content type settings form. */ -function content_access_admin_settings(&$form_state, $type) { +function content_access_admin_settings($form, $form_state, $content_type) { + $type = $content_type->type; + $form_state['type'] = $type; // Add role based per content type settings @@ -104,14 +107,14 @@ function content_access_admin_settings(& foreach (_content_access_get_operations() as $op) { $defaults[$op] = content_access_get_settings($op, $type); } - $form = content_access_role_based_form($defaults); + $form = content_access_role_based_form($form, $defaults); // Per node: $form['node'] = array( '#type' => 'fieldset', '#title' => t('Per content node access control settings'), '#collapsible' => TRUE, - '#description' => t('Optionally you can enable per content node access control settings. If enabled, a new tab for the content access settings appears when viewing content. You have to configure permission to access these settings at the !permissions page.', array('!permissions' => l(t('permissions'), 'admin/user/permissions'))), + '#description' => t('Optionally you can enable per content node access control settings. If enabled, a new tab for the content access settings appears when viewing content. You have to configure permission to access these settings at the !permissions page.', array('!permissions' => l(t('permissions'), 'admin/people/permissions'))), ); $form['node']['per_node'] = array( '#type' => 'checkbox', @@ -136,20 +139,41 @@ function content_access_admin_settings(& '#value' => t('Submit'), '#weight' => 10, ); + return $form; } +/** + * Submit handler for per content type settings form. + */ function content_access_admin_settings_submit($form, &$form_state) { - // Where possible let the drupal permissions system handle access control. - $permissions = content_access_get_permissions_by_role(); + $roles_permissions = user_role_permissions(user_roles()); + $permissions = user_permission_get_modules(); + + // Remove disabled modules permissions, so they can't raise exception + // in content_access_save_permissions() + foreach ($roles_permissions as $rid => $role_permissions) { + foreach ($role_permissions as $permission => $value) { + if (!array_key_exists($permission, $permissions)) { + unset($roles_permissions[$rid][$permission]); + } + } + } + foreach (array('update', 'update_own', 'delete', 'delete_own') as $op) { foreach ($form_state['values'][$op] as $rid => $value) { - $permissions[$rid][ content_access_get_permission_by_op($op, $form_state['type']) ] = $value; + $permission = content_access_get_permission_by_op($op, $form_state['type']); + if ($value) { + $roles_permissions[$rid][$permission] = TRUE; + } + else { + $roles_permissions[$rid][$permission] = FALSE; + } } // Don't save the setting, so its default value (get permission) is applied always. unset($form_state['values'][$op]); } - content_access_save_permissions($permissions); + content_access_save_permissions($roles_permissions); // Update content access settings $settings = content_access_get_settings(); @@ -176,7 +200,7 @@ function content_access_admin_settings_s } if (content_access_mass_update(array($type))) { - drupal_set_message(t('Permissions have been successfully rebuilt for the content type @types.', array('@types' => node_get_types('name', $type)))); + drupal_set_message(t('Permissions have been successfully rebuilt for the content type @types.', array('@types' => node_type_get_name($type)))); } } @@ -191,13 +215,18 @@ function content_access_admin_settings_s * Whether the operation has been processed successfully (TRUE) or postponed (FALSE). */ function content_access_mass_update($types) { - $count = db_result(db_query("SELECT COUNT(DISTINCT nid) FROM {node} WHERE type IN (". db_placeholders($types, 'text') .")", $types)); + $q = db_select('node', 'n') + ->fields('n', array('nid')) + ->condition('n.type', $types, 'IN'); + + $count = $q->countQuery()->execute()->fetchField(); + node_access_needs_rebuild(TRUE); // If there not too much nodes affected, try to do it. if ($count <= CONTENT_ACCESS_MASS_UPDATE_THRESHOLD) { - $result = db_query("SELECT nid FROM {node} WHERE type IN (". db_placeholders($types, 'text') .")", $types); - while ($node = db_fetch_object($result)) { + $records = $q->execute(); + foreach ($records as $node) { node_access_acquire_grants(node_load($node->nid)); } @@ -209,30 +238,12 @@ function content_access_mass_update($typ } /** - * Gets the permissions for the role of the given id. - */ -function content_access_get_permissions_by_role() { - $result = db_query('SELECT r.rid, p.perm FROM {role} r LEFT JOIN {permission} p ON r.rid = p.rid'); - $permissions = array(); - while ($role = db_fetch_object($result)) { - $permissions[$role->rid] = array_filter(drupal_map_assoc(explode(', ', $role->perm))); - } - return $permissions; -} - -/** * Saves the given permissions by role to the database. */ -function content_access_save_permissions($permissions) { - foreach ($permissions as $rid => $perms) { - $perms = array_filter($perms); - db_query('DELETE FROM {permission} WHERE rid = %d', $rid); - if (count($perms)) { - db_query("INSERT INTO {permission} (rid, perm) VALUES (%d, '%s')", $rid, implode(', ', array_keys($perms))); - } +function content_access_save_permissions($roles_permissions) { + foreach ($roles_permissions as $rid => $permissions) { + user_role_change_permissions($rid, $permissions); } - // Make sure new permissions are applied immediately. - content_access_get_permission_access(FALSE, TRUE); } /** @@ -241,8 +252,7 @@ function content_access_save_permissions * @param $defaults * Array of defaults for all operations. */ -function content_access_role_based_form($defaults = array()) { - +function content_access_role_based_form($form, $defaults = array()) { // Make sure defaults are set properly foreach (_content_access_get_operations() as $op) { $defaults += array($op => array()); @@ -254,8 +264,8 @@ function content_access_role_based_form( '#type' => 'fieldset', '#title' => t('Role based access control settings'), '#collapsible' => TRUE, - '#description' => t('Note that users need at least the %access_content permission to be able to deal in any way with content.', array('%access_content' => t('access content'))). - ' '. t('Furthermore note that content which is not @published is treated in a different way by drupal: It can be viewed only by its author or users with the %administer_nodes permission.', array('@published' => t('published'), '%administer_nodes' => t('administer nodes'))), + '#description' => t('Note that users need at least the %access_content permission to be able to deal in any way with content.', array('%access_content' => t('access content'))) . + ' ' . t('Furthermore note that content which is not @published is treated in a different way by drupal: It can be viewed only by its author or users with the %administer_nodes permission.', array('@published' => t('published'), '%administer_nodes' => t('administer nodes'))), ); drupal_add_css(drupal_get_path('module', 'content_access') . '/content_access.css'); $form['per_role']['view'] = array('#type' => 'checkboxes', @@ -264,7 +274,7 @@ function content_access_role_based_form( '#options' => $roles, '#title' => t('View any content'), '#default_value' => $defaults['view'], - '#process' => array('expand_checkboxes', 'content_access_disable_checkboxes'), + '#process' => array('form_process_checkboxes', 'content_access_disable_checkboxes'), ); $form['per_role']['update'] = array('#type' => 'checkboxes', '#prefix' => '