diff --git a/cake/libs/controller/components/acl.php b/cake/libs/controller/components/acl.php index 636930674..764df6119 100644 --- a/cake/libs/controller/components/acl.php +++ b/cake/libs/controller/components/acl.php @@ -295,31 +295,37 @@ class DB_ACL extends AclBase { } $inherited = array(); + $acoIDs = $acoPath->extract('{n}.' . $this->Aco->alias . '.id'); + for ($i = 0 ; $i < count($aroPath); $i++) { + $permAlias = $this->Aro->Permission->alias; + $perms = $this->Aro->Permission->findAll(array( - $this->Aro->Permission->alias . '.aro_id' => $aroPath[$i][$this->Aro->alias]['id'], - $this->Aro->Permission->alias . '.aco_id' => $acoPath->extract('{n}.' . $this->Aco->alias . '.id')), - null, array($this->Aco->alias . '.lft' => 'desc'), null, null, 0); + "{$permAlias}.aro_id" => $aroPath[$i][$this->Aro->alias]['id'], + "{$permAlias}.aco_id" => $acoIDs), + null, array($this->Aco->alias . '.lft' => 'desc'), null, null, 0 + ); if (empty($perms)) { continue; } else { - foreach (Set::extract($perms, '{n}.' . $this->Aro->Permission->alias) as $perm) { + $perms = Set::extract($perms, '{n}.' . $this->Aro->Permission->alias); + foreach ($perms as $perm) { if ($action == '*') { foreach ($permKeys as $key) { if (!empty($perm)) { - if ($perm[$key] == -1) { + if ($perm[$key] === -1) { return false; } elseif ($perm[$key] == 1) { $inherited[$key] = 1; } } } + if (count($inherited) === count($permKeys)) { return true; } - } else { switch($perm['_' . $action]) { case -1: @@ -363,10 +369,7 @@ class DB_ACL extends AclBase { if ($actions == "*") { $permKeys = $this->_getAcoKeys($this->Aro->Permission->schema()); - - foreach ($permKeys as $key) { - $save[$key] = $value; - } + $save = array_combine($permKeys, array_pad(array(), count($permKeys), $value)); } else { if (!is_array($actions)) { $actions = array('_' . $actions); diff --git a/cake/libs/model/model.php b/cake/libs/model/model.php index f541679c2..395f88b3e 100644 --- a/cake/libs/model/model.php +++ b/cake/libs/model/model.php @@ -773,8 +773,9 @@ class Model extends Overloadable { $sources = $db->listSources(); if (is_array($sources) && !in_array(low($this->tablePrefix . $tableName), array_map('low', $sources))) { return $this->cakeError('missingTable', array(array( - 'className' => $this->alias, - 'table' => $this->tablePrefix . $tableName))); + 'className' => $this->alias, + 'table' => $this->tablePrefix . $tableName + ))); } $this->_schema = null; diff --git a/cake/tests/cases/libs/controller/components/acl.test.php b/cake/tests/cases/libs/controller/components/acl.test.php index ff0f7a400..b408a0cef 100644 --- a/cake/tests/cases/libs/controller/components/acl.test.php +++ b/cake/tests/cases/libs/controller/components/acl.test.php @@ -58,9 +58,7 @@ if(!class_exists('permissiontest')) { var $name = 'PermissionTest'; var $useTable = 'aros_acos'; var $cacheQueries = false; - var $belongsTo = array('AroTest' => array('foreignKey' => 'aro_id'), - 'AcoTest' => array('foreignKey' => 'aco_id') - ); + var $belongsTo = array('AroTest' => array('foreignKey' => 'aro_id'), 'AcoTest' => array('foreignKey' => 'aco_id')); var $actsAs = null; } } @@ -91,14 +89,55 @@ if(!class_exists('db_acl_test')) { class AclComponentTest extends CakeTestCase { var $fixtures = array('core.aro', 'core.aco', 'core.aros_aco', 'core.aco_action'); + + function start() { + } + function startTest() { - Configure::write('Acl.classname', 'DB_ACL_TEST'); - Configure::write('Acl.database', 'test_suite'); $this->Acl =& new AclComponent(); } + function before() { + if (!isset($this->_initialized)) { + Configure::write('Acl.classname', 'DB_ACL_TEST'); + Configure::write('Acl.database', 'test_suite'); + + if (isset($this->fixtures) && (!is_array($this->fixtures) || empty($this->fixtures))) { + unset($this->fixtures); + } + + // Set up DB connection + if (isset($this->fixtures)) { + $this->_initDb(); + $this->_loadFixtures(); + } + parent::start(); + + // Create records + if (isset($this->_fixtures) && isset($this->db)) { + foreach ($this->_fixtures as $fixture) { + $inserts = $fixture->insert(); + + if (isset($inserts) && !empty($inserts)) { + foreach ($inserts as $query) { + if (isset($query) && $query !== false) { + $this->db->execute($query); + } + } + } + } + } + + $this->startTest(); + $this->_initialized = true; + } + } + + function after() { + } + function testAclCreate() { - $this->Acl->Aro->create(array('alias'=>'Global')); + $this->Acl->Aro->create(array('alias' => 'Global')); $result = $this->Acl->Aro->save(); $this->assertTrue($result); @@ -118,7 +157,7 @@ class AclComponentTest extends CakeTestCase { $result = $this->Acl->Aro->save(); $this->assertTrue($result); - $this->Acl->Aco->create(array('alias'=>'Reports')); + $this->Acl->Aco->create(array('alias' => 'Reports')); $result = $this->Acl->Aco->save(); $this->assertTrue($result); @@ -160,10 +199,10 @@ class AclComponentTest extends CakeTestCase { } function testDbAclAllow() { - $result = $this->Acl->allow('Manager','Reports',array('read','delete','update')); + $result = $this->Acl->allow('Manager', 'Reports', array('read','delete','update')); $this->assertTrue($result); - $result = $this->Acl->allow('Secretary','Links',array('create')); + $result = $this->Acl->allow('Secretary', 'Links', array('create')); $this->assertTrue($result); } @@ -225,12 +264,8 @@ class AclComponentTest extends CakeTestCase { $this->assertFalse($result); } - function after() { - parent::after('end'); - } - function tearDown() { - unset($this->Acl); } } + ?> diff --git a/cake/tests/cases/libs/model/db_acl.test.php b/cake/tests/cases/libs/model/db_acl.test.php index d64230d38..c45f00909 100644 --- a/cake/tests/cases/libs/model/db_acl.test.php +++ b/cake/tests/cases/libs/model/db_acl.test.php @@ -84,9 +84,7 @@ if(!class_exists('permissiontest')) { var $name = 'PermissionTest'; var $useTable = 'aros_acos'; var $cacheQueries = false; - var $belongsTo = array('AroTest' => array('foreignKey' => 'aro_id'), - 'AcoTest' => array('foreignKey' => 'aco_id') - ); + var $belongsTo = array('AroTest' => array('foreignKey' => 'aro_id'), 'AcoTest' => array('foreignKey' => 'aco_id')); var $actsAs = null; } } @@ -167,7 +165,6 @@ if(!class_exists('db_acl_test')) { $result = Set::extract($aco->node('Controller2/action3/record5'), '{n}.AcoTest.id'); $expected = array(6, 1); $this->assertEqual($result, $expected); - } } diff --git a/cake/tests/fixtures/aco_fixture.php b/cake/tests/fixtures/aco_fixture.php index d4592c3cf..661aa830e 100644 --- a/cake/tests/fixtures/aco_fixture.php +++ b/cake/tests/fixtures/aco_fixture.php @@ -35,24 +35,25 @@ class AcoFixture extends CakeTestFixture { var $name = 'Aco'; var $fields = array( - 'id' => array('type' => 'integer', 'key' => 'primary', 'extra'=> 'auto_increment'), - 'parent_id' => array('type' => 'integer', 'length' => 10, 'null' => true), - 'model' => array('type' => 'string', 'default' => ''), + 'id' => array('type' => 'integer', 'key' => 'primary', 'extra'=> 'auto_increment'), + 'parent_id' => array('type' => 'integer', 'length' => 10, 'null' => true), + 'model' => array('type' => 'string', 'default' => ''), 'foreign_key' => array('type' => 'integer', 'length' => 10, 'null' => true), - 'alias' => array('type' => 'string', 'default' => ''), - 'lft' => array('type' => 'integer', 'length' => 10, 'null' => true), - 'rght' => array('type' => 'integer', 'length' => 10, 'null' => true) + 'alias' => array('type' => 'string', 'default' => ''), + 'lft' => array('type' => 'integer', 'length' => 10, 'null' => true), + 'rght' => array('type' => 'integer', 'length' => 10, 'null' => true) ); + var $records = array( - array ('id' => 1, 'parent_id' => null, 'model' => null, 'foreign_key' => null, 'alias' => 'ROOT', 'lft' => 1, 'rght' => 18), - array ('id' => 2, 'parent_id' => 1, 'model' => null, 'foreign_key' => null, 'alias' => 'Controller1', 'lft' => 2, 'rght' => 9), - array ('id' => 3, 'parent_id' => 2, 'model' => null, 'foreign_key' => null, 'alias' => 'action1', 'lft' => 3, 'rght' => 6), - array ('id' => 4, 'parent_id' => 3, 'model' => null, 'foreign_key' => null, 'alias' => 'record1', 'lft' => 4, 'rght' => 5), - array ('id' => 5, 'parent_id' => 2, 'model' => null, 'foreign_key' => null, 'alias' => 'action2', 'lft' => 7, 'rght' => 8), - array ('id' => 6, 'parent_id' => 1, 'model' => null, 'foreign_key' => null, 'alias' => 'Controller2', 'lft' => 10, 'rght' => 17), - array ('id' => 7, 'parent_id' => 6, 'model' => null, 'foreign_key' => null, 'alias' => 'action1', 'lft' => 11, 'rght' => 14), - array ('id' => 8, 'parent_id' => 7, 'model' => null, 'foreign_key' => null, 'alias' => 'record1', 'lft' => 12, 'rght' => 13), - array ('id' => 9, 'parent_id' => 6, 'model' => null, 'foreign_key' => null, 'alias' => 'action2', 'lft' => 15, 'rght' => 16), + array('id' => 1, 'parent_id' => null, 'model' => null, 'foreign_key' => null, 'alias' => 'ROOT', 'lft' => 1, 'rght' => 18), + array('id' => 2, 'parent_id' => 1, 'model' => null, 'foreign_key' => null, 'alias' => 'Controller1', 'lft' => 2, 'rght' => 9), + array('id' => 3, 'parent_id' => 2, 'model' => null, 'foreign_key' => null, 'alias' => 'action1', 'lft' => 3, 'rght' => 6), + array('id' => 4, 'parent_id' => 3, 'model' => null, 'foreign_key' => null, 'alias' => 'record1', 'lft' => 4, 'rght' => 5), + array('id' => 5, 'parent_id' => 2, 'model' => null, 'foreign_key' => null, 'alias' => 'action2', 'lft' => 7, 'rght' => 8), + array('id' => 6, 'parent_id' => 1, 'model' => null, 'foreign_key' => null, 'alias' => 'Controller2', 'lft' => 10, 'rght' => 17), + array('id' => 7, 'parent_id' => 6, 'model' => null, 'foreign_key' => null, 'alias' => 'action1', 'lft' => 11, 'rght' => 14), + array('id' => 8, 'parent_id' => 7, 'model' => null, 'foreign_key' => null, 'alias' => 'record1', 'lft' => 12, 'rght' => 13), + array('id' => 9, 'parent_id' => 6, 'model' => null, 'foreign_key' => null, 'alias' => 'action2', 'lft' => 15, 'rght' => 16), ); } diff --git a/cake/tests/fixtures/aro_fixture.php b/cake/tests/fixtures/aro_fixture.php index 65bce68ea..132c50f5f 100644 --- a/cake/tests/fixtures/aro_fixture.php +++ b/cake/tests/fixtures/aro_fixture.php @@ -34,6 +34,7 @@ */ class AroFixture extends CakeTestFixture { var $name = 'Aro'; + var $fields = array( 'id' => array('type' => 'integer', 'key' => 'primary', 'extra'=> 'auto_increment'), 'parent_id' => array('type' => 'integer', 'length' => 10, 'null' => true), @@ -43,6 +44,7 @@ class AroFixture extends CakeTestFixture { 'lft' => array('type' => 'integer', 'length' => 10, 'null' => true), 'rght' => array('type' => 'integer', 'length' => 10, 'null' => true) ); + var $records = array( ); }