| 
									
										
										
										
											2011-06-26 10:44:28 +00:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Classes and functions for communication of Data Stores | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @author The phpLDAPadmin development team | 
					
						
							|  |  |  |  * @package phpLDAPadmin | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * This abstract class provides the basic variables and methods. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @package phpLDAPadmin | 
					
						
							|  |  |  |  * @subpackage DataStore | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | abstract class DS { | 
					
						
							|  |  |  | 	# ID of this db.
 | 
					
						
							|  |  |  | 	protected $index; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	# Configuration paramters.
 | 
					
						
							|  |  |  | 	protected $default; | 
					
						
							|  |  |  | 	protected $custom; | 
					
						
							|  |  |  | 	protected $type; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	abstract function __construct($index); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * This will make the connection to the datasource | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	abstract protected function connect($method,$debug=false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Login to the datastore | 
					
						
							|  |  |  | 	 *  method: default = anon, connect to ds using bind_id not auth_id. | 
					
						
							|  |  |  | 	 *  method: 'user', connect with auth_id | 
					
						
							|  |  |  | 	 *  method: '<freetext>', any custom extra connection to ds. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	abstract public function login($user=null,$pass=null,$method=null); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Query the datasource | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	abstract public function query($query,$method,$index=null,$debug=false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Return error details from previous operation | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	abstract protected function getErrorMessage(); | 
					
						
							|  |  |  | 	abstract protected function getErrorNum(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Functions that set and verify object configuration details | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function setDefaults($defaults) { | 
					
						
							|  |  |  | 		foreach ($defaults as $key => $details) | 
					
						
							|  |  |  | 			foreach ($details as $setting => $value) | 
					
						
							|  |  |  | 				$this->default->{$key}[$setting] = $value; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function isDefaultKey($key) { | 
					
						
							|  |  |  | 		return isset($this->default->$key); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function isDefaultSetting($key,$setting) { | 
					
						
							|  |  |  | 		return array_key_exists($setting,$this->default->{$key}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Return a configuration value | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getValue($key,$setting,$fatal=true) { | 
					
						
							|  |  |  | 		if (defined('DEBUG_ENABLED') && DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | 
					
						
							|  |  |  | 			debug_log('Entered (%%)',17,1,__FILE__,__LINE__,__METHOD__,$fargs); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (isset($this->custom->{$key}[$setting])) | 
					
						
							|  |  |  | 			return $this->custom->{$key}[$setting]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		elseif (isset($this->default->{$key}[$setting]) && array_key_exists('default',$this->default->{$key}[$setting])) | 
					
						
							|  |  |  | 			return $this->default->{$key}[$setting]['default']; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		elseif ($fatal) | 
					
						
							|  |  |  | 			debug_dump_backtrace("Error trying to get a non-existant value ($key,$setting)",1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			return null; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Set a configuration value | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function setValue($key,$setting,$value) { | 
					
						
							|  |  |  | 		if (isset($this->custom->{$key}[$setting])) | 
					
						
							|  |  |  | 			system_message(array( | 
					
						
							| 
									
										
										
										
											2011-07-08 08:29:26 +00:00
										 |  |  | 				'title'=>('Configuration setting already defined.'), | 
					
						
							| 
									
										
										
										
											2011-06-26 10:44:28 +00:00
										 |  |  | 				'body'=>sprintf('A call has been made to reset a configuration value (%s,%s,%s)', | 
					
						
							|  |  |  | 					$key,$setting,$value), | 
					
						
							|  |  |  | 				'type'=>'info')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->custom->{$key}[$setting] = $value; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Return the untested config items | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function untested() { | 
					
						
							|  |  |  | 		$result = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		foreach ($this->default as $option => $details) | 
					
						
							|  |  |  | 			foreach ($details as $param => $values) | 
					
						
							|  |  |  | 				if (isset($values['untested']) && $values['untested']) | 
					
						
							|  |  |  | 					array_push($result,sprintf('%s.%s',$option,$param)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return $result; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Get the name of this datastore | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getName() { | 
					
						
							|  |  |  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | 
					
						
							|  |  |  | 			debug_log('Entered (%%)',17,0,__FILE__,__LINE__,__METHOD__,$fargs); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return $this->getValue('server','name'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Functions that enable login and logout of the application | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Return the authentication type for this object | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getAuthType() { | 
					
						
							|  |  |  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | 
					
						
							|  |  |  | 			debug_log('Entered (%%)',17,0,__FILE__,__LINE__,__METHOD__,$fargs); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		switch ($this->getValue('login','auth_type')) { | 
					
						
							|  |  |  | 			case 'cookie': | 
					
						
							|  |  |  | 			case 'config': | 
					
						
							|  |  |  | 			case 'http': | 
					
						
							|  |  |  | 			case 'proxy': | 
					
						
							|  |  |  | 			case 'session': | 
					
						
							|  |  |  | 			case 'sasl': | 
					
						
							|  |  |  | 				return $this->getValue('login','auth_type'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			default: | 
					
						
							|  |  |  | 				die(sprintf('Error: <b>%s</b> hasnt been configured for auth_type <b>%s</b>',__METHOD__, | 
					
						
							|  |  |  | 					$this->getValue('login','auth_type'))); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Get the login name of the user logged into this datastore's connection method | 
					
						
							|  |  |  | 	 * If this returns null, we are not logged in. | 
					
						
							|  |  |  | 	 * If this returns '', we are logged in with anonymous | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getLogin($method=null) { | 
					
						
							|  |  |  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | 
					
						
							|  |  |  | 			debug_log('Entered (%%)',17,0,__FILE__,__LINE__,__METHOD__,$fargs); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$method = $this->getMethod($method); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		# For anonymous binds
 | 
					
						
							|  |  |  | 		if ($method == 'anon') | 
					
						
							|  |  |  | 			if (isset($_SESSION['USER'][$this->index][$method]['name'])) | 
					
						
							|  |  |  | 				return ''; | 
					
						
							|  |  |  | 			else | 
					
						
							|  |  |  | 				return null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		switch ($this->getAuthType()) { | 
					
						
							|  |  |  | 			case 'cookie': | 
					
						
							|  |  |  | 				if (! isset($_COOKIE[$method.'-USER'])) | 
					
						
							|  |  |  | 					# If our bind_id is set, we'll pass that back for logins.
 | 
					
						
							|  |  |  | 					return (! is_null($this->getValue('login','bind_id')) && $method == 'login') ? $this->getValue('login','bind_id') : null; | 
					
						
							|  |  |  | 				else | 
					
						
							|  |  |  | 					return blowfish_decrypt($_COOKIE[$method.'-USER']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case 'config': | 
					
						
							|  |  |  | 				if (! isset($_SESSION['USER'][$this->index][$method]['name'])) | 
					
						
							|  |  |  | 					return $this->getValue('login','bind_id'); | 
					
						
							|  |  |  | 				else | 
					
						
							|  |  |  | 					return blowfish_decrypt($_SESSION['USER'][$this->index][$method]['name']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case 'proxy': | 
					
						
							|  |  |  | 				if (! isset($_SESSION['USER'][$this->index][$method]['proxy'])) | 
					
						
							|  |  |  | 					return $this->getValue('login','bind_id'); | 
					
						
							|  |  |  | 				else | 
					
						
							|  |  |  | 					return blowfish_decrypt($_SESSION['USER'][$this->index][$method]['proxy']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case 'http': | 
					
						
							|  |  |  | 			case 'session': | 
					
						
							|  |  |  | 			case 'sasl': | 
					
						
							|  |  |  | 				if (! isset($_SESSION['USER'][$this->index][$method]['name'])) | 
					
						
							|  |  |  | 					# If our bind_id is set, we'll pass that back for logins.
 | 
					
						
							|  |  |  | 					return (! is_null($this->getValue('login','bind_id')) && $method == 'login') ? $this->getValue('login','bind_id') : null; | 
					
						
							|  |  |  | 				else | 
					
						
							|  |  |  | 					return blowfish_decrypt($_SESSION['USER'][$this->index][$method]['name']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			default: | 
					
						
							|  |  |  | 				die(sprintf('Error: %s hasnt been configured for auth_type %s',__METHOD__,$this->getAuthType())); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Set the login details of the user logged into this datastore's connection method | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	protected function setLogin($user,$pass,$method=null) { | 
					
						
							|  |  |  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | 
					
						
							|  |  |  | 			debug_log('Entered (%%)',17,0,__FILE__,__LINE__,__METHOD__,$fargs); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$method = $this->getMethod($method); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		switch ($this->getAuthType()) { | 
					
						
							|  |  |  | 			case 'cookie': | 
					
						
							|  |  |  | 				set_cookie($method.'-USER',blowfish_encrypt($user),NULL,'/'); | 
					
						
							|  |  |  | 				set_cookie($method.'-PASS',blowfish_encrypt($pass),NULL,'/'); | 
					
						
							|  |  |  | 				return true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case 'config': | 
					
						
							|  |  |  | 				return true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case 'proxy': | 
					
						
							|  |  |  | 				if (isset($_SESSION['USER'][$this->index][$method]['proxy'])) | 
					
						
							|  |  |  | 					unset($_SESSION['USER'][$this->index][$method]['proxy']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case 'http': | 
					
						
							|  |  |  | 			case 'session': | 
					
						
							|  |  |  | 			case 'sasl': | 
					
						
							|  |  |  | 				$_SESSION['USER'][$this->index][$method]['name'] = blowfish_encrypt($user); | 
					
						
							|  |  |  | 				$_SESSION['USER'][$this->index][$method]['pass'] = blowfish_encrypt($pass); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				return true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			default: | 
					
						
							|  |  |  | 				die(sprintf('Error: %s hasnt been configured for auth_type %s',__METHOD__,$this->getAuthType())); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Get the login password of the user logged into this datastore's connection method | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	protected function getPassword($method=null) { | 
					
						
							|  |  |  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | 
					
						
							|  |  |  | 			debug_log('Entered (%%)',17,0,__FILE__,__LINE__,__METHOD__,$fargs); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$method = $this->getMethod($method); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		# For anonymous binds
 | 
					
						
							|  |  |  | 		if ($method == 'anon') | 
					
						
							|  |  |  | 			if (isset($_SESSION['USER'][$this->index][$method]['name'])) | 
					
						
							|  |  |  | 				return ''; | 
					
						
							|  |  |  | 			else | 
					
						
							|  |  |  | 				return null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		switch ($this->getAuthType()) { | 
					
						
							|  |  |  | 			case 'cookie': | 
					
						
							|  |  |  | 				if (! isset($_COOKIE[$method.'-PASS'])) | 
					
						
							|  |  |  | 					# If our bind_id is set, we'll pass that back for logins.
 | 
					
						
							|  |  |  | 					return (! is_null($this->getValue('login','bind_pass')) && $method == 'login') ? $this->getValue('login','bind_pass') : null; | 
					
						
							|  |  |  | 				else | 
					
						
							|  |  |  | 					return blowfish_decrypt($_COOKIE[$method.'-PASS']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case 'config': | 
					
						
							|  |  |  | 			case 'proxy': | 
					
						
							|  |  |  | 				if (! isset($_SESSION['USER'][$this->index][$method]['pass'])) | 
					
						
							|  |  |  | 					return $this->getValue('login','bind_pass'); | 
					
						
							|  |  |  | 				else | 
					
						
							|  |  |  | 					return blowfish_decrypt($_SESSION['USER'][$this->index][$method]['pass']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case 'http': | 
					
						
							|  |  |  | 			case 'session': | 
					
						
							|  |  |  | 			case 'sasl': | 
					
						
							|  |  |  | 				if (! isset($_SESSION['USER'][$this->index][$method]['pass'])) | 
					
						
							|  |  |  | 					# If our bind_pass is set, we'll pass that back for logins.
 | 
					
						
							|  |  |  | 					return (! is_null($this->getValue('login','bind_pass')) && $method == 'login') ? $this->getValue('login','bind_pass') : null; | 
					
						
							|  |  |  | 				else | 
					
						
							|  |  |  | 					return blowfish_decrypt($_SESSION['USER'][$this->index][$method]['pass']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			default: | 
					
						
							|  |  |  | 				die(sprintf('Error: %s hasnt been configured for auth_type %s',__METHOD__,$this->getAuthType())); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Return if this datastore's connection method has been logged into | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function isLoggedIn($method=null) { | 
					
						
							|  |  |  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | 
					
						
							|  |  |  | 			debug_log('Entered (%%)',17,0,__FILE__,__LINE__,__METHOD__,$fargs); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		static $CACHE = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$method = $this->getMethod($method); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (isset($CACHE[$this->index][$method]) && ! is_null($CACHE[$this->index][$method])) | 
					
						
							|  |  |  | 			return $CACHE[$this->index][$method]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$CACHE[$this->index][$method] = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		# For some authentication types, we need to do the login here
 | 
					
						
							|  |  |  | 		switch ($this->getAuthType()) { | 
					
						
							|  |  |  | 			case 'config': | 
					
						
							|  |  |  | 				if (! $CACHE[$this->index][$method] = $this->login($this->getLogin($method),$this->getPassword($method),$method)) | 
					
						
							|  |  |  | 					system_message(array( | 
					
						
							| 
									
										
										
										
											2011-07-15 18:10:43 +00:00
										 |  |  | 						'title'=>('Unable to login.'), | 
					
						
							|  |  |  | 						'body'=>('Your configuration file has authentication set to CONFIG based authentication, however, the userid/password failed to login'), | 
					
						
							| 
									
										
										
										
											2011-06-26 10:44:28 +00:00
										 |  |  | 						'type'=>'error')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case 'http': | 
					
						
							|  |  |  | 				# If our auth vars are not set, throw up a login box.
 | 
					
						
							|  |  |  | 				if (! isset($_SERVER['PHP_AUTH_USER'])) { | 
					
						
							|  |  |  | 					# If this server is not in focus, skip the basic auth prompt.
 | 
					
						
							|  |  |  | 					if (get_request('server_id','REQUEST') != $this->getIndex()) { | 
					
						
							|  |  |  | 						$CACHE[$this->index][$method] = false; | 
					
						
							|  |  |  | 						break; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					header(sprintf('WWW-Authenticate: Basic realm="%s %s"',app_name(),_('login'))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					if ($_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.0') | 
					
						
							|  |  |  | 						header('HTTP/1.0 401 Unauthorized'); // http 1.0 method
 | 
					
						
							|  |  |  | 					else | 
					
						
							|  |  |  | 						header('Status: 401 Unauthorized'); // http 1.1 method
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					# If we still dont have login details...
 | 
					
						
							|  |  |  | 					if (! isset($_SERVER['PHP_AUTH_USER'])) { | 
					
						
							|  |  |  | 						system_message(array( | 
					
						
							| 
									
										
										
										
											2011-07-15 18:10:43 +00:00
										 |  |  | 							'title'=>('Unable to login.'), | 
					
						
							|  |  |  | 							'body'=>('Your configuration file has authentication set to HTTP based authentication, however, there was none presented'), | 
					
						
							| 
									
										
										
										
											2011-06-26 10:44:28 +00:00
										 |  |  | 							'type'=>'error')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						$CACHE[$this->index][$method] = false; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				# Check our auth vars are valid.
 | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					if (! $this->login($_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW'],$method)) { | 
					
						
							|  |  |  | 						system_message(array( | 
					
						
							| 
									
										
										
										
											2011-07-15 18:10:43 +00:00
										 |  |  | 							'title'=>('Unable to login.'), | 
					
						
							|  |  |  | 							'body'=>('Your HTTP based authentication is not accepted by the LDAP server'), | 
					
						
							| 
									
										
										
										
											2011-06-26 10:44:28 +00:00
										 |  |  | 							'type'=>'error')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						$CACHE[$this->index][$method] = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					} else | 
					
						
							|  |  |  | 						$CACHE[$this->index][$method] = true; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case 'proxy': | 
					
						
							|  |  |  | 				$CACHE[$this->index][$method] = $this->login($this->getValue('login','bind_id'),$this->getValue('login','bind_pass'),$method); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case 'sasl': | 
					
						
							|  |  |  | 				# Propogate any given Kerberos credential cache location
 | 
					
						
							|  |  |  | 				if (isset($_ENV['REDIRECT_KRB5CCNAME'])) | 
					
						
							|  |  |  | 					putenv(sprintf('KRB5CCNAME=%s',$_ENV['REDIRECT_KRB5CCNAME'])); | 
					
						
							|  |  |  | 				elseif (isset($_SERVER['KRB5CCNAME'])) | 
					
						
							|  |  |  | 					putenv(sprintf('KRB5CCNAME=%s',$_SERVER['KRB5CCNAME'])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				# Map the SASL auth ID to a DN
 | 
					
						
							|  |  |  | 				$regex = $this->getValue('login', 'sasl_dn_regex'); | 
					
						
							|  |  |  | 				$replacement = $this->getValue('login', 'sasl_dn_replacement'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if ($regex && $replacement) { | 
					
						
							|  |  |  | 					$userDN = preg_replace($regex, $replacement, $_SERVER['REMOTE_USER']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					$CACHE[$this->index][$method] = $this->login($userDN, '', $method); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				# Otherwise, use the user name as is
 | 
					
						
							|  |  |  | 				else { | 
					
						
							|  |  |  | 					$CACHE[$this->index][$method] = $this->login($_SERVER['REMOTE_USER'], '', $method); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			default: | 
					
						
							|  |  |  | 				$CACHE[$this->index][$method] = is_null($this->getLogin($method)) ? false : true; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return $CACHE[$this->index][$method]; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Logout of this datastore's connection method | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function logout($method=null) { | 
					
						
							|  |  |  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | 
					
						
							|  |  |  | 			debug_log('Entered (%%)',17,0,__FILE__,__LINE__,__METHOD__,$fargs); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$method = $this->getMethod($method); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		unset ($_SESSION['cache'][$this->index]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		switch ($this->getAuthType()) { | 
					
						
							|  |  |  | 			case 'cookie': | 
					
						
							|  |  |  | 				set_cookie($method.'-USER','',time()-3600,'/'); | 
					
						
							|  |  |  | 				set_cookie($method.'-PASS','',time()-3600,'/'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case 'config': | 
					
						
							|  |  |  | 				return true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case 'http': | 
					
						
							|  |  |  | 			case 'proxy': | 
					
						
							|  |  |  | 			case 'session': | 
					
						
							|  |  |  | 			case 'sasl': | 
					
						
							|  |  |  | 				if (isset($_SESSION['USER'][$this->index][$method])) | 
					
						
							|  |  |  | 					unset($_SESSION['USER'][$this->index][$method]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				return true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			default: | 
					
						
							|  |  |  | 				die(sprintf('Error: %s hasnt been configured for auth_type %s',__METHOD__,$this->getAuthType())); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Functions that return the condition of the datasource | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function isVisible() { | 
					
						
							|  |  |  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | 
					
						
							|  |  |  | 			debug_log('Entered (%%)',17,0,__FILE__,__LINE__,__METHOD__,$fargs); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return $this->getValue('server','visible'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function isReadOnly() { | 
					
						
							|  |  |  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | 
					
						
							|  |  |  | 			debug_log('Entered (%%)',17,0,__FILE__,__LINE__,__METHOD__,$fargs); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (! trim($this->getLogin(null)) && $_SESSION[APPCONFIG]->getValue('appearance','anonymous_bind_implies_read_only')) | 
					
						
							|  |  |  | 			return true; | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			return $this->getValue('server','read_only'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function getIndex() { | 
					
						
							|  |  |  | 		if (defined('DEBUG_ENABLED') && DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | 
					
						
							|  |  |  | 			debug_log('Entered (%%)',17,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->index); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return $this->index; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/**  | 
					
						
							|  |  |  | 	 * Work out which connection method to use. | 
					
						
							|  |  |  | 	 * If a method is passed, then it will be passed back. If no method is passed, then we'll | 
					
						
							|  |  |  | 	 * check to see if the user is logged in. If they are, then 'user' is used, otherwise | 
					
						
							|  |  |  | 	 * 'anon' is used. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param int Server ID | 
					
						
							|  |  |  | 	 * @return string Connection Method | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	protected function getMethod($method=null) { | 
					
						
							|  |  |  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | 
					
						
							|  |  |  | 			debug_log('Entered (%%)',17,0,__FILE__,__LINE__,__METHOD__,$fargs); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		static $CACHE = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		# Immediately return if method is set.
 | 
					
						
							|  |  |  | 		if (! is_null($method)) | 
					
						
							|  |  |  | 			return $method; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		# If we have been here already, then return our result
 | 
					
						
							|  |  |  | 		if (isset($CACHE[$this->index]) && ! is_null($CACHE)) | 
					
						
							|  |  |  | 			return $CACHE[$this->index]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$CACHE[$this->index] = 'anon'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if ($this->isLoggedIn('user')) | 
					
						
							|  |  |  | 			$CACHE[$this->index] = 'user'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return $CACHE[$this->index]; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * This method should be overridden in application specific ds files | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function isSessionValid() { | 
					
						
							|  |  |  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | 
					
						
							|  |  |  | 			debug_log('Entered (%%)',17,1,__FILE__,__LINE__,__METHOD__,$fargs,true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Return the time left in seconds until this connection times out. If there is not timeout, | 
					
						
							|  |  |  | 	 * this function will return null. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function inactivityTime() { | 
					
						
							|  |  |  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | 
					
						
							|  |  |  | 			debug_log('Entered (%%)',17,0,__FILE__,__LINE__,__METHOD__,$fargs); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if ($this->isLoggedIn() && ! in_array($this->getAuthType(),array('config','http'))) | 
					
						
							|  |  |  | 			return time()+($this->getValue('login','timeout')*60); | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			return null; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * The list of database sources | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @package phpLDAPadmin | 
					
						
							|  |  |  |  * @subpackage DataStore | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | class Datastore { | 
					
						
							|  |  |  | 	# Out DS index id
 | 
					
						
							|  |  |  | 	private $index; | 
					
						
							|  |  |  | 	# List of all the objects
 | 
					
						
							|  |  |  | 	private $objects = array(); | 
					
						
							|  |  |  | 	# Default settings
 | 
					
						
							|  |  |  | 	private $default; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function __construct() { | 
					
						
							|  |  |  | 		$this->default = new StdClass; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->default->server['id'] = array( | 
					
						
							|  |  |  | 			'desc'=>'Server ID', | 
					
						
							|  |  |  | 			'default'=>null); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->default->server['name'] = array( | 
					
						
							|  |  |  | 			'desc'=>'Server name', | 
					
						
							|  |  |  | 			'default'=>null); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		# Connectivity Info
 | 
					
						
							|  |  |  | 		$this->default->server['host'] = array( | 
					
						
							|  |  |  | 			'desc'=>'Host Name', | 
					
						
							|  |  |  | 			'default'=>'127.0.0.1'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->default->server['port'] = array( | 
					
						
							|  |  |  | 			'desc'=>'Port Number', | 
					
						
							|  |  |  | 			'default'=>null); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		# Read or write only access
 | 
					
						
							|  |  |  | 		$this->default->server['read_only'] = array( | 
					
						
							|  |  |  | 			'desc'=>'Server is in READ ONLY mode', | 
					
						
							|  |  |  | 			'default'=>false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->default->server['visible'] = array( | 
					
						
							|  |  |  | 			'desc'=>'Whether this server is visible', | 
					
						
							|  |  |  | 			'default'=>true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		# Authentication Information
 | 
					
						
							|  |  |  | 		$this->default->login['auth_type'] = array( | 
					
						
							|  |  |  | 			'desc'=>'Authentication Type', | 
					
						
							|  |  |  | 			'default'=>'session'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  | 		/* ID to login to this application, this assumes that there is | 
					
						
							|  |  |  | 		 * application authentication on top of authentication required to | 
					
						
							|  |  |  | 		 * access the data source ** | 
					
						
							|  |  |  | 		$this->default->login['auth_id'] = array( | 
					
						
							|  |  |  | 			'desc'=>'User Login ID to login to this DS', | 
					
						
							|  |  |  | 			'untested'=>true, | 
					
						
							|  |  |  | 			'default'=>null); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->default->login['auth_pass'] = array( | 
					
						
							|  |  |  | 			'desc'=>'User Login Password to login to this DS', | 
					
						
							|  |  |  | 			'untested'=>true, | 
					
						
							|  |  |  | 			'default'=>null); | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->default->login['auth_text'] = array( | 
					
						
							|  |  |  | 			'desc'=>'Text to show at the login prompt', | 
					
						
							|  |  |  | 			'default'=>null); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->default->login['bind_id'] = array( | 
					
						
							|  |  |  | 			'desc'=>'User Login ID to bind to this DS', | 
					
						
							|  |  |  | 			'default'=>null); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->default->login['bind_pass'] = array( | 
					
						
							|  |  |  | 			'desc'=>'User Login Password to bind to this DS', | 
					
						
							|  |  |  | 			'default'=>null); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->default->login['timeout'] = array( | 
					
						
							|  |  |  | 			'desc'=>'Session timout in seconds', | 
					
						
							|  |  |  | 			'default'=>session_cache_expire()-1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->default->login['sasl_dn_regex'] = array( | 
					
						
							|  |  |  | 			'desc'=>'SASL authorization id to user dn PCRE regular expression', | 
					
						
							|  |  |  | 			'untested'=>true, | 
					
						
							|  |  |  | 			'default'=>null); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->default->login['sasl_dn_replacement'] = array( | 
					
						
							|  |  |  | 			'desc'=>'SASL authorization id to user dn PCRE regular expression replacement string', | 
					
						
							|  |  |  | 			'untested'=>true, | 
					
						
							|  |  |  | 			'default'=>null); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		# Prefix for custom pages
 | 
					
						
							|  |  |  | 		$this->default->custom['pages_prefix'] = array( | 
					
						
							|  |  |  | 			'desc'=>'Prefix name for custom pages', | 
					
						
							|  |  |  | 			'default'=>'custom_'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Create a new database object | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function newServer($type) { | 
					
						
							|  |  |  | 		if (class_exists($type)) { | 
					
						
							|  |  |  | 			$this->index = count($this->objects)+1; | 
					
						
							|  |  |  | 			$this->objects[$this->index] = new $type($this->index); | 
					
						
							|  |  |  | 			$this->objects[$this->index]->setDefaults($this->default); | 
					
						
							|  |  |  | 			return $this->index; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			printf('ERROR: Class [%s] doesnt exist',$type); | 
					
						
							|  |  |  | 			die(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Set values for a database object. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function setValue($key,$setting,$value) { | 
					
						
							|  |  |  | 		if (! $this->objects[$this->index]->isDefaultKey($key)) | 
					
						
							|  |  |  | 			error("ERROR: Setting a key [$key] that isnt predefined.",'error',true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (! $this->objects[$this->index]->isDefaultSetting($key,$setting)) | 
					
						
							|  |  |  | 			error("ERROR: Setting a index [$key,$setting] that isnt predefined.",'error',true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		# Test if its should be an array or not.
 | 
					
						
							|  |  |  | 		if (is_array($this->objects[$this->index]->getValue($key,$setting)) && ! is_array($value)) | 
					
						
							|  |  |  | 			error("Error in configuration file, {$key}['$setting'] SHOULD be an array of values.",'error',true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (! is_array($this->objects[$this->index]->getValue($key,$setting)) && is_array($value)) | 
					
						
							|  |  |  | 			error("Error in configuration file, {$key}['$setting'] should NOT be an array of values.",'error',true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		# Store the value in the object.
 | 
					
						
							|  |  |  | 		$this->objects[$this->index]->setValue($key,$setting,$value); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Get a list of all the configured servers. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param boolean Only show visible servers. | 
					
						
							|  |  |  | 	 * @return array list of all configured servers. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getServerList($isVisible=true) { | 
					
						
							|  |  |  | 		if (defined('DEBUG_ENABLED') && DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | 
					
						
							|  |  |  | 			debug_log('Entered (%%)',17,0,__FILE__,__LINE__,__METHOD__,$fargs); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		static $CACHE; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (isset($CACHE[$isVisible])) | 
					
						
							|  |  |  | 			return $CACHE[$isVisible]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$CACHE[$isVisible] = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		# Debugging incase objects is not set.
 | 
					
						
							|  |  |  | 		if (! $this->objects) { | 
					
						
							|  |  |  | 			print "<PRE>"; | 
					
						
							|  |  |  | 			debug_print_backtrace(); | 
					
						
							|  |  |  | 			die(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		foreach ($this->objects as $id => $server) | 
					
						
							|  |  |  | 			if (! $isVisible || ($isVisible && $server->getValue('server','visible'))) | 
					
						
							|  |  |  | 				$CACHE[$isVisible][$id] = $server; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		masort($CACHE[$isVisible],'name'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return $CACHE[$isVisible]; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Return an object Instance of a configured database. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param int Index | 
					
						
							|  |  |  | 	 * @return object Datastore instance object. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function Instance($index=null) { | 
					
						
							|  |  |  | 		if (defined('DEBUG_ENABLED') && DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | 
					
						
							|  |  |  | 			debug_log('Entered (%%)',17,0,__FILE__,__LINE__,__METHOD__,$fargs); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		# If no index defined, then pick the lowest one.
 | 
					
						
							|  |  |  | 		if (is_null($index) || ! trim($index) || ! is_numeric($index)) | 
					
						
							|  |  |  | 			$index = min($this->GetServerList())->getIndex(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (! isset($this->objects[$index])) | 
					
						
							|  |  |  | 			debug_dump_backtrace(sprintf('Error: Datastore instance [%s] doesnt exist?',htmlspecialchars($index)),1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (defined('DEBUG_ENABLED') && DEBUG_ENABLED) | 
					
						
							|  |  |  | 			debug_log('Returning instance of database (%s)',3,0,__FILE__,__LINE__,__METHOD__,$index); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return $this->objects[$index]; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Return an object Instance of a configured database. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param string Name of the instance to retrieve | 
					
						
							|  |  |  | 	 * @return object Datastore instance object. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function InstanceName($name=null) { | 
					
						
							|  |  |  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | 
					
						
							|  |  |  | 			debug_log('Entered (%%)',17,0,__FILE__,__LINE__,__METHOD__,$fargs); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		foreach ($this->getServerList(false) as $index) | 
					
						
							|  |  |  | 			if ($this->objects[$index]->getName() == $name) | 
					
						
							|  |  |  | 				return $this->objects[$index]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		# If we get here, then no object with the name exists.
 | 
					
						
							|  |  |  | 		return null; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Return an object Instance of a configured database. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param string ID of the instance to retrieve | 
					
						
							|  |  |  | 	 * @return object Datastore instance object. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function InstanceId($id=null) { | 
					
						
							|  |  |  | 		if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS')) | 
					
						
							|  |  |  | 			debug_log('Entered (%%)',17,0,__FILE__,__LINE__,__METHOD__,$fargs); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		foreach ($this->getServerList(false) as $index) | 
					
						
							|  |  |  | 			if ($this->objects[$index->getIndex()]->getValue('server','id') == $id) | 
					
						
							|  |  |  | 				return $this->objects[$index->getIndex()]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		# If we get here, then no object with the name exists.
 | 
					
						
							|  |  |  | 		return null; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ?>
 |