Mercurial > hg > Members > shoshi > webvirt
comparison cake/libs/model/db_acl.php @ 0:261e66bd5a0c
hg init
author | Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 24 Jul 2011 21:08:31 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:261e66bd5a0c |
---|---|
1 <?php | |
2 /** | |
3 * This is core configuration file. | |
4 * | |
5 * Use it to configure core behaviour ofCake. | |
6 * | |
7 * PHP versions 4 and 5 | |
8 * | |
9 * CakePHP(tm) : Rapid Development Framework (http://cakephp.org) | |
10 * Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) | |
11 * | |
12 * Licensed under The MIT License | |
13 * Redistributions of files must retain the above copyright notice. | |
14 * | |
15 * @copyright Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) | |
16 * @link http://cakephp.org CakePHP(tm) Project | |
17 * @package cake | |
18 * @subpackage cake.cake.libs.model | |
19 * @since CakePHP(tm) v 0.2.9 | |
20 * @license MIT License (http://www.opensource.org/licenses/mit-license.php) | |
21 */ | |
22 | |
23 /** | |
24 * Load Model and AppModel | |
25 */ | |
26 App::import('Model', 'App'); | |
27 | |
28 /** | |
29 * ACL Node | |
30 * | |
31 * | |
32 * @package cake | |
33 * @subpackage cake.cake.libs.model | |
34 */ | |
35 class AclNode extends AppModel { | |
36 | |
37 /** | |
38 * Explicitly disable in-memory query caching for ACL models | |
39 * | |
40 * @var boolean | |
41 * @access public | |
42 */ | |
43 var $cacheQueries = false; | |
44 | |
45 /** | |
46 * ACL models use the Tree behavior | |
47 * | |
48 * @var array | |
49 * @access public | |
50 */ | |
51 var $actsAs = array('Tree' => 'nested'); | |
52 | |
53 /** | |
54 * Constructor | |
55 * | |
56 */ | |
57 function __construct() { | |
58 $config = Configure::read('Acl.database'); | |
59 if (isset($config)) { | |
60 $this->useDbConfig = $config; | |
61 } | |
62 parent::__construct(); | |
63 } | |
64 | |
65 /** | |
66 * Retrieves the Aro/Aco node for this model | |
67 * | |
68 * @param mixed $ref Array with 'model' and 'foreign_key', model object, or string value | |
69 * @return array Node found in database | |
70 * @access public | |
71 */ | |
72 function node($ref = null) { | |
73 $db =& ConnectionManager::getDataSource($this->useDbConfig); | |
74 $type = $this->alias; | |
75 $result = null; | |
76 | |
77 if (!empty($this->useTable)) { | |
78 $table = $this->useTable; | |
79 } else { | |
80 $table = Inflector::pluralize(Inflector::underscore($type)); | |
81 } | |
82 | |
83 if (empty($ref)) { | |
84 return null; | |
85 } elseif (is_string($ref)) { | |
86 $path = explode('/', $ref); | |
87 $start = $path[0]; | |
88 unset($path[0]); | |
89 | |
90 $queryData = array( | |
91 'conditions' => array( | |
92 $db->name("{$type}.lft") . ' <= ' . $db->name("{$type}0.lft"), | |
93 $db->name("{$type}.rght") . ' >= ' . $db->name("{$type}0.rght")), | |
94 'fields' => array('id', 'parent_id', 'model', 'foreign_key', 'alias'), | |
95 'joins' => array(array( | |
96 'table' => $db->fullTableName($this), | |
97 'alias' => "{$type}0", | |
98 'type' => 'LEFT', | |
99 'conditions' => array("{$type}0.alias" => $start) | |
100 )), | |
101 'order' => $db->name("{$type}.lft") . ' DESC' | |
102 ); | |
103 | |
104 foreach ($path as $i => $alias) { | |
105 $j = $i - 1; | |
106 | |
107 $queryData['joins'][] = array( | |
108 'table' => $db->fullTableName($this), | |
109 'alias' => "{$type}{$i}", | |
110 'type' => 'LEFT', | |
111 'conditions' => array( | |
112 $db->name("{$type}{$i}.lft") . ' > ' . $db->name("{$type}{$j}.lft"), | |
113 $db->name("{$type}{$i}.rght") . ' < ' . $db->name("{$type}{$j}.rght"), | |
114 $db->name("{$type}{$i}.alias") . ' = ' . $db->value($alias, 'string'), | |
115 $db->name("{$type}{$j}.id") . ' = ' . $db->name("{$type}{$i}.parent_id") | |
116 ) | |
117 ); | |
118 | |
119 $queryData['conditions'] = array('or' => array( | |
120 $db->name("{$type}.lft") . ' <= ' . $db->name("{$type}0.lft") . ' AND ' . $db->name("{$type}.rght") . ' >= ' . $db->name("{$type}0.rght"), | |
121 $db->name("{$type}.lft") . ' <= ' . $db->name("{$type}{$i}.lft") . ' AND ' . $db->name("{$type}.rght") . ' >= ' . $db->name("{$type}{$i}.rght")) | |
122 ); | |
123 } | |
124 $result = $db->read($this, $queryData, -1); | |
125 $path = array_values($path); | |
126 | |
127 if ( | |
128 !isset($result[0][$type]) || | |
129 (!empty($path) && $result[0][$type]['alias'] != $path[count($path) - 1]) || | |
130 (empty($path) && $result[0][$type]['alias'] != $start) | |
131 ) { | |
132 return false; | |
133 } | |
134 } elseif (is_object($ref) && is_a($ref, 'Model')) { | |
135 $ref = array('model' => $ref->alias, 'foreign_key' => $ref->id); | |
136 } elseif (is_array($ref) && !(isset($ref['model']) && isset($ref['foreign_key']))) { | |
137 $name = key($ref); | |
138 | |
139 if (PHP5) { | |
140 $model = ClassRegistry::init(array('class' => $name, 'alias' => $name)); | |
141 } else { | |
142 $model =& ClassRegistry::init(array('class' => $name, 'alias' => $name)); | |
143 } | |
144 | |
145 if (empty($model)) { | |
146 trigger_error(sprintf(__("Model class '%s' not found in AclNode::node() when trying to bind %s object", true), $type, $this->alias), E_USER_WARNING); | |
147 return null; | |
148 } | |
149 | |
150 $tmpRef = null; | |
151 if (method_exists($model, 'bindNode')) { | |
152 $tmpRef = $model->bindNode($ref); | |
153 } | |
154 if (empty($tmpRef)) { | |
155 $ref = array('model' => $name, 'foreign_key' => $ref[$name][$model->primaryKey]); | |
156 } else { | |
157 if (is_string($tmpRef)) { | |
158 return $this->node($tmpRef); | |
159 } | |
160 $ref = $tmpRef; | |
161 } | |
162 } | |
163 if (is_array($ref)) { | |
164 if (is_array(current($ref)) && is_string(key($ref))) { | |
165 $name = key($ref); | |
166 $ref = current($ref); | |
167 } | |
168 foreach ($ref as $key => $val) { | |
169 if (strpos($key, $type) !== 0 && strpos($key, '.') === false) { | |
170 unset($ref[$key]); | |
171 $ref["{$type}0.{$key}"] = $val; | |
172 } | |
173 } | |
174 $queryData = array( | |
175 'conditions' => $ref, | |
176 'fields' => array('id', 'parent_id', 'model', 'foreign_key', 'alias'), | |
177 'joins' => array(array( | |
178 'table' => $db->fullTableName($this), | |
179 'alias' => "{$type}0", | |
180 'type' => 'LEFT', | |
181 'conditions' => array( | |
182 $db->name("{$type}.lft") . ' <= ' . $db->name("{$type}0.lft"), | |
183 $db->name("{$type}.rght") . ' >= ' . $db->name("{$type}0.rght") | |
184 ) | |
185 )), | |
186 'order' => $db->name("{$type}.lft") . ' DESC' | |
187 ); | |
188 $result = $db->read($this, $queryData, -1); | |
189 | |
190 if (!$result) { | |
191 trigger_error(sprintf(__("AclNode::node() - Couldn't find %s node identified by \"%s\"", true), $type, print_r($ref, true)), E_USER_WARNING); | |
192 } | |
193 } | |
194 return $result; | |
195 } | |
196 } | |
197 | |
198 /** | |
199 * Access Control Object | |
200 * | |
201 * @package cake | |
202 * @subpackage cake.cake.libs.model | |
203 */ | |
204 class Aco extends AclNode { | |
205 | |
206 /** | |
207 * Model name | |
208 * | |
209 * @var string | |
210 * @access public | |
211 */ | |
212 var $name = 'Aco'; | |
213 | |
214 /** | |
215 * Binds to ARO nodes through permissions settings | |
216 * | |
217 * @var array | |
218 * @access public | |
219 */ | |
220 var $hasAndBelongsToMany = array('Aro' => array('with' => 'Permission')); | |
221 } | |
222 | |
223 /** | |
224 * Action for Access Control Object | |
225 * | |
226 * @package cake | |
227 * @subpackage cake.cake.libs.model | |
228 */ | |
229 class AcoAction extends AppModel { | |
230 | |
231 /** | |
232 * Model name | |
233 * | |
234 * @var string | |
235 * @access public | |
236 */ | |
237 var $name = 'AcoAction'; | |
238 | |
239 /** | |
240 * ACO Actions belong to ACOs | |
241 * | |
242 * @var array | |
243 * @access public | |
244 */ | |
245 var $belongsTo = array('Aco'); | |
246 } | |
247 | |
248 /** | |
249 * Access Request Object | |
250 * | |
251 * @package cake | |
252 * @subpackage cake.cake.libs.model | |
253 */ | |
254 class Aro extends AclNode { | |
255 | |
256 /** | |
257 * Model name | |
258 * | |
259 * @var string | |
260 * @access public | |
261 */ | |
262 var $name = 'Aro'; | |
263 | |
264 /** | |
265 * AROs are linked to ACOs by means of Permission | |
266 * | |
267 * @var array | |
268 * @access public | |
269 */ | |
270 var $hasAndBelongsToMany = array('Aco' => array('with' => 'Permission')); | |
271 } | |
272 | |
273 /** | |
274 * Permissions linking AROs with ACOs | |
275 * | |
276 * @package cake | |
277 * @subpackage cake.cake.libs.model | |
278 */ | |
279 class Permission extends AppModel { | |
280 | |
281 /** | |
282 * Model name | |
283 * | |
284 * @var string | |
285 * @access public | |
286 */ | |
287 var $name = 'Permission'; | |
288 | |
289 /** | |
290 * Explicitly disable in-memory query caching | |
291 * | |
292 * @var boolean | |
293 * @access public | |
294 */ | |
295 var $cacheQueries = false; | |
296 | |
297 /** | |
298 * Override default table name | |
299 * | |
300 * @var string | |
301 * @access public | |
302 */ | |
303 var $useTable = 'aros_acos'; | |
304 | |
305 /** | |
306 * Permissions link AROs with ACOs | |
307 * | |
308 * @var array | |
309 * @access public | |
310 */ | |
311 var $belongsTo = array('Aro', 'Aco'); | |
312 | |
313 /** | |
314 * No behaviors for this model | |
315 * | |
316 * @var array | |
317 * @access public | |
318 */ | |
319 var $actsAs = null; | |
320 | |
321 /** | |
322 * Constructor, used to tell this model to use the | |
323 * database configured for ACL | |
324 */ | |
325 function __construct() { | |
326 $config = Configure::read('Acl.database'); | |
327 if (!empty($config)) { | |
328 $this->useDbConfig = $config; | |
329 } | |
330 parent::__construct(); | |
331 } | |
332 } |