From 7338cebe800788bb2cadf8515dc7134354df48cc Mon Sep 17 00:00:00 2001
From: Bradley M. Froehle <brad.froehle@gmail.com>
Date: Mon, 8 Nov 2010 13:29:33 -0800
Subject: [PATCH] 963656: node_access_view_all_nodes with new unit test

---
 modules/node/node.module                       |   10 ++++++
 modules/node/node.test                         |   41 ++++++++++++++++++++++++
 modules/node/tests/node_access_view_all.info   |    8 +++++
 modules/node/tests/node_access_view_all.module |   18 ++++++++++
 4 files changed, 77 insertions(+), 0 deletions(-)
 create mode 100644 modules/node/tests/node_access_view_all.info
 create mode 100644 modules/node/tests/node_access_view_all.module

diff --git modules/node/node.module modules/node/node.module
index 2097a91..75f3a13 100644
--- modules/node/node.module
+++ modules/node/node.module
@@ -3006,6 +3006,12 @@ function node_access_grants($op, $account = NULL) {
 
 /**
  * Determine whether the user has a global viewing grant for all nodes.
+ *
+ * By design, this function checks to see whether any module grants
+ * 'view' for node id 0. Node module provides this record if no node
+ * access modules are present. This function allows other modules to
+ * replicate this core behavior by providing their own conditional grant
+ * for nid 0.
  */
 function node_access_view_all_nodes() {
   $access = &drupal_static(__FUNCTION__);
@@ -3099,6 +3105,10 @@ function _node_query_node_access_alter($query, $base_table, $type) {
   if (!count(module_implements('node_grants'))) {
     return;
   }
+  // If viewing nodes, make sure access rules should be enforced.
+  if ($op == 'view' && node_access_view_all_nodes()) {
+    return;
+  }
 
   // Prevent duplicate records.
   $query->distinct();
diff --git modules/node/node.test modules/node/node.test
index 66d6bf7..671f2a9 100644
--- modules/node/node.test
+++ modules/node/node.test
@@ -921,6 +921,47 @@ class NodeAccessRecordsUnitTest extends DrupalWebTestCase {
 }
 
 /**
+ * Test case to verify node_access_view_all_nodes functionality.
+ */
+class NodeAccessViewAllNodesUnitTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Node access view all nodes',
+      'description' => 'Test node_access_view_all_nodes.',
+      'group' => 'Node',
+    );
+  }
+
+  function setUp() {
+    // Enable dummy module that implements hook_node_grants().
+    parent::setUp('node_access_view_all');
+  }
+
+  /**
+   * Create a node and test the creation of node access rules.
+   */
+  function testNodeAccessViewAllNodes() {
+    // Check that node_access_view_all_nodes() allows node access modules
+    // to override their own access rules on the 'view' operation.
+    node_access_rebuild();
+
+    drupal_static_reset('node_access_view_all_nodes');
+    $this->assertFalse(node_access_view_all_nodes(), t('Node access returned false for node_access_view_all_nodes().'));
+    $record = array(
+      'nid' => 0,
+      'gid' => 0,
+      'realm' => 'node_access_all',
+      'grant_view' => 1,
+      'grant_update' => 0,
+      'grant_delete' => 0,
+    );
+    drupal_write_record('node_access', $record);
+    drupal_static_reset('node_access_view_all_nodes');
+    $this->assertTrue(node_access_view_all_nodes(), t('Node access returned true for node_access_view_all_nodes().'));
+ }
+}
+
+/**
  * Test case to check node save related functionality, including import-save
  */
 class NodeSaveTestCase extends DrupalWebTestCase {
diff --git modules/node/tests/node_access_view_all.info modules/node/tests/node_access_view_all.info
new file mode 100644
index 0000000..896555c
--- /dev/null
+++ modules/node/tests/node_access_view_all.info
@@ -0,0 +1,8 @@
+; $Id$
+name = "Node module access view all"
+description = "Support module for node access view all testing."
+package = Testing
+version = VERSION
+core = 7.x
+files[] = node_access_view_all.module
+hidden = TRUE
diff --git modules/node/tests/node_access_view_all.module modules/node/tests/node_access_view_all.module
new file mode 100644
index 0000000..a7d3d9f
--- /dev/null
+++ modules/node/tests/node_access_view_all.module
@@ -0,0 +1,18 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Dummy module implementing node access related hooks to test API interaction
+ * with the Node module. This module adds a module which grants a view grant
+ * for all nodes (node id = 0).
+ */
+
+/**
+ * Implements hook_node_grants().
+ */
+function node_access_view_all_node_grants($account, $op) {
+  if ($op == 'view') {
+    return array('node_access_all' => array(0));
+  }
+}
-- 
1.7.0.4

