diff --git a/core/lib/Drupal/Core/Access/AccessManager.php b/core/lib/Drupal/Core/Access/AccessManager.php index 7c88963..b28f13c 100644 --- a/core/lib/Drupal/Core/Access/AccessManager.php +++ b/core/lib/Drupal/Core/Access/AccessManager.php @@ -127,11 +127,8 @@ public function check(Route $route, Request $request) { * Returns TRUE if the user has access to the route, else FALSE. */ protected function checkAnd(array $checks, Route $route, Request $request) { - $access = TRUE; - // If there are no checks return FALSE. - if (!$checks) { - return FALSE; - } + $access = FALSE; + foreach ($checks as $service_id) { if (empty($this->checks[$service_id])) { $this->loadCheck($service_id); @@ -141,6 +138,9 @@ protected function checkAnd(array $checks, Route $route, Request $request) { if ($service_access === FALSE) { return FALSE; } + if ($service_access === TRUE) { + $access = TRUE; + } } return $access; diff --git a/core/lib/Drupal/Core/Access/DefaultAccessCheck.php b/core/lib/Drupal/Core/Access/DefaultAccessCheck.php index 074dfd0..224e206 100644 --- a/core/lib/Drupal/Core/Access/DefaultAccessCheck.php +++ b/core/lib/Drupal/Core/Access/DefaultAccessCheck.php @@ -26,6 +26,14 @@ public function applies(Route $route) { * Implements AccessCheckInterface::access(). */ public function access(Route $route, Request $request) { - return $route->getRequirement('_access') === 'TRUE'; + if ($route->getRequirement('_access') === 'TRUE') { + return TRUE; + } + elseif ($route->getRequirement('_access') === 'FALSE') { + return FALSE; + } + else { + return NULL; + } } } diff --git a/core/modules/system/tests/modules/router_test/lib/Drupal/router_test/Access/DefinedTestAccessCheck.php b/core/modules/system/tests/modules/router_test/lib/Drupal/router_test/Access/DefinedTestAccessCheck.php index 744c836..77248dc 100644 --- a/core/modules/system/tests/modules/router_test/lib/Drupal/router_test/Access/DefinedTestAccessCheck.php +++ b/core/modules/system/tests/modules/router_test/lib/Drupal/router_test/Access/DefinedTestAccessCheck.php @@ -27,7 +27,7 @@ public function applies(Route $route) { * {@inheritdoc} */ public function access(Route $route, Request $request) { - return $route->getRequirement('_test_access') === 'TRUE'; + return $route->getRequirement('_test_access') === 'TRUE' ?: NULL; } } diff --git a/core/tests/Drupal/Tests/Core/Access/AccessManagerTest.php b/core/tests/Drupal/Tests/Core/Access/AccessManagerTest.php index 4cdcac2..1c90d33 100644 --- a/core/tests/Drupal/Tests/Core/Access/AccessManagerTest.php +++ b/core/tests/Drupal/Tests/Core/Access/AccessManagerTest.php @@ -44,6 +44,14 @@ class AccessManagerTest extends UnitTestCase { */ protected $accessManager; + public static function getInfo() { + return array( + 'name' => 'Access manager tests', + 'description' => 'Test for the AccessManager object.', + 'group' => 'Routing', + ); + } + /** * {@inheritdoc} */ @@ -145,6 +153,21 @@ public function testCheckConjunctions() { '_test_access' => 'TRUE', '_access_conjunction' => 'AND', ))); + $this->routeCollection->add('test_route_9', new Route('/test-route-9', array(), array( + '_access' => 'NULL', + '_test_access' => 'TRUE', + '_access_conjunction' => 'AND', + ))); + $this->routeCollection->add('test_route_10', new Route('/test-route-10', array(), array( + '_access' => 'NULL', + '_test_access' => 'TRUE', + '_access_conjunction' => 'OR', + ))); + $this->routeCollection->add('test_route_11', new Route('/test-route-11', array(), array( + '_access' => 'NULL', + '_test_access' => 'FALSE', + '_access_conjunction' => 'OR', + ))); $this->accessManager->setChecks($this->routeCollection); @@ -152,8 +175,11 @@ public function testCheckConjunctions() { $expected['test_route_4'] = TRUE; $expected['test_route_5'] = TRUE; $expected['test_route_6'] = TRUE; - $expected['test_route_7'] = TRUE; + $expected['test_route_7'] = FALSE; $expected['test_route_8'] = FALSE; + $expected['test_route_9'] = TRUE; + $expected['test_route_10'] = TRUE; + $expected['test_route_11'] = FALSE; foreach ($expected as $route_name => $expected_access) { $this->assertSame($this->accessManager->check($this->routeCollection->get($route_name), $request), $expected_access); diff --git a/core/tests/Drupal/Tests/Core/Access/DefaultAccessCheckTest.php b/core/tests/Drupal/Tests/Core/Access/DefaultAccessCheckTest.php index d96825c..bb96686 100644 --- a/core/tests/Drupal/Tests/Core/Access/DefaultAccessCheckTest.php +++ b/core/tests/Drupal/Tests/Core/Access/DefaultAccessCheckTest.php @@ -62,13 +62,15 @@ public function testApplies() { * Test the access method. */ public function testAccess() { - $route = new Route('/test-route'); $request = new Request(array()); - $route->addRequirements(array('_access' => 'FALSE')); + $route = new Route('/test-route', array(), array('_access' => 'NULL')); + $this->assertNull($this->accessChecker->access($route, $request)); + + $route = new Route('/test-route', array(), array('_access' => 'FALSE')); $this->assertFalse($this->accessChecker->access($route, $request)); - $route->addRequirements(array('_access' => 'TRUE')); + $route = new Route('/test-route', array(), array('_access' => 'TRUE')); $this->assertTrue($this->accessChecker->access($route, $request)); }