diff --git a/lib/Cake/Controller/Controller.php b/lib/Cake/Controller/Controller.php index 8cd10fdf134..78381e90acd 100644 --- a/lib/Cake/Controller/Controller.php +++ b/lib/Cake/Controller/Controller.php @@ -514,12 +514,12 @@ protected function _isPrivateAction(ReflectionMethod $method, CakeRequest $reque !$method->isPublic() || !in_array($method->name, $this->methods) ); - $prefixes = Router::prefixes(); + $prefixes = array_map('strtolower', Router::prefixes()); if (!$privateAction && !empty($prefixes)) { if (empty($request->params['prefix']) && strpos($request->params['action'], '_') > 0) { list($prefix) = explode('_', $request->params['action']); - $privateAction = in_array($prefix, $prefixes); + $privateAction = in_array(strtolower($prefix), $prefixes); } } return $privateAction; diff --git a/lib/Cake/Test/Case/Controller/ControllerTest.php b/lib/Cake/Test/Case/Controller/ControllerTest.php index 534825e3773..f319bd1672d 100644 --- a/lib/Cake/Test/Case/Controller/ControllerTest.php +++ b/lib/Cake/Test/Case/Controller/ControllerTest.php @@ -1447,6 +1447,25 @@ public function testInvokeActionPrefixProtection() { $Controller->invokeAction($url); } +/** + * test invoking controller methods. + * + * @expectedException PrivateActionException + * @expectedExceptionMessage Private Action TestController::Admin_add() is not directly accessible. + * @return void + */ + public function testInvokeActionPrefixProtectionCasing() { + Router::reload(); + Router::connect('/admin/:controller/:action/*', array('prefix' => 'admin')); + + $url = new CakeRequest('test/Admin_add/'); + $url->addParams(array('controller' => 'test_controller', 'action' => 'Admin_add')); + $response = $this->getMock('CakeResponse'); + + $Controller = new TestController($url, $response); + $Controller->invokeAction($url); + } + /** * test invoking controller methods. *