2005-11-05 04:08:14 +00:00
< ? php
/* SVN FILE: $Id$ */
/**
2006-01-12 02:10:47 +00:00
* This is core configuration file .
*
2005-11-05 04:08:14 +00:00
* Use it to configure core behaviour ofCake .
*
* PHP versions 4 and 5
*
2007-02-02 10:39:45 +00:00
* CakePHP ( tm ) : Rapid Development Framework < http :// www . cakephp . org />
* Copyright 2005 - 2007 , Cake Software Foundation , Inc .
2006-05-26 05:29:17 +00:00
* 1785 E . Sahara Avenue , Suite 490 - 204
* Las Vegas , Nevada 89104
2006-01-12 02:10:47 +00:00
*
2005-12-23 21:57:26 +00:00
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice .
2005-11-05 04:08:14 +00:00
*
2006-01-12 02:10:47 +00:00
* @ filesource
2007-02-02 10:39:45 +00:00
* @ copyright Copyright 2005 - 2007 , Cake Software Foundation , Inc .
* @ link http :// www . cakefoundation . org / projects / info / cakephp CakePHP ( tm ) Project
2006-05-26 05:29:17 +00:00
* @ package cake
* @ subpackage cake . cake . libs . controller . componenets . dbacl
2007-02-02 10:39:45 +00:00
* @ since CakePHP ( tm ) v 0.2 . 9
2006-05-26 05:29:17 +00:00
* @ version $Revision $
* @ modifiedby $LastChangedBy $
* @ lastmodified $Date $
* @ license http :// www . opensource . org / licenses / mit - license . php The MIT License
2005-11-05 04:08:14 +00:00
*/
2006-10-09 15:47:50 +00:00
if ( ! defined ( 'ACL_DATABASE' )) {
define ( 'ACL_DATABASE' , 'default' );
}
2005-11-05 04:08:14 +00:00
2006-05-26 05:29:17 +00:00
uses ( 'controller' . DS . 'components' . DS . 'acl_base' );
uses ( 'controller' . DS . 'components' . DS . 'dbacl' . DS . 'models' . DS . 'aclnode' );
uses ( 'controller' . DS . 'components' . DS . 'dbacl' . DS . 'models' . DS . 'aco' );
uses ( 'controller' . DS . 'components' . DS . 'dbacl' . DS . 'models' . DS . 'acoaction' );
uses ( 'controller' . DS . 'components' . DS . 'dbacl' . DS . 'models' . DS . 'aro' );
2007-02-09 08:13:13 +00:00
uses ( 'controller' . DS . 'components' . DS . 'dbacl' . DS . 'models' . DS . 'permission' );
2005-11-05 04:08:14 +00:00
/**
* In this file you can extend the AclBase .
*
2006-05-26 05:29:17 +00:00
* @ package cake
* @ subpackage cake . cake . libs . controller . components . dbacl
2005-11-05 04:08:14 +00:00
*/
2006-06-14 18:02:37 +00:00
class DB_ACL extends AclBase {
2005-11-05 04:08:14 +00:00
2005-12-22 01:07:28 +00:00
/**
* Enter description here ...
*
*/
2006-06-14 18:02:37 +00:00
function __construct () {
}
2005-12-22 01:07:28 +00:00
/**
* Enter description here ...
*
* @ param unknown_type $aro
* @ param unknown_type $aco
* @ param unknown_type $action
* @ return unknown
*/
2006-06-14 18:02:37 +00:00
function check ( $aro , $aco , $action = " * " ) {
2007-02-09 08:13:13 +00:00
$Perms = new Permission ();
2006-06-14 18:02:37 +00:00
$Aro = new Aro ();
$Aco = new Aco ();
if ( $aro == null || $aco == null ) {
return false ;
}
$permKeys = $this -> _getAcoKeys ( $Perms -> loadInfo ());
2007-02-14 07:26:42 +00:00
$aroPath = $Aro -> node ( $aro );
$acoPath = new Set ( $Aco -> node ( $aco ));
2006-06-14 18:02:37 +00:00
2007-02-14 07:26:42 +00:00
if ( empty ( $aroPath ) || empty ( $acoPath )) {
2007-02-12 21:56:06 +00:00
trigger_error ( " DB_ACL::check() - Attempted to check permissions on/with a node that does not exist. Node references: \n Aro: " . print_r ( $aro , true ) . " \n Aco: " . print_r ( $aco , true ), E_USER_WARNING );
2006-06-14 18:02:37 +00:00
return false ;
}
2007-02-11 00:29:23 +00:00
if ( $acoPath -> get () == null || $acoPath -> get () == array ()) {
return false ;
}
2007-02-14 07:26:42 +00:00
$aroNode = $aroPath [ 0 ];
$acoNode = $acoPath -> get ();
$acoNode = $acoNode [ 0 ];
2006-06-14 18:02:37 +00:00
if ( $action != '*' && ! in_array ( '_' . $action , $permKeys )) {
2006-12-22 22:49:47 +00:00
trigger_error ( sprintf ( __ ( " ACO permissions key %s does not exist in DB_ACL::check() " , true ), $action ), E_USER_NOTICE );
2006-06-14 18:02:37 +00:00
return false ;
}
for ( $i = count ( $aroPath ) - 1 ; $i >= 0 ; $i -- ) {
2007-02-11 00:29:23 +00:00
$perms = $Perms -> findAll (
array (
'Permission.aro_id' => $aroPath [ $i ][ 'Aro' ][ 'id' ],
'Permission.aco_id' => $acoPath -> extract ( '{n}.Aco.id' )
),
null , array ( 'Aco.lft' => 'desc' ), null , null , 0
2006-06-14 18:02:37 +00:00
);
2007-02-11 00:29:23 +00:00
if ( empty ( $perms )) {
2006-06-14 18:02:37 +00:00
continue ;
} else {
2007-02-11 00:29:23 +00:00
foreach ( Set :: extract ( $perms , '{n}.Permission' ) as $perm ) {
2006-06-14 18:02:37 +00:00
if ( $action == '*' ) {
// ARO must be cleared for ALL ACO actions
foreach ( $permKeys as $key ) {
2007-02-11 00:29:23 +00:00
if ( ! empty ( $perm )) {
if ( $perm [ $key ] != 1 ) {
return false ;
2006-05-26 05:29:17 +00:00
}
2006-06-14 18:02:37 +00:00
}
}
return true ;
} else {
2007-02-11 00:29:23 +00:00
switch ( $perm [ '_' . $action ]) {
2006-06-14 18:02:37 +00:00
case - 1 :
return false ;
case 0 :
continue ;
break ;
case 1 :
2006-05-26 05:29:17 +00:00
return true ;
2006-06-14 18:02:37 +00:00
break ;
}
}
2006-05-26 05:29:17 +00:00
}
2006-06-14 18:02:37 +00:00
}
}
return false ;
}
2005-12-22 01:07:28 +00:00
/**
* Allow
*
* @ return boolean
*/
2006-06-14 18:02:37 +00:00
function allow ( $aro , $aco , $action = " * " , $value = 1 ) {
2007-02-09 08:13:13 +00:00
$Perms = new Permission ();
2006-06-14 18:02:37 +00:00
$perms = $this -> getAclLink ( $aro , $aco );
$permKeys = $this -> _getAcoKeys ( $Perms -> loadInfo ());
$save = array ();
if ( $perms == false ) {
2006-12-22 22:49:47 +00:00
trigger_error ( __ ( 'DB_ACL::allow() - Invalid node' ), E_USER_WARNING );
2006-06-14 18:02:37 +00:00
return false ;
}
if ( isset ( $perms [ 0 ])) {
2007-02-09 08:13:13 +00:00
$save = $perms [ 0 ][ 'Permission' ];
2006-06-14 18:02:37 +00:00
}
if ( $action == " * " ) {
$permKeys = $this -> _getAcoKeys ( $Perms -> loadInfo ());
foreach ( $permKeys as $key ) {
$save [ $key ] = $value ;
}
} else {
if ( in_array ( '_' . $action , $permKeys )) {
$save [ '_' . $action ] = $value ;
} else {
2006-12-22 22:49:47 +00:00
trigger_error ( __ ( 'DB_ACL::allow() - Invalid ACO action' ), E_USER_WARNING );
2006-05-26 05:29:17 +00:00
return false ;
2006-06-14 18:02:37 +00:00
}
}
2006-05-26 05:29:17 +00:00
2006-06-14 18:02:37 +00:00
$save [ 'aro_id' ] = $perms [ 'aro' ];
$save [ 'aco_id' ] = $perms [ 'aco' ];
2005-11-05 04:08:14 +00:00
2006-06-14 18:02:37 +00:00
if ( $perms [ 'link' ] != null && count ( $perms [ 'link' ]) > 0 ) {
2007-02-09 08:13:13 +00:00
$save [ 'id' ] = $perms [ 'link' ][ 0 ][ 'Permission' ][ 'id' ];
2006-06-14 18:02:37 +00:00
}
2007-02-09 08:13:13 +00:00
return $Perms -> save ( array ( 'Permission' => $save ));
2006-06-14 18:02:37 +00:00
}
2005-12-22 01:07:28 +00:00
/**
* Deny
*
* @ return boolean
*/
2006-06-14 18:02:37 +00:00
function deny ( $aro , $aco , $action = " * " ) {
return $this -> allow ( $aro , $aco , $action , - 1 );
}
2005-12-22 01:07:28 +00:00
/**
* Inherit
*
* @ return boolean
*/
2006-06-14 18:02:37 +00:00
function inherit ( $aro , $aco , $action = " * " ) {
return $this -> allow ( $aro , $aco , $action , 0 );
}
2005-12-22 01:07:28 +00:00
/**
* Allow alias
*
* @ return boolean
*/
2006-06-14 18:02:37 +00:00
function grant ( $aro , $aco , $action = " * " ) {
return $this -> allow ( $aro , $aco , $action );
}
2005-12-22 01:07:28 +00:00
/**
* Deny alias
*
* @ return boolean
*/
2006-06-14 18:02:37 +00:00
function revoke ( $aro , $aco , $action = " * " ) {
return $this -> deny ( $aro , $aco , $action );
}
2005-12-22 01:07:28 +00:00
/**
2006-03-28 02:44:55 +00:00
* Get an ARO object from the given id or alias
2005-12-22 01:07:28 +00:00
*
2006-03-28 02:44:55 +00:00
* @ param mixed $id
* @ return Aro
2005-12-22 01:07:28 +00:00
*/
2006-06-14 18:02:37 +00:00
function getAro ( $id = null ) {
2007-02-12 21:56:06 +00:00
trigger_error ( __ ( 'DB_ACL::getAro() - Usage deprecated. Use AclComponent::$Aro::node().' ), E_USER_WARNING );
2006-06-14 18:02:37 +00:00
return $this -> __getObject ( $id , 'Aro' );
}
2005-12-22 01:07:28 +00:00
/**
2006-03-28 02:44:55 +00:00
* Get an ACO object from the given id or alias
2005-12-22 01:07:28 +00:00
*
2006-03-28 02:44:55 +00:00
* @ param mixed $id
* @ return Aco
2005-12-22 01:07:28 +00:00
*/
2006-06-14 18:02:37 +00:00
function getAco ( $id = null ) {
2007-02-12 21:56:06 +00:00
trigger_error ( __ ( 'DB_ACL::getAco() - Usage deprecated. Use AclComponent::$Aco::node().' ), E_USER_WARNING );
2006-06-14 18:02:37 +00:00
return $this -> __getObject ( $id , 'Aco' );
}
2005-12-22 01:07:28 +00:00
/**
2006-06-14 18:02:37 +00:00
* Private method
2005-12-22 01:07:28 +00:00
*
*/
2006-06-14 18:02:37 +00:00
function __getObject ( $id = null , $object ) {
if ( $id == null ) {
2006-12-22 22:49:47 +00:00
trigger_error ( __ ( 'Null id provided in DB_ACL::get' ) . $object , E_USER_WARNING );
2006-06-14 18:02:37 +00:00
return null ;
}
$obj = new $object ;
if ( is_numeric ( $id )) {
2007-02-12 21:56:06 +00:00
$conditions = array ( " { $object } .foreign_key " => $id );
2006-06-14 18:02:37 +00:00
} else {
2007-02-12 21:56:06 +00:00
$conditions = array ( " { $object } .alias " => $id );
2006-06-14 18:02:37 +00:00
}
$tmp = $obj -> find ( $conditions );
$obj -> id = $tmp [ $object ][ 'id' ];
return $obj ;
}
2006-03-28 02:44:55 +00:00
/**
* Get an array of access - control links between the given Aro and Aco
*
* @ param mixed $aro
* @ param mixed $aco
* @ return array
*/
2006-06-14 18:02:37 +00:00
function getAclLink ( $aro , $aco ) {
$Aro = new Aro ();
$Aco = new Aco ();
2007-02-09 08:13:13 +00:00
$Link = new Permission ();
2006-06-14 18:02:37 +00:00
$obj = array ();
2007-02-09 21:26:09 +00:00
$obj [ 'Aro' ] = $Aro -> node ( $aro );
$obj [ 'Aco' ] = $Aco -> node ( $aco );
2006-06-14 18:02:37 +00:00
2007-02-09 21:26:09 +00:00
if ( empty ( $obj [ 'Aro' ]) || empty ( $obj [ 'Aco' ])) {
2006-06-14 18:02:37 +00:00
return false ;
}
return array (
'aro' => $obj [ 'Aro' ][ 'id' ],
'aco' => $obj [ 'Aco' ][ 'id' ],
'link' => $Link -> findAll ( array (
2007-02-09 08:13:13 +00:00
'Permission.aro_id' => $obj [ 'Aro' ][ 'id' ],
'Permission.aco_id' => $obj [ 'Aco' ][ 'id' ]
2006-06-14 18:02:37 +00:00
))
);
}
2005-12-22 01:07:28 +00:00
/**
* Enter description here ...
*
* @ param unknown_type $keys
* @ return unknown
*/
2006-06-14 18:02:37 +00:00
function _getAcoKeys ( $keys ) {
$newKeys = array ();
2007-02-09 08:13:13 +00:00
$keys = $keys -> extract ( '{n}.name' );
2006-06-14 18:02:37 +00:00
foreach ( $keys as $key ) {
2007-02-09 08:13:13 +00:00
if ( ! in_array ( $key , array ( 'id' , 'aro_id' , 'aco_id' ))) {
$newKeys [] = $key ;
2006-06-14 18:02:37 +00:00
}
}
return $newKeys ;
}
2005-11-05 04:08:14 +00:00
}
2006-06-14 18:02:37 +00:00
2005-11-05 04:08:14 +00:00
?>