2008-05-30 11:40:08 +00:00
< ? php
/**
2009-08-07 12:32:27 +00:00
* Acl Shell provides Acl access in the CLI environment
2008-05-30 11:40:08 +00:00
*
2010-10-03 16:38:58 +00:00
* PHP 5
2008-05-30 11:40:08 +00:00
*
2009-11-06 06:46:59 +00:00
* CakePHP ( tm ) : Rapid Development Framework ( http :// cakephp . org )
2010-01-26 19:18:20 +00:00
* Copyright 2005 - 2010 , Cake Software Foundation , Inc . ( http :// cakefoundation . org )
2008-05-30 11:40:08 +00:00
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice .
*
2010-01-26 19:18:20 +00:00
* @ copyright Copyright 2005 - 2010 , Cake Software Foundation , Inc . ( http :// cakefoundation . org )
2009-11-06 06:00:11 +00:00
* @ link http :// cakephp . org CakePHP ( tm ) Project
2008-10-30 17:30:26 +00:00
* @ package cake
* @ subpackage cake . cake . console . libs
* @ since CakePHP ( tm ) v 1.2 . 0.5012
2009-11-06 06:51:51 +00:00
* @ license MIT License ( http :// www . opensource . org / licenses / mit - license . php )
2008-05-30 11:40:08 +00:00
*/
App :: import ( 'Component' , 'Acl' );
App :: import ( 'Model' , 'DbAcl' );
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2010-09-26 16:33:15 +00:00
* Shell for ACL management . This console is known to have issues with zend . ze1_compatibility_mode
* being enabled . Be sure to turn it off when using this shell .
2008-05-30 11:40:08 +00:00
*
2008-10-30 17:30:26 +00:00
* @ package cake
* @ subpackage cake . cake . console . libs
2008-05-30 11:40:08 +00:00
*/
class AclShell extends Shell {
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Contains instance of AclComponent
*
2009-03-17 21:10:28 +00:00
* @ var AclComponent
2008-05-30 11:40:08 +00:00
* @ access public
*/
2010-04-04 07:14:00 +00:00
public $Acl ;
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Contains arguments parsed from the command line .
*
* @ var array
* @ access public
*/
2010-04-04 07:14:00 +00:00
public $args ;
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Contains database source to use
*
* @ var string
* @ access public
*/
2010-04-04 07:14:00 +00:00
public $connection = 'default' ;
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Contains tasks to load and instantiate
*
* @ var array
* @ access public
*/
2010-04-04 07:14:00 +00:00
public $tasks = array ( 'DbConfig' );
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Override startup of the Shell
*
*/
2010-04-05 03:19:38 +00:00
public function startup () {
2009-08-06 03:41:25 +00:00
if ( isset ( $this -> params [ 'connection' ])) {
$this -> connection = $this -> params [ 'connection' ];
2008-05-30 11:40:08 +00:00
}
if ( ! in_array ( Configure :: read ( 'Acl.classname' ), array ( 'DbAcl' , 'DB_ACL' ))) {
$out = " -------------------------------------------------- \n " ;
2010-04-15 15:43:39 +00:00
$out .= __ ( 'Error: Your current Cake configuration is set to' ) . " \n " ;
$out .= __ ( 'an ACL implementation other than DB. Please change' ) . " \n " ;
$out .= __ ( 'your core config to reflect your decision to use' ) . " \n " ;
$out .= __ ( 'DbAcl before attempting to use this script' ) . " . \n " ;
2008-05-30 11:40:08 +00:00
$out .= " -------------------------------------------------- \n " ;
2010-04-15 15:43:39 +00:00
$out .= sprintf ( __ ( 'Current ACL Classname: %s' ), Configure :: read ( 'Acl.classname' )) . " \n " ;
2008-05-30 11:40:08 +00:00
$out .= " -------------------------------------------------- \n " ;
$this -> err ( $out );
2008-06-04 19:04:58 +00:00
$this -> _stop ();
2008-05-30 11:40:08 +00:00
}
if ( $this -> command && ! in_array ( $this -> command , array ( 'help' ))) {
if ( ! config ( 'database' )) {
2010-04-15 15:43:39 +00:00
$this -> out ( __ ( 'Your database configuration was not found. Take a moment to create one.' ), true );
2008-05-30 11:40:08 +00:00
$this -> args = null ;
return $this -> DbConfig -> execute ();
}
require_once ( CONFIGS . 'database.php' );
if ( ! in_array ( $this -> command , array ( 'initdb' ))) {
2010-09-08 03:40:07 +00:00
$collection = new ComponentCollection ();
$this -> Acl =& new AclComponent ( $collection );
2008-05-30 11:40:08 +00:00
$controller = null ;
$this -> Acl -> startup ( $controller );
}
}
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Override main () for help message hook
*
*/
2010-04-05 03:19:38 +00:00
public function main () {
2010-04-15 15:43:39 +00:00
$out = __ ( 'Available ACL commands:' ) . " \n " ;
2008-05-30 11:40:08 +00:00
$out .= " \t - create \n " ;
$out .= " \t - delete \n " ;
$out .= " \t - setParent \n " ;
$out .= " \t - getPath \n " ;
$out .= " \t - check \n " ;
$out .= " \t - grant \n " ;
$out .= " \t - deny \n " ;
$out .= " \t - inherit \n " ;
$out .= " \t - view \n " ;
$out .= " \t - initdb \n " ;
$out .= " \t - help \n \n " ;
2010-04-15 15:43:39 +00:00
$out .= __ ( " For help, run the 'help' command. For help on a specific command, run 'help <command>' " );
2008-05-30 11:40:08 +00:00
$this -> out ( $out );
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Creates an ARO / ACO node
*
*/
2010-04-05 03:19:38 +00:00
public function create () {
2008-05-30 11:40:08 +00:00
$this -> _checkArgs ( 3 , 'create' );
$this -> checkNodeType ();
extract ( $this -> __dataVars ());
$class = ucfirst ( $this -> args [ 0 ]);
2009-08-01 22:57:54 +00:00
$parent = $this -> parseIdentifier ( $this -> args [ 1 ]);
2008-05-30 11:40:08 +00:00
if ( ! empty ( $parent ) && $parent != '/' && $parent != 'root' ) {
2009-08-02 00:17:44 +00:00
$parent = $this -> _getNodeId ( $class , $parent );
2008-05-30 11:40:08 +00:00
} else {
$parent = null ;
}
2009-08-01 22:57:54 +00:00
$data = $this -> parseIdentifier ( $this -> args [ 2 ]);
2009-08-02 00:17:44 +00:00
if ( is_string ( $data ) && $data != '/' ) {
2009-08-01 22:57:54 +00:00
$data = array ( 'alias' => $data );
2009-08-02 00:17:44 +00:00
} elseif ( is_string ( $data )) {
2010-04-15 15:43:39 +00:00
$this -> error ( __ ( '/ can not be used as an alias!' ), __ ( " \t / is the root, please supply a sub alias " ));
2008-05-30 11:40:08 +00:00
}
$data [ 'parent_id' ] = $parent ;
2009-08-02 00:17:44 +00:00
$this -> Acl -> { $class } -> create ();
if ( $this -> Acl -> { $class } -> save ( $data )) {
2010-04-15 15:43:39 +00:00
$this -> out ( sprintf ( __ ( " New %s '%s' created. \n " ), $class , $this -> args [ 2 ]), true );
2008-05-30 11:40:08 +00:00
} else {
2010-04-15 15:43:39 +00:00
$this -> err ( sprintf ( __ ( " There was a problem creating a new %s '%s'. " ), $class , $this -> args [ 2 ]));
2008-05-30 11:40:08 +00:00
}
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Delete an ARO / ACO node .
*
*/
2010-04-05 03:19:38 +00:00
public function delete () {
2008-05-30 11:40:08 +00:00
$this -> _checkArgs ( 2 , 'delete' );
$this -> checkNodeType ();
extract ( $this -> __dataVars ());
2009-08-02 00:17:44 +00:00
$identifier = $this -> parseIdentifier ( $this -> args [ 1 ]);
$nodeId = $this -> _getNodeId ( $class , $identifier );
if ( ! $this -> Acl -> { $class } -> delete ( $nodeId )) {
2010-04-15 15:43:39 +00:00
$this -> error ( __ ( 'Node Not Deleted' ), sprintf ( __ ( 'There was an error deleting the %s. Check that the node exists' ), $class ) . " . \n " );
2008-05-30 11:40:08 +00:00
}
2010-04-15 15:43:39 +00:00
$this -> out ( sprintf ( __ ( '%s deleted' ), $class ) . " . \n " , true );
2008-05-30 11:40:08 +00:00
}
/**
* Set parent for an ARO / ACO node .
*
*/
2010-04-05 03:19:38 +00:00
public function setParent () {
2008-05-30 11:40:08 +00:00
$this -> _checkArgs ( 3 , 'setParent' );
$this -> checkNodeType ();
extract ( $this -> __dataVars ());
2009-08-02 00:56:58 +00:00
$target = $this -> parseIdentifier ( $this -> args [ 1 ]);
$parent = $this -> parseIdentifier ( $this -> args [ 2 ]);
2008-05-30 11:40:08 +00:00
$data = array (
$class => array (
2009-08-02 00:56:58 +00:00
'id' => $this -> _getNodeId ( $class , $target ),
'parent_id' => $this -> _getNodeId ( $class , $parent )
2008-05-30 11:40:08 +00:00
)
);
$this -> Acl -> { $class } -> create ();
if ( ! $this -> Acl -> { $class } -> save ( $data )) {
2010-04-15 15:43:39 +00:00
$this -> out ( __ ( 'Error in setting new parent. Please make sure the parent node exists, and is not a descendant of the node specified.' ), true );
2008-05-30 11:40:08 +00:00
} else {
2010-04-15 15:43:39 +00:00
$this -> out ( sprintf ( __ ( 'Node parent set to %s' ), $this -> args [ 2 ]) . " \n " , true );
2008-05-30 11:40:08 +00:00
}
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Get path to specified ARO / ACO node .
*
*/
2010-04-05 03:19:38 +00:00
public function getPath () {
2008-05-30 11:40:08 +00:00
$this -> _checkArgs ( 2 , 'getPath' );
$this -> checkNodeType ();
extract ( $this -> __dataVars ());
2009-08-06 03:13:48 +00:00
$identifier = $this -> parseIdentifier ( $this -> args [ 1 ]);
$id = $this -> _getNodeId ( $class , $identifier );
2008-05-30 11:40:08 +00:00
$nodes = $this -> Acl -> { $class } -> getPath ( $id );
2009-08-06 03:13:48 +00:00
2008-05-30 11:40:08 +00:00
if ( empty ( $nodes )) {
2009-08-06 03:13:48 +00:00
$this -> error (
2010-04-15 15:43:39 +00:00
sprintf ( __ ( " Supplied Node '%s' not found " ), $this -> args [ 1 ]),
__ ( 'No tree returned.' )
2009-08-06 03:13:48 +00:00
);
2008-05-30 11:40:08 +00:00
}
2010-04-15 15:43:39 +00:00
$this -> out ( __ ( 'Path:' ));
2009-08-06 03:41:25 +00:00
$this -> hr ();
2008-05-30 11:40:08 +00:00
for ( $i = 0 ; $i < count ( $nodes ); $i ++ ) {
2009-08-06 03:13:48 +00:00
$this -> _outputNode ( $class , $nodes [ $i ], $i );
}
}
/**
* Outputs a single node , Either using the alias or Model . key
*
* @ param string $class Class name that is being used .
* @ param array $node Array of node information .
* @ param integer $indent indent level .
* @ return void
2009-11-14 12:19:25 +00:00
*/
2010-04-05 03:21:28 +00:00
protected function _outputNode ( $class , $node , $indent ) {
2009-08-06 03:13:48 +00:00
$indent = str_repeat ( ' ' , $indent );
$data = $node [ $class ];
if ( $data [ 'alias' ]) {
$this -> out ( $indent . " [ " . $data [ 'id' ] . " ] " . $data [ 'alias' ]);
} else {
$this -> out ( $indent . " [ " . $data [ 'id' ] . " ] " . $data [ 'model' ] . '.' . $data [ 'foreign_key' ]);
2008-05-30 11:40:08 +00:00
}
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Check permission for a given ARO to a given ACO .
*
*/
2010-04-05 03:19:38 +00:00
public function check () {
2008-05-30 11:40:08 +00:00
$this -> _checkArgs ( 3 , 'check' );
extract ( $this -> __getParams ());
if ( $this -> Acl -> check ( $aro , $aco , $action )) {
2010-04-15 15:43:39 +00:00
$this -> out ( sprintf ( __ ( '%s is allowed.' ), $aroName ), true );
2008-05-30 11:40:08 +00:00
} else {
2010-04-15 15:43:39 +00:00
$this -> out ( sprintf ( __ ( '%s is not allowed.' ), $aroName ), true );
2008-05-30 11:40:08 +00:00
}
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Grant permission for a given ARO to a given ACO .
*
*/
2010-04-05 03:19:38 +00:00
public function grant () {
2008-05-30 11:40:08 +00:00
$this -> _checkArgs ( 3 , 'grant' );
extract ( $this -> __getParams ());
if ( $this -> Acl -> allow ( $aro , $aco , $action )) {
2010-04-15 15:43:39 +00:00
$this -> out ( __ ( 'Permission granted.' ), true );
2008-05-30 11:40:08 +00:00
} else {
2010-04-15 15:43:39 +00:00
$this -> out ( __ ( 'Permission was not granted.' ), true );
2008-05-30 11:40:08 +00:00
}
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Deny access for an ARO to an ACO .
*
*/
2010-04-05 03:19:38 +00:00
public function deny () {
2008-05-30 11:40:08 +00:00
$this -> _checkArgs ( 3 , 'deny' );
extract ( $this -> __getParams ());
if ( $this -> Acl -> deny ( $aro , $aco , $action )) {
2010-04-15 15:43:39 +00:00
$this -> out ( __ ( 'Permission denied.' ), true );
2008-05-30 11:40:08 +00:00
} else {
2010-04-15 15:43:39 +00:00
$this -> out ( __ ( 'Permission was not denied.' ), true );
2008-05-30 11:40:08 +00:00
}
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Set an ARO to inhermit permission to an ACO .
*
*/
2010-04-05 03:19:38 +00:00
public function inherit () {
2008-05-30 11:40:08 +00:00
$this -> _checkArgs ( 3 , 'inherit' );
extract ( $this -> __getParams ());
if ( $this -> Acl -> inherit ( $aro , $aco , $action )) {
2010-04-15 15:43:39 +00:00
$this -> out ( __ ( 'Permission inherited.' ), true );
2008-05-30 11:40:08 +00:00
} else {
2010-04-15 15:43:39 +00:00
$this -> out ( __ ( 'Permission was not inherited.' ), true );
2008-05-30 11:40:08 +00:00
}
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Show a specific ARO / ACO node .
*
*/
2010-04-05 03:19:38 +00:00
public function view () {
2008-05-30 11:40:08 +00:00
$this -> _checkArgs ( 1 , 'view' );
$this -> checkNodeType ();
extract ( $this -> __dataVars ());
2009-08-06 03:41:25 +00:00
2009-08-07 12:32:27 +00:00
if ( isset ( $this -> args [ 1 ])) {
$identity = $this -> parseIdentifier ( $this -> args [ 1 ]);
$topNode = $this -> Acl -> { $class } -> find ( 'first' , array (
'conditions' => array ( $class . '.id' => $this -> _getNodeId ( $class , $identity ))
));
$nodes = $this -> Acl -> { $class } -> find ( 'all' , array (
'conditions' => array (
$class . '.lft >=' => $topNode [ $class ][ 'lft' ],
$class . '.lft <=' => $topNode [ $class ][ 'rght' ]
),
'order' => $class . '.lft ASC'
));
2008-05-30 11:40:08 +00:00
} else {
2009-08-07 12:32:27 +00:00
$nodes = $this -> Acl -> { $class } -> find ( 'all' , array ( 'order' => $class . '.lft ASC' ));
2008-05-30 11:40:08 +00:00
}
2009-08-06 03:41:25 +00:00
2008-05-30 11:40:08 +00:00
if ( empty ( $nodes )) {
if ( isset ( $this -> args [ 1 ])) {
2010-04-15 15:43:39 +00:00
$this -> error ( sprintf ( __ ( '%s not found' ), $this -> args [ 1 ]), __ ( 'No tree returned.' ));
2008-05-30 11:40:08 +00:00
} elseif ( isset ( $this -> args [ 0 ])) {
2010-04-15 15:43:39 +00:00
$this -> error ( sprintf ( __ ( '%s not found' ), $this -> args [ 0 ]), __ ( 'No tree returned.' ));
2008-05-30 11:40:08 +00:00
}
}
$this -> out ( $class . " tree: " );
$this -> hr ();
2009-08-06 03:41:25 +00:00
2008-05-30 11:40:08 +00:00
$stack = array ();
$last = null ;
2009-08-06 03:41:25 +00:00
2008-05-30 11:40:08 +00:00
foreach ( $nodes as $n ) {
$stack [] = $n ;
if ( ! empty ( $last )) {
$end = end ( $stack );
if ( $end [ $class ][ 'rght' ] > $last ) {
foreach ( $stack as $k => $v ) {
$end = end ( $stack );
if ( $v [ $class ][ 'rght' ] < $end [ $class ][ 'rght' ]) {
unset ( $stack [ $k ]);
}
}
}
}
2009-08-06 03:41:25 +00:00
$last = $n [ $class ][ 'rght' ];
$count = count ( $stack );
$this -> _outputNode ( $class , $n , $count );
2008-05-30 11:40:08 +00:00
}
$this -> hr ();
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Initialize ACL database .
*
*/
2010-04-05 03:19:38 +00:00
public function initdb () {
2010-04-22 03:28:40 +00:00
$this -> Dispatch -> args = array ( 'schema' , 'create' , 'DbAcl' );
2008-05-30 11:40:08 +00:00
$this -> Dispatch -> dispatch ();
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Show help screen .
*
*/
2010-04-05 03:19:38 +00:00
public function help () {
2009-08-02 01:23:06 +00:00
$head = " ----------------------------------------------- \n " ;
2010-04-15 15:43:39 +00:00
$head .= __ ( 'Usage: cake acl <command> <arg1> <arg2>...' ) . " \n " ;
2008-05-30 11:40:08 +00:00
$head .= " ----------------------------------------------- \n " ;
2010-04-15 15:43:39 +00:00
$head .= __ ( 'Commands:' ) . " \n " ;
2008-05-30 11:40:08 +00:00
$commands = array (
2009-08-02 01:23:06 +00:00
'create' => " create aro|aco <parent> <node> \n " .
2010-04-15 15:43:39 +00:00
" \t " . __ ( " Creates a new ACL object <node> under the parent " ) . " \n " .
" \t " . __ ( " specified by <parent>, an id/alias. " ) . " \n " .
" \t " . __ ( " The <parent> and <node> references can be " ) . " \n " .
" \t " . __ ( " in one of the following formats: " ) . " \n \n " .
" \t \t - " . __ ( " <model>.<id> - The node will be bound to a " ) . " \n " .
" \t \t " . __ ( " specific record of the given model. " ) . " \n \n " .
" \t \t - " . __ ( " <alias> - The node will be given a string alias, " ) . " \n " .
" \t \t " . __ ( " (or path, in the case of <parent>) " ) . " \n " .
" \t \t " . __ ( " i.e. 'John'. When used with <parent>, " ) . " \n " .
" \t \t " . __ ( " this takes the form of an alias path, " ) . " \n " .
" \t \t " . __ ( " i.e. <group>/<subgroup>/<parent>. " ) . " \n \n " .
" \t " . __ ( " To add a node at the root level, " ) . " \n " .
" \t " . __ ( " enter 'root' or '/' as the <parent> parameter. " ) . " \n " ,
2009-08-02 01:23:06 +00:00
'delete' => " delete aro|aco <node> \n " .
2010-04-15 15:43:39 +00:00
" \t " . __ ( " Deletes the ACL object with the given <node> reference " ) . " \n " .
" \t " . __ ( " For more detailed parameter usage info, " ) . " \n " .
" \t " . __ ( " see help for the 'create' command. " ),
2009-08-02 01:23:06 +00:00
2009-08-06 03:41:25 +00:00
'setparent' => " setParent aro|aco <node> <parent node> \n " .
2010-04-15 15:43:39 +00:00
" \t " . __ ( " Moves the ACL object specified by <node> beneath " ) . " \n " .
" \t " . __ ( " the parent ACL object specified by <parent>. " ) . " \n " .
" \t " . __ ( " For more detailed parameter usage info, " ) . " \n " .
" \t " . __ ( " see help for the 'create' command. " ),
2009-08-02 01:23:06 +00:00
'getpath' => " getPath aro|aco <node> \n " .
2010-04-15 15:43:39 +00:00
" \t " . __ ( " Returns the path to the ACL object specified by <node>. This command " ) . " \n " .
" \t " . __ ( " is useful in determining the inhertiance of permissions for a certain " ) . " \n " .
" \t " . __ ( " object in the tree. " ) . " \n " .
" \t " . __ ( " For more detailed parameter usage info, " ) . " \n " .
" \t " . __ ( " see help for the 'create' command. " ),
'check' => " check <node> <node> [<aco_action>] " . __ ( " or " ) . " all \n " .
" \t " . __ ( " Use this command to check ACL permissions. " ) . " \n " .
" \t " . __ ( " For more detailed parameter usage info, " ) . " \n " .
" \t " . __ ( " see help for the 'create' command. " ),
'grant' => " grant <node> <node> [<aco_action>] " . __ ( " or " ) . " all \n " .
" \t " . __ ( " Use this command to grant ACL permissions. Once executed, the ARO " ) . " \n " .
" \t " . __ ( " specified (and its children, if any) will have ALLOW access to the " ) . " \n " .
" \t " . __ ( " specified ACO action (and the ACO's children, if any). " ) . " \n " .
" \t " . __ ( " For more detailed parameter usage info, " ) . " \n " .
" \t " . __ ( " see help for the 'create' command. " ),
'deny' => " deny <node> <node> [<aco_action>] " . __ ( " or " ) . " all \n " .
" \t " . __ ( " Use this command to deny ACL permissions. Once executed, the ARO " ) . " \n " .
" \t " . __ ( " specified (and its children, if any) will have DENY access to the " ) . " \n " .
" \t " . __ ( " specified ACO action (and the ACO's children, if any). " ) . " \n " .
" \t " . __ ( " For more detailed parameter usage info, " ) . " \n " .
" \t " . __ ( " see help for the 'create' command. " ),
'inherit' => " inherit <node> <node> [<aco_action>] " . __ ( " or " ) . " all \n " .
" \t " . __ ( " Use this command to force a child ARO object to inherit its " ) . " \n " .
" \t " . __ ( " permissions settings from its parent. " ) . " \n " .
" \t " . __ ( " For more detailed parameter usage info, " ) . " \n " .
" \t " . __ ( " see help for the 'create' command. " ),
2009-08-02 01:23:06 +00:00
'view' => " view aro|aco [<node>] \n " .
2010-04-15 15:43:39 +00:00
" \t " . __ ( " The view command will return the ARO or ACO tree. " ) . " \n " .
" \t " . __ ( " The optional node parameter allows you to return " ) . " \n " .
" \t " . __ ( " only a portion of the requested tree. " ) . " \n " .
" \t " . __ ( " For more detailed parameter usage info, " ) . " \n " .
" \t " . __ ( " see help for the 'create' command. " ),
2009-08-02 01:23:06 +00:00
'initdb' => " initdb \n " .
2010-04-15 15:43:39 +00:00
" \t " . __ ( " Uses this command : cake schema run create DbAcl " ),
2009-08-02 01:23:06 +00:00
'help' => " help [<command>] \n " .
2010-04-15 15:43:39 +00:00
" \t " . __ ( " Displays this help message, or a message on a specific command. " )
2008-05-30 11:40:08 +00:00
);
$this -> out ( $head );
if ( ! isset ( $this -> args [ 0 ])) {
foreach ( $commands as $cmd ) {
$this -> out ( " { $cmd } \n \n " );
}
2009-08-02 01:23:06 +00:00
} elseif ( isset ( $commands [ strtolower ( $this -> args [ 0 ])])) {
$this -> out ( $commands [ strtolower ( $this -> args [ 0 ])] . " \n \n " );
2008-05-30 11:40:08 +00:00
} else {
2010-04-15 15:43:39 +00:00
$this -> out ( sprintf ( __ ( " Command '%s' not found " ), $this -> args [ 0 ]));
2008-05-30 11:40:08 +00:00
}
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Check that first argument specifies a valid Node type ( ARO / ACO )
*
*/
2010-04-05 03:19:38 +00:00
public function checkNodeType () {
2008-05-30 11:40:08 +00:00
if ( ! isset ( $this -> args [ 0 ])) {
return false ;
}
if ( $this -> args [ 0 ] != 'aco' && $this -> args [ 0 ] != 'aro' ) {
2010-04-15 15:43:39 +00:00
$this -> error ( sprintf ( __ ( " Missing/Unknown node type: '%s' " ), $this -> args [ 0 ]), __ ( 'Please specify which ACL object type you wish to create. Either "aro" or "aco"' ));
2008-05-30 11:40:08 +00:00
}
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Checks that given node exists
*
* @ param string $type Node type ( ARO / ACO )
* @ param integer $id Node id
* @ return boolean Success
*/
2010-04-05 03:19:38 +00:00
public function nodeExists () {
2008-05-30 11:40:08 +00:00
if ( ! $this -> checkNodeType () && ! isset ( $this -> args [ 1 ])) {
return false ;
}
extract ( $this -> __dataVars ( $this -> args [ 0 ]));
2009-08-02 00:17:44 +00:00
$key = is_numeric ( $this -> args [ 1 ]) ? $secondary_id : 'alias' ;
2008-05-30 11:40:08 +00:00
$conditions = array ( $class . '.' . $key => $this -> args [ 1 ]);
$possibility = $this -> Acl -> { $class } -> find ( 'all' , compact ( 'conditions' ));
if ( empty ( $possibility )) {
2010-04-15 15:43:39 +00:00
$this -> error ( sprintf ( __ ( '%s not found' ), $this -> args [ 1 ]), __ ( 'No tree returned.' ));
2008-05-30 11:40:08 +00:00
}
return $possibility ;
}
2009-07-24 19:18:37 +00:00
2009-08-01 22:57:54 +00:00
/**
* Parse an identifier into Model . foriegnKey or an alias .
* Takes an identifier determines its type and returns the result as used by other methods .
*
* @ param string $identifier Identifier to parse
* @ return mixed a string for aliases , and an array for model . foreignKey
2009-11-14 12:19:25 +00:00
*/
2009-08-01 22:57:54 +00:00
function parseIdentifier ( $identifier ) {
if ( preg_match ( '/^([\w]+)\.(.*)$/' , $identifier , $matches )) {
return array (
'model' => $matches [ 1 ],
'foreign_key' => $matches [ 2 ],
);
}
return $identifier ;
}
2009-08-02 00:17:44 +00:00
/**
* Get the node for a given identifier . $identifier can either be a string alias
* or an array of properties to use in AcoNode :: node ()
*
* @ param string $class Class type you want ( Aro / Aco )
* @ param mixed $identifier A mixed identifier for finding the node .
* @ return int Integer of NodeId . Will trigger an error if nothing is found .
2009-11-14 12:19:25 +00:00
*/
2009-08-02 00:17:44 +00:00
function _getNodeId ( $class , $identifier ) {
$node = $this -> Acl -> { $class } -> node ( $identifier );
if ( empty ( $node )) {
2009-08-02 00:21:22 +00:00
if ( is_array ( $identifier )) {
$identifier = var_export ( $identifier , true );
}
2010-04-15 15:43:39 +00:00
$this -> error ( sprintf ( __ ( 'Could not find node using reference "%s"' ), $identifier ));
2009-08-02 00:17:44 +00:00
}
return Set :: extract ( $node , " 0. { $class } .id " );
}
2008-05-30 11:40:08 +00:00
/**
* get params for standard Acl methods
*
* @ return array aro , aco , action
* @ access private
*/
function __getParams () {
2009-08-05 04:23:59 +00:00
$aro = is_numeric ( $this -> args [ 0 ]) ? intval ( $this -> args [ 0 ]) : $this -> args [ 0 ];
$aco = is_numeric ( $this -> args [ 1 ]) ? intval ( $this -> args [ 1 ]) : $this -> args [ 1 ];
2010-01-15 03:15:06 +00:00
$aroName = $aro ;
$acoName = $aco ;
2009-08-07 12:32:27 +00:00
2009-08-05 04:23:59 +00:00
if ( is_string ( $aro )) {
$aro = $this -> parseIdentifier ( $aro );
2008-05-30 11:40:08 +00:00
}
2009-08-05 04:23:59 +00:00
if ( is_string ( $aco )) {
$aco = $this -> parseIdentifier ( $aco );
2008-05-30 11:40:08 +00:00
}
$action = null ;
if ( isset ( $this -> args [ 2 ])) {
$action = $this -> args [ 2 ];
if ( $action == '' || $action == 'all' ) {
$action = '*' ;
}
}
2010-01-15 03:15:06 +00:00
return compact ( 'aro' , 'aco' , 'action' , 'aroName' , 'acoName' );
2008-05-30 11:40:08 +00:00
}
/**
* Build data parameters based on node type
*
* @ param string $type Node type ( ARO / ACO )
* @ return array Variables
* @ access private
*/
function __dataVars ( $type = null ) {
if ( $type == null ) {
$type = $this -> args [ 0 ];
}
$vars = array ();
$class = ucwords ( $type );
2009-08-01 22:57:54 +00:00
$vars [ 'secondary_id' ] = ( strtolower ( $class ) == 'aro' ) ? 'foreign_key' : 'object_id' ;
2008-05-30 11:40:08 +00:00
$vars [ 'data_name' ] = $type ;
$vars [ 'table_name' ] = $type . 's' ;
$vars [ 'class' ] = $class ;
return $vars ;
}
}