Subversion-Projekte lars-tiefland.cakephp

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
<?php
2
/* SVN FILE: $Id: db_acl.php 8004 2009-01-16 20:15:21Z gwoo $ */
3
/**
4
 * This is core configuration file.
5
 *
6
 * Use it to configure core behaviour ofCake.
7
 *
8
 * PHP versions 4 and 5
9
 *
10
 * CakePHP(tm) :  Rapid Development Framework (http://www.cakephp.org)
11
 * Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org)
12
 *
13
 * Licensed under The MIT License
14
 * Redistributions of files must retain the above copyright notice.
15
 *
16
 * @filesource
17
 * @copyright     Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org)
18
 * @link          http://www.cakefoundation.org/projects/info/cakephp CakePHP(tm) Project
19
 * @package       cake
20
 * @subpackage    cake.cake.libs.model
21
 * @since         CakePHP(tm) v 0.2.9
22
 * @version       $Revision: 8004 $
23
 * @modifiedby    $LastChangedBy: gwoo $
24
 * @lastmodified  $Date: 2009-01-16 12:15:21 -0800 (Fri, 16 Jan 2009) $
25
 * @license       http://www.opensource.org/licenses/mit-license.php The MIT License
26
 */
27
/**
28
 * Load Model and AppModel
29
 */
30
App::import('Model', 'App');
31
/**
32
 * Short description for file.
33
 *
34
 * Long description for file
35
 *
36
 *
37
 * @package       cake
38
 * @subpackage    cake.cake.libs.model
39
 */
40
class AclNode extends AppModel {
41
/**
42
 * Explicitly disable in-memory query caching for ACL models
43
 *
44
 * @var boolean
45
 * @access public
46
 */
47
	var $cacheQueries = false;
48
/**
49
 * ACL models use the Tree behavior
50
 *
51
 * @var array
52
 * @access public
53
 */
54
	var $actsAs = array('Tree' => 'nested');
55
/**
56
 * Constructor
57
 *
58
 */
59
	function __construct() {
60
		$config = Configure::read('Acl.database');
61
		if (isset($config)) {
62
			$this->useDbConfig = $config;
63
		}
64
		parent::__construct();
65
	}
66
/**
67
 * Retrieves the Aro/Aco node for this model
68
 *
69
 * @param mixed $ref Array with 'model' and 'foreign_key', model object, or string value
70
 * @return array Node found in database
71
 * @access public
72
 */
73
	function node($ref = null) {
74
		$db =& ConnectionManager::getDataSource($this->useDbConfig);
75
		$type = $this->alias;
76
		$result = null;
77
 
78
		if (!empty($this->useTable)) {
79
			$table = $this->useTable;
80
		} else {
81
			$table = Inflector::pluralize(Inflector::underscore($type));
82
		}
83
 
84
		if (empty($ref)) {
85
			return null;
86
		} elseif (is_string($ref)) {
87
			$path = explode('/', $ref);
88
			$start = $path[0];
89
			unset($path[0]);
90
 
91
			$queryData = array(
92
				'conditions' => array(
93
					$db->name("{$type}.lft") . ' <= ' . $db->name("{$type}0.lft"),
94
					$db->name("{$type}.rght") . ' >= ' . $db->name("{$type}0.rght")),
95
				'fields' => array('id', 'parent_id', 'model', 'foreign_key', 'alias'),
96
				'joins' => array(array(
97
					'table' => $db->fullTableName($this),
98
					'alias' => "{$type}0",
99
					'type' => 'LEFT',
100
					'conditions' => array("{$type}0.alias" => $start)
101
				)),
102
				'order' => $db->name("{$type}.lft") . ' DESC'
103
			);
104
 
105
			foreach ($path as $i => $alias) {
106
				$j = $i - 1;
107
 
108
				$queryData['joins'][] = array(
109
					'table' => $db->fullTableName($this),
110
					'alias' => "{$type}{$i}",
111
					'type'  => 'LEFT',
112
					'conditions' => array(
113
						$db->name("{$type}{$i}.lft") . ' > ' . $db->name("{$type}{$j}.lft"),
114
						$db->name("{$type}{$i}.rght") . ' < ' . $db->name("{$type}{$j}.rght"),
115
						$db->name("{$type}{$i}.alias") . ' = ' . $db->value($alias, 'string')
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("Model class '$name' not found in AclNode::node() when trying to bind {$this->alias} object", 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("AclNode::node() - Couldn't find {$type} node identified by \"" . print_r($ref, true) . "\"", E_USER_WARNING);
192
			}
193
		}
194
		return $result;
195
	}
196
}
197
/**
198
 * Access Control Object
199
 *
200
 * @package       cake
201
 * @subpackage    cake.cake.libs.model
202
 */
203
class Aco extends AclNode {
204
/**
205
 * Model name
206
 *
207
 * @var string
208
 * @access public
209
 */
210
	var $name = 'Aco';
211
/**
212
 * Binds to ARO nodes through permissions settings
213
 *
214
 * @var array
215
 * @access public
216
 */
217
	var $hasAndBelongsToMany = array('Aro' => array('with' => 'Permission'));
218
}
219
/**
220
 * Action for Access Control Object
221
 *
222
 * @package       cake
223
 * @subpackage    cake.cake.libs.model
224
 */
225
class AcoAction extends AppModel {
226
/**
227
 * Model name
228
 *
229
 * @var string
230
 * @access public
231
 */
232
	var $name = 'AcoAction';
233
/**
234
 * ACO Actions belong to ACOs
235
 *
236
 * @var array
237
 * @access public
238
 */
239
	var $belongsTo = array('Aco');
240
}
241
/**
242
 * Access Request Object
243
 *
244
 * @package       cake
245
 * @subpackage    cake.cake.libs.model
246
 */
247
class Aro extends AclNode {
248
/**
249
 * Model name
250
 *
251
 * @var string
252
 * @access public
253
 */
254
	var $name = 'Aro';
255
/**
256
 * AROs are linked to ACOs by means of Permission
257
 *
258
 * @var array
259
 * @access public
260
 */
261
	var $hasAndBelongsToMany = array('Aco' => array('with' => 'Permission'));
262
}
263
/**
264
 * Permissions linking AROs with ACOs
265
 *
266
 * @package       cake
267
 * @subpackage    cake.cake.libs.model
268
 */
269
class Permission extends AppModel {
270
/**
271
 * Model name
272
 *
273
 * @var string
274
 * @access public
275
 */
276
	var $name = 'Permission';
277
/**
278
 * Explicitly disable in-memory query caching
279
 *
280
 * @var boolean
281
 * @access public
282
 */
283
	var $cacheQueries = false;
284
/**
285
 * Override default table name
286
 *
287
 * @var string
288
 * @access public
289
 */
290
	var $useTable = 'aros_acos';
291
/**
292
 * Permissions link AROs with ACOs
293
 *
294
 * @var array
295
 * @access public
296
 */
297
	var $belongsTo = array('Aro', 'Aco');
298
/**
299
 * No behaviors for this model
300
 *
301
 * @var array
302
 * @access public
303
 */
304
	var $actsAs = null;
305
/**
306
 * Constructor, used to tell this model to use the
307
 * database configured for ACL
308
 */
309
	function __construct() {
310
		$config = Configure::read('Acl.database');
311
		if (!empty($config)) {
312
			$this->useDbConfig = $config;
313
		}
314
		parent::__construct();
315
	}
316
}
317
?>