Fixing ACL test, misc ACL lookup optimizations

git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@5916 3807eeeb-6ff5-0310-8944-8be069107fe0
This commit is contained in:
nate 2007-10-29 00:17:37 +00:00
parent 0f6c59ce50
commit 8f12e402df
6 changed files with 84 additions and 45 deletions

View file

@ -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);

View file

@ -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;

View file

@ -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);
}
}
?>

View file

@ -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);
}
}

View file

@ -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),
);
}

View file

@ -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(
);
}