From b6e12bedc51b56cf0f1a5930e69a4c377cd3dfe5 Mon Sep 17 00:00:00 2001 From: jrags <> Date: Thu, 21 Sep 2006 00:57:53 +0000 Subject: Added providers demo, sqlmembershipprovider sqlroleprovider both load via modules now, but are not totaly functional yet. TLogin* controls created but not functional yet. --- framework/Configuration/Provider/TProviderBase.php | 80 ++++++++++++++++++--- .../Configuration/TProtectedConfiguration.php | 84 ++++++++++++++++++++++ 2 files changed, 156 insertions(+), 8 deletions(-) create mode 100644 framework/Configuration/TProtectedConfiguration.php (limited to 'framework/Configuration') diff --git a/framework/Configuration/Provider/TProviderBase.php b/framework/Configuration/Provider/TProviderBase.php index 2d44bf39..7c5ffbb8 100644 --- a/framework/Configuration/Provider/TProviderBase.php +++ b/framework/Configuration/Provider/TProviderBase.php @@ -8,29 +8,51 @@ * @package System.Configuration.Provider * @since 3.1 */ -abstract class TProviderBase +abstract class TProviderBase extends TModule { - private $_Description; - private $_Initialized = false; + private $_description; + private $_initialized = false; private $_name; + private $_applicationName; + private $_enabled=false; public function __construct(){} public function getDescription() { - return $this->_Description; + return $this->_description; + } + public function setDescription($value) + { + $this->_description = TPropertyValue::ensureString($value); } public function getName() { return $this->_name; } - public function Initialize($name,$config) + public function getApplicationName() + { + return $this->_applicationName; + } + public function setApplicationName($value) + { + $this->_applicationName = TPropertyValue::ensureString($value); + } + public function getEnabled() { - if ($this->_Initialized) + return $this->_enabled; + } + public function setEnabled($value) + { + $this->_enabled = TPropertyValue::ensureBoolean($value); + } + public function initialize($name,$config) + { + if ($this->_initialized) { throw new TProviderException('Provider_Already_Initialized'); } - $this->_Initialized=true; + $this->_initialized=true; if ($name === null) { @@ -46,9 +68,51 @@ abstract class TProviderBase if ($config !== null && is_array($config)) { - $this->_Description = TPropertyValue::ensureString($config['description']); + $this->_description = TPropertyValue::ensureString($config['description']); unset($config['description']); } } + /** + * Generates a Universally Unique IDentifier, version 4. + * + * RFC 4122 (http://www.ietf.org/rfc/rfc4122.txt) defines a special type of Globally + * Unique IDentifiers (GUID), as well as several methods for producing them. One + * such method, described in section 4.4, is based on truly random or pseudo-random + * number generators, and is therefore implementable in a language like PHP. + * + * We choose to produce pseudo-random numbers with the Mersenne Twister, and to always + * limit single generated numbers to 16 bits (ie. the decimal value 65535). That is + * because, even on 32-bit systems, PHP's RAND_MAX will often be the maximum *signed* + * value, with only the equivalent of 31 significant bits. Producing two 16-bit random + * numbers to make up a 32-bit one is less efficient, but guarantees that all 32 bits + * are random. + * + * The algorithm for version 4 UUIDs (ie. those based on random number generators) + * states that all 128 bits separated into the various fields (32 bits, 16 bits, 16 bits, + * 8 bits and 8 bits, 48 bits) should be random, except : (a) the version number should + * be the last 4 bits in the 3rd field, and (b) bits 6 and 7 of the 4th field should + * be 01. We try to conform to that definition as efficiently as possible, generating + * smaller values where possible, and minimizing the number of base conversions. + * + * @copyright Copyright (c) CFD Labs, 2006. This function may be used freely for + * any purpose ; it is distributed without any form of warranty whatsoever. + * @author David Holmes + * + * @return string A UUID, made up of 32 hex digits and 4 hyphens. + */ + public function generateUuid() + { + // The field names refer to RFC 4122 section 4.1.2 + return sprintf('%04x%04x-%04x-%03x4-%04x-%04x%04x%04x', + mt_rand(0, 65535), mt_rand(0, 65535), // 32 bits for "time_low" + mt_rand(0, 65535), // 16 bits for "time_mid" + mt_rand(0, 4095), // 12 bits before the 0100 of (version) 4 for "time_hi_and_version" + bindec(substr_replace(sprintf('%016b', mt_rand(0, 65535)), '01', 6, 2)), + // 8 bits, the last two of which (positions 6 and 7) are 01, for "clk_seq_hi_res" + // (hence, the 2nd hex digit after the 3rd hyphen can only be 1, 5, 9 or d) + // 8 bits for "clk_seq_low" + mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535) // 48 bits for "node" + ); + } } ?> \ No newline at end of file diff --git a/framework/Configuration/TProtectedConfiguration.php b/framework/Configuration/TProtectedConfiguration.php new file mode 100644 index 00000000..da643014 --- /dev/null +++ b/framework/Configuration/TProtectedConfiguration.php @@ -0,0 +1,84 @@ + + * @version $Id: TProtectedConfiguration.php 1398 2006-09-08 19:31:03Z xue $ + * @package System.Configuration + * @since 3.1 + */ +final class TProtectedConfiguration extends TModule +{ + private $_defaultProvider; + /** + * @var array list of providers available + */ + private $_providers=array(); + /** + * @var string external configuration file + */ + private $_configFile=null; + + public function getDefaultProvider() + { + return $this->_defaultProvider; + } + public function setDefaultProvider($value) + { + $this->_defaultProvider = TPropertyValue::ensureString($value); + } + public function getProvider($value=null) + { + if ($value) + $index = $value; + else + $index = $this->_defaultProvider; + + $provider = $this->_providers[$index]; + + if (!$provider instanceof TProviderBase) + throw new TConfigurationException('protectedconfiguration_not_a_provider',$index); + + return $provider; + } + + public function init($config) + { + if($this->_configFile!==null) + { + if(is_file($this->_configFile)) + { + $dom=new TXmlDocument; + $dom->loadFromFile($this->_configFile); + $this->loadConfig($dom); + } + else + throw new TConfigurationException('protectedconfiguration_configfile_invalid',$this->_configFile); + } + $this->loadConfig($config); +// $this->getApplication()->attachEventHandler('OnEndRequest',array($this,'collectLogs')); + } + /** + * Loads configuration from an XML element + * @param TXmlElement configuration node + * @throws TConfigurationException if log route class or type is not specified + */ + private function loadConfig($xml) + { + foreach($xml->getElementsByTagName('provider') as $providerConfig) + { + $properties=$providerConfig->getAttributes(); + if(($class=$properties->remove('class'))===null) + throw new TConfigurationException('protectedconfiguration_providerclass_required'); + $provider=Prado::createComponent($class); + if(!($provider instanceof TProviderBase)) + throw new TConfigurationException('protectedconfiguration_providertype_invalid'); + foreach($properties as $name=>$value) + $provider->setSubproperty($name,$value); + $this->_providers[$provider->getId()]=$provider; + $provider->init($providerConfig); + } + } +} +?> \ No newline at end of file -- cgit v1.2.3