? node_module.patch
Index: modules/node/node.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.admin.inc,v
retrieving revision 1.24
diff -u -p -r1.24 node.admin.inc
--- modules/node/node.admin.inc	19 Jul 2008 19:04:24 -0000	1.24
+++ modules/node/node.admin.inc	2 Sep 2008 13:41:50 -0000
@@ -215,6 +215,7 @@ function node_filter_form() {
     '#type' => 'fieldset',
     '#title' => t('Show only items where'),
     '#theme' => 'node_filters',
+    '#access' => user_access('administer nodes'),
   );
   $form['#submit'][] = 'node_filter_form_submit';
   foreach ($session as $filter) {
@@ -468,6 +469,7 @@ function node_admin_nodes() {
     '#title' => t('Update options'),
     '#prefix' => '<div class="container-inline">',
     '#suffix' => '</div>',
+    '#access' => user_access('administer nodes'),
   );
   $options = array();
   foreach (module_invoke_all('node_operations') as $operation => $array) {
@@ -483,11 +485,16 @@ function node_admin_nodes() {
     '#value' => t('Update'),
     '#submit' => array('node_admin_nodes_submit'),
   );
-
+  
+  global $user;
   $languages = language_list();
   $destination = drupal_get_destination();
   $nodes = array();
   while ($node = db_fetch_object($result)) {
+    // First check the user's permissions for this node
+    $edit = node_access('update', node_load($node->nid));
+    if(!$edit && ($user->uid !== $node->uid)) continue;
+    
     $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)));
@@ -497,9 +504,9 @@ 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' => $edit);
   }
-  $form['nodes'] = array('#type' => 'checkboxes', '#options' => $nodes);
+  $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';
   return $form;
@@ -558,18 +565,27 @@ function theme_node_admin_nodes($form) {
   // the title form elements.
   $has_posts = isset($form['title']) && is_array($form['title']);
   $select_header = $has_posts ? theme('table_select_header_cell') : '';
-  $header = array($select_header, t('Title'), t('Type'), t('Author'), t('Status'));
+  
+  if($form['nodes']['#access']) {
+    $header[] = $select_header;
+  }
+  
+  $header[] = t('Title');
+  $header[] = t('Type');
+  $header[] = t('Author');
+  $header[] = t('Status');
+  
   if (isset($form['language'])) {
     $header[] = t('Language');
   }
   $header[] = t('Operations');
   $output = '';
-
+    
   $output .= drupal_render($form['options']);
   if ($has_posts) {
     foreach (element_children($form['title']) as $key) {
       $row = array();
-      $row[] = drupal_render($form['nodes'][$key]);
+      if($form['nodes']['#access']) $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.973
diff -u -p -r1.973 node.module
--- modules/node/node.module	31 Aug 2008 15:50:35 -0000	1.973
+++ modules/node/node.module	2 Sep 2008 13:41:53 -0000
@@ -1483,12 +1483,13 @@ function _node_add_access() {
  * Implementation of hook_menu().
  */
 function node_menu() {
-  $items['admin/content/node'] = array(
+  $items['content'] = array(
     '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'),
+    'access callback' => 'node_content_page_access',
+    'weight' => 8,
   );
 
   $items['admin/content/node/overview'] = array(
@@ -2059,7 +2060,7 @@ function node_search_validate($form, &$f
  */
 function node_access($op, $node, $account = NULL) {
   global $user;
-
+  
   if (!$node) {
     return FALSE;
   }
@@ -2124,6 +2125,22 @@ function node_access($op, $node, $accoun
 }
 
 /**
+ * Checks whether the current user has access to the content list page
+ */
+function node_content_page_access() {
+  // These permissions are skipped
+  $exclusions = array('access content', 'view revisions');
+  
+  // If the user has no permission to access content, return false right away
+  if(user_access('access content') == FALSE) return FALSE;
+  
+  foreach(array_keys(node_perm()) as $perm) {
+    if(user_access($perm) && !in_array($perm, $exclusions)) return TRUE;
+  }
+  return FALSE;
+}
+
+/**
  * Generate an SQL join clause for use in fetching a node listing.
  *
  * @param $node_alias
