Index: modules/node/node.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.admin.inc,v
retrieving revision 1.27
diff -u -p -r1.27 node.admin.inc
--- modules/node/node.admin.inc 12 Oct 2008 04:30:06 -0000 1.27
+++ modules/node/node.admin.inc 14 Oct 2008 04:28:33 -0000
@@ -437,30 +437,40 @@ function _node_mass_update_batch_finishe
/**
* Menu callback: content administration.
+ *
+ * @param $for_user
+ * TRUE if building a list of nodes owned by the current user.
*/
-function node_admin_content($form_state) {
+function node_admin_content($form_state, $for_user = FALSE) {
if (isset($form_state['values']['operation']) && $form_state['values']['operation'] == 'delete') {
return node_multiple_delete_confirm($form_state, array_filter($form_state['values']['nodes']));
}
$form = node_filter_form();
$form['#theme'] = 'node_filter_form';
- $form['admin'] = node_admin_nodes();
+ $form['admin'] = node_admin_nodes($for_user);
return $form;
}
/**
* Form builder: Builds the node administration overview.
+ *
+ * @param $for_user
+ * TRUE if building a list of nodes owned by the current user.
*/
-function node_admin_nodes() {
+function node_admin_nodes($for_user = FALSE) {
+ global $user;
+
// Enable language column if translation module is enabled
// or if we have any node with language.
$multilanguage = (module_exists('translation') || db_result(db_query("SELECT COUNT(*) FROM {node} WHERE language != ''")));
// Build the sortable table header.
$header = array();
- $header[] = theme('table_select_header_cell');
+ if (user_access('administer nodes')) {
+ $header[] = theme('table_select_header_cell');
+ }
$header[] = array('data' => t('Title'), 'field' => 'n.title');
$header[] = array('data' => t('Type'), 'field' => 'n.type');
$header[] = array('data' => t('Author'), 'field' => 'u.name');
@@ -479,6 +489,11 @@ function node_admin_nodes() {
// Build the query and load the nodes we want to display.
$filter = node_build_filter_query();
+ if ($for_user) {
+ $filter['where'] .= ' AND u.uid = %d';
+ $filter['args'][] = $user->uid;
+ }
+
$sort = tablesort_sql($header, '', 'n.changed DESC');
$result = pager_query(db_rewrite_sql('SELECT n.*, u.name FROM {node} n '. $filter['join'] .' INNER JOIN {users} u ON n.uid = u.uid '. $filter['where'] . $sort), 50, 0, NULL, $filter['args']);
@@ -488,6 +503,7 @@ function node_admin_nodes() {
'#title' => t('Update options'),
'#prefix' => '
',
'#suffix' => '
',
+ '#access' => user_access('administer nodes'),
);
$options = array();
foreach (module_invoke_all('node_operations') as $operation => $array) {
@@ -508,7 +524,9 @@ function node_admin_nodes() {
$destination = drupal_get_destination();
$nodes = array();
while ($node = db_fetch_object($result)) {
+ // First check the user's permissions for this node
$nodes[$node->nid] = '';
+
$options = empty($node->language) ? array() : array('language' => $languages[$node->language]);
$form['title'][$node->nid] = array('#markup' => l($node->title, 'node/' . $node->nid, $options) . ' ' . theme('mark', node_mark($node->nid, $node->changed)));
$form['name'][$node->nid] = array('#markup' => check_plain(node_get_types('name', $node)));
@@ -518,11 +536,12 @@ function node_admin_nodes() {
if ($multilanguage) {
$form['language'][$node->nid] = array('#markup' => empty($node->language) ? t('Language neutral') : t($languages[$node->language]->name));
}
- $form['operations'][$node->nid] = array('#markup' => l(t('edit'), 'node/' . $node->nid . '/edit', array('query' => $destination)));
+ $form['operations'][$node->nid] = array('#markup' => l(t('edit'), 'node/' . $node->nid . '/edit', array('query' => $destination)), '#access' => node_access('update', node_load($node->nid)));
}
$form['nodes'] = array(
'#type' => 'checkboxes',
'#options' => $nodes,
+ '#access' => user_access('administer nodes'),
);
$form['pager'] = array('#markup' => theme('pager', NULL, 50, 0));
$form['#theme'] = 'node_admin_nodes';
@@ -588,7 +607,10 @@ function theme_node_admin_nodes($form) {
$rows = array();
foreach (element_children($form['title']) as $key) {
$row = array();
- $row[] = drupal_render($form['nodes'][$key]);
+
+ if (user_access('administer nodes')) {
+ $row[] = drupal_render($form['nodes'][$key]);
+ }
$row[] = drupal_render($form['title'][$key]);
$row[] = drupal_render($form['name'][$key]);
$row[] = drupal_render($form['username'][$key]);
Index: modules/node/node.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.module,v
retrieving revision 1.988
diff -u -p -r1.988 node.module
--- modules/node/node.module 13 Oct 2008 00:33:03 -0000 1.988
+++ modules/node/node.module 14 Oct 2008 04:28:33 -0000
@@ -1515,14 +1515,22 @@ function node_menu() {
'title' => 'Content',
'description' => "View, edit, and delete your site's content.",
'page callback' => 'drupal_get_form',
- 'page arguments' => array('node_admin_content'),
- 'access arguments' => array('administer nodes'),
+ 'page arguments' => array('node_admin_content', TRUE),
+ 'access callback' => 'node_content_page_access',
);
- $items['admin/content/node/overview'] = array(
- 'title' => 'List',
+ $items['admin/content/node/user'] = array(
+ 'title' => 'My Content',
'type' => MENU_DEFAULT_LOCAL_TASK,
- 'weight' => -10,
+ );
+
+ $items['admin/content/node/all'] = array(
+ 'title' => 'All Content',
+ 'description' => "View, edit, and delete your site's content.",
+ 'page arguments' => array('node_admin_content'),
+ 'access callback' => 'node_content_page_access',
+ 'type' => MENU_LOCAL_TASK,
+ 'weight' => 5,
);
$items['admin/content/node-settings'] = array(
@@ -2149,6 +2157,32 @@ function node_access($op, $node, $accoun
}
/**
+ * Checks whether the current user has access to the content list page.
+ */
+function node_content_page_access() {
+ // If the user has no permission to access content, deny.
+ if (user_access('access content') == FALSE) {
+ return FALSE;
+ }
+
+ if (user_access('access administration pages') == FALSE) {
+ return FALSE;
+ }
+
+ $types = node_get_types('types');
+ foreach ($types as $type) {
+ $permissions = node_list_permissions(check_plain($type->type));
+ foreach (array_keys($permissions) as $permission) {
+ if (user_access($permission)) {
+ return TRUE;
+ }
+ }
+ }
+
+ return FALSE;
+}
+
+/**
* Generate an SQL join clause for use in fetching a node listing.
*
* @param $node_alias
Index: modules/node/node.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.test,v
retrieving revision 1.7
diff -u -p -r1.7 node.test
--- modules/node/node.test 11 Oct 2008 18:29:20 -0000 1.7
+++ modules/node/node.test 14 Oct 2008 04:28:33 -0000
@@ -460,3 +460,43 @@ class NodeTitleXSSTestCase extends Drupa
$this->assertNoRaw($xss, t('Harmful tags are escaped when editing a node.'));
}
}
+class ContentAdminPagesCase extends DrupalWebTestCase {
+ /**
+ * Implementation of getInfo().
+ */
+ function getInfo() {
+ return array(
+ 'name' => t('Content Admin Pages'),
+ 'description' => t('Create users and content to test the content admin pages functionality.'),
+ 'group' => t('Node'),
+ );
+ }
+
+ function testContentAdminPages() {
+ // Prepare an admin user to test admin functionality.
+ $admin_user = $this->drupalCreateUser(array('access administration pages', 'administer nodes'));
+ $this->drupalLogin($admin_user);
+
+ // Ensure the admin user can edit any content.
+ $created_node = $this->drupalCreateNode(array('type' => 'page'));
+ $this->drupalGet('admin/content/node/all');
+ $this->assertResponse(200);
+ $this->assertText('edit', t('Admin user has edit link.'));
+ $this->drupalLogout();
+
+ // Ensure users don't see edit links for content they don't have rights to edit.
+ $base_user = $this->drupalCreateUser(array('access administration pages', 'edit own page content', 'create page content'));
+ $this->drupalLogin($base_user);
+ $this->drupalGet('admin/content/node/all');
+ $this->assertResponse(200);
+ $this->assertText($created_node->title, t('Unprivileged users can content'));
+ $this->assertNoText('edit', t('Edit links do not show up for users without rights'));
+
+ // Ensure users content shows up on their 'My Content' page, and they have edit links.
+ $user_node = $this->drupalCreateNode(array('type' => 'page', 'uid' => $base_user->uid));
+ $this->drupalGet('admin/content/node/user');
+ $this->assertText($user_node->title, t('Users own content is displayed'));
+ $this->assertNoText($created_node->title, t('Nodes not belong to user are not displayed'));
+
+ }
+}
\ No newline at end of file