Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

fix correct node lookup when authorize object uses plugin userModel s…

…etting, fixes #2464
  • Loading branch information...
commit fb3c3e4df8df3f800457f0904192e3fc14bb9b71 1 parent 00649cb
@ceeram ceeram authored
View
7 lib/Cake/Model/AclNode.php
@@ -120,11 +120,12 @@ public function node($ref = null) {
return false;
}
} elseif (is_object($ref) && is_a($ref, 'Model')) {
- $ref = array('model' => $ref->alias, 'foreign_key' => $ref->id);
+ $ref = array('model' => $ref->name, 'foreign_key' => $ref->id);
} elseif (is_array($ref) && !(isset($ref['model']) && isset($ref['foreign_key']))) {
$name = key($ref);
+ list($plugin, $alias) = pluginSplit($name);
- $model = ClassRegistry::init(array('class' => $name, 'alias' => $name));
+ $model = ClassRegistry::init(array('class' => $name, 'alias' => $alias));
if (empty($model)) {
trigger_error(__d('cake_dev', "Model class '%s' not found in AclNode::node() when trying to bind %s object", $type, $this->alias), E_USER_WARNING);
@@ -136,7 +137,7 @@ public function node($ref = null) {
$tmpRef = $model->bindNode($ref);
}
if (empty($tmpRef)) {
- $ref = array('model' => $name, 'foreign_key' => $ref[$name][$model->primaryKey]);
+ $ref = array('model' => $alias, 'foreign_key' => $ref[$name][$model->primaryKey]);
} else {
if (is_string($tmpRef)) {
return $this->node($tmpRef);
View
30 lib/Cake/Test/Case/Controller/Component/Auth/ActionsAuthorizeTest.php
@@ -111,6 +111,36 @@ public function testAuthorizeSuccess() {
}
/**
+ * testAuthorizeSettings
+ *
+ * @return void
+ */
+ public function testAuthorizeSettings() {
+ $request = new CakeRequest('/posts/index', false);
+ $request->addParams(array(
+ 'plugin' => null,
+ 'controller' => 'posts',
+ 'action' => 'index'
+ ));
+
+ $this->_mockAcl();
+
+ $this->auth->settings['userModel'] = 'TestPlugin.TestPluginAuthUser';
+ $user = array(
+ 'id' => 1,
+ 'user' => 'mariano'
+ );
+
+ $expected = array('TestPlugin.TestPluginAuthUser' => array('id' => 1, 'user' => 'mariano'));
+ $this->Acl->expects($this->once())
+ ->method('check')
+ ->with($expected, '/controllers/Posts/index')
+ ->will($this->returnValue(true));
+
+ $this->assertTrue($this->auth->authorize($user, $request));
+ }
+
+/**
* test action()
*
* @return void
View
28 lib/Cake/Test/Case/Model/DbAclTest.php
@@ -316,7 +316,8 @@ public function testNodeArrayFind() {
$expected = array(4);
$this->assertEquals($expected, $result);
}
- /**
+
+/**
* testNodeObjectFind method
*
* @return void
@@ -359,4 +360,29 @@ public function testNodeAliasParenting() {
);
$this->assertEquals($expected, $result);
}
+
+/**
+ * testNodeActionAuthorize method
+ *
+ * @return void
+ */
+ public function testNodeActionAuthorize() {
+ App::build(array(
+ 'plugins' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS)
+ ), App::RESET);
+ CakePlugin::load('TestPlugin');
+
+ $Aro = new DbAroTest();
+ $Aro->create();
+ $Aro->save(array('model' => 'TestPluginAuthUser', 'foreign_key' => 1));
+ $result = $Aro->id;
+ $expected = 5;
+ $this->assertEquals($expected, $result);
+
+ $node = $Aro->node(array('TestPlugin.TestPluginAuthUser' => array('id' => 1, 'user' => 'mariano')));
+ $result = Set::extract($node, '0.DbAroTest.id');
+ $expected = $Aro->id;
+ $this->assertEquals($expected, $result);
+ CakePlugin::unload('TestPlugin');
+ }
}
Please sign in to comment.
Something went wrong with that request. Please try again.