You've already forked joomla_test
							
							
		
			
	
	
		
			221 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			221 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|   | <?php | ||
|  | /** | ||
|  |  * @package     Joomla.Platform | ||
|  |  * @subpackage  Access | ||
|  |  * | ||
|  |  * @copyright   Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved. | ||
|  |  * @license     GNU General Public License version 2 or later; see LICENSE | ||
|  |  */ | ||
|  | 
 | ||
|  | defined('JPATH_PLATFORM') or die; | ||
|  | 
 | ||
|  | /** | ||
|  |  * JAccessRules class. | ||
|  |  * | ||
|  |  * @package     Joomla.Platform | ||
|  |  * @subpackage  Access | ||
|  |  * @since       11.4 | ||
|  |  */ | ||
|  | class JAccessRules | ||
|  | { | ||
|  | 	/** | ||
|  | 	 * A named array. | ||
|  | 	 * | ||
|  | 	 * @var    array | ||
|  | 	 * @since  11.1 | ||
|  | 	 */ | ||
|  | 	protected $data = array(); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Constructor. | ||
|  | 	 * | ||
|  | 	 * The input array must be in the form: array('action' => array(-42 => true, 3 => true, 4 => false)) | ||
|  | 	 * or an equivalent JSON encoded string, or an object where properties are arrays. | ||
|  | 	 * | ||
|  | 	 * @param   mixed  $input  A JSON format string (probably from the database) or a nested array. | ||
|  | 	 * | ||
|  | 	 * @since   11.1 | ||
|  | 	 */ | ||
|  | 	public function __construct($input = '') | ||
|  | 	{ | ||
|  | 		// Convert in input to an array.
 | ||
|  | 		if (is_string($input)) | ||
|  | 		{ | ||
|  | 			$input = json_decode($input, true); | ||
|  | 		} | ||
|  | 		elseif (is_object($input)) | ||
|  | 		{ | ||
|  | 			$input = (array) $input; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		if (is_array($input)) | ||
|  | 		{ | ||
|  | 			// Top level keys represent the actions.
 | ||
|  | 			foreach ($input as $action => $identities) | ||
|  | 			{ | ||
|  | 				$this->mergeAction($action, $identities); | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Get the data for the action. | ||
|  | 	 * | ||
|  | 	 * @return  array  A named array of JAccessRule objects. | ||
|  | 	 * | ||
|  | 	 * @since   11.1 | ||
|  | 	 */ | ||
|  | 	public function getData() | ||
|  | 	{ | ||
|  | 		return $this->data; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Method to merge a collection of JAccessRules. | ||
|  | 	 * | ||
|  | 	 * @param   mixed  $input  JAccessRule or array of JAccessRules | ||
|  | 	 * | ||
|  | 	 * @return  void | ||
|  | 	 * | ||
|  | 	 * @since   11.1 | ||
|  | 	 */ | ||
|  | 	public function mergeCollection($input) | ||
|  | 	{ | ||
|  | 		// Check if the input is an array.
 | ||
|  | 		if (is_array($input)) | ||
|  | 		{ | ||
|  | 			foreach ($input as $actions) | ||
|  | 			{ | ||
|  | 				$this->merge($actions); | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Method to merge actions with this object. | ||
|  | 	 * | ||
|  | 	 * @param   mixed  $actions  JAccessRule object, an array of actions or a JSON string array of actions. | ||
|  | 	 * | ||
|  | 	 * @return  void | ||
|  | 	 * | ||
|  | 	 * @since   11.1 | ||
|  | 	 */ | ||
|  | 	public function merge($actions) | ||
|  | 	{ | ||
|  | 		if (is_string($actions)) | ||
|  | 		{ | ||
|  | 			$actions = json_decode($actions, true); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		if (is_array($actions)) | ||
|  | 		{ | ||
|  | 			foreach ($actions as $action => $identities) | ||
|  | 			{ | ||
|  | 				$this->mergeAction($action, $identities); | ||
|  | 			} | ||
|  | 		} | ||
|  | 		elseif ($actions instanceof JAccessRules) | ||
|  | 		{ | ||
|  | 			$data = $actions->getData(); | ||
|  | 
 | ||
|  | 			foreach ($data as $name => $identities) | ||
|  | 			{ | ||
|  | 				$this->mergeAction($name, $identities); | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Merges an array of identities for an action. | ||
|  | 	 * | ||
|  | 	 * @param   string  $action      The name of the action. | ||
|  | 	 * @param   array   $identities  An array of identities | ||
|  | 	 * | ||
|  | 	 * @return  void | ||
|  | 	 * | ||
|  | 	 * @since   11.1 | ||
|  | 	 */ | ||
|  | 	public function mergeAction($action, $identities) | ||
|  | 	{ | ||
|  | 		if (isset($this->data[$action])) | ||
|  | 		{ | ||
|  | 			// If exists, merge the action.
 | ||
|  | 			$this->data[$action]->mergeIdentities($identities); | ||
|  | 		} | ||
|  | 		else | ||
|  | 		{ | ||
|  | 			// If new, add the action.
 | ||
|  | 			$this->data[$action] = new JAccessRule($identities); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Checks that an action can be performed by an identity. | ||
|  | 	 * | ||
|  | 	 * The identity is an integer where +ve represents a user group, | ||
|  | 	 * and -ve represents a user. | ||
|  | 	 * | ||
|  | 	 * @param   string  $action    The name of the action. | ||
|  | 	 * @param   mixed   $identity  An integer representing the identity, or an array of identities | ||
|  | 	 * | ||
|  | 	 * @return  mixed   Object or null if there is no information about the action. | ||
|  | 	 * | ||
|  | 	 * @since   11.1 | ||
|  | 	 */ | ||
|  | 	public function allow($action, $identity) | ||
|  | 	{ | ||
|  | 		// Check we have information about this action.
 | ||
|  | 		if (isset($this->data[$action])) | ||
|  | 		{ | ||
|  | 			return $this->data[$action]->allow($identity); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		return null; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Get the allowed actions for an identity. | ||
|  | 	 * | ||
|  | 	 * @param   mixed  $identity  An integer representing the identity or an array of identities | ||
|  | 	 * | ||
|  | 	 * @return  JObject  Allowed actions for the identity or identities | ||
|  | 	 * | ||
|  | 	 * @since   11.1 | ||
|  | 	 */ | ||
|  | 	public function getAllowed($identity) | ||
|  | 	{ | ||
|  | 		// Sweep for the allowed actions.
 | ||
|  | 		$allowed = new JObject; | ||
|  | 
 | ||
|  | 		foreach ($this->data as $name => &$action) | ||
|  | 		{ | ||
|  | 			if ($action->allow($identity)) | ||
|  | 			{ | ||
|  | 				$allowed->set($name, true); | ||
|  | 			} | ||
|  | 		} | ||
|  | 		return $allowed; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Magic method to convert the object to JSON string representation. | ||
|  | 	 * | ||
|  | 	 * @return  string  JSON representation of the actions array | ||
|  | 	 * | ||
|  | 	 * @since   11.1 | ||
|  | 	 */ | ||
|  | 	public function __toString() | ||
|  | 	{ | ||
|  | 		$temp = array(); | ||
|  | 
 | ||
|  | 		foreach ($this->data as $name => $rule) | ||
|  | 		{ | ||
|  | 			// Convert the action to JSON, then back into an array otherwise
 | ||
|  | 			// re-encoding will quote the JSON for the identities in the action.
 | ||
|  | 			$temp[$name] = json_decode((string) $rule); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		return json_encode($temp); | ||
|  | 	} | ||
|  | } |