diff -r 5b37998e522e -r 162c1de6545a web/lib/Zend/InfoCard/Xml/SecurityTokenReference.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/lib/Zend/InfoCard/Xml/SecurityTokenReference.php Fri Mar 11 15:05:35 2011 +0100 @@ -0,0 +1,173 @@ +asXML(); + } else if (is_string($xmlData)) { + $strXmlData = $xmlData; + } else { + throw new Zend_InfoCard_Xml_Exception("Invalid Data provided to create instance"); + } + + $sxe = simplexml_load_string($strXmlData); + + if($sxe->getName() != "SecurityTokenReference") { + throw new Zend_InfoCard_Xml_Exception("Invalid XML Block provided for SecurityTokenReference"); + } + + return simplexml_load_string($strXmlData, "Zend_InfoCard_Xml_SecurityTokenReference"); + } + + /** + * Return the Key Identifier XML Object + * + * @return Zend_InfoCard_Xml_Element + * @throws Zend_InfoCard_Xml_Exception + */ + protected function _getKeyIdentifier() + { + $this->registerXPathNamespace('o', 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'); + list($keyident) = $this->xpath('//o:KeyIdentifier'); + + if(!($keyident instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception("Failed to retrieve Key Identifier"); + } + + return $keyident; + } + + /** + * Return the Key URI identifying the thumbprint type used + * + * @return string The thumbprint type URI + * @throws Zend_InfoCard_Xml_Exception + */ + public function getKeyThumbprintType() + { + + $keyident = $this->_getKeyIdentifier(); + + $dom = self::convertToDOM($keyident); + + if(!$dom->hasAttribute('ValueType')) { + throw new Zend_InfoCard_Xml_Exception("Key Identifier did not provide a type for the value"); + } + + return $dom->getAttribute('ValueType'); + } + + + /** + * Return the thumbprint encoding type used as a URI + * + * @return string the URI of the thumbprint encoding used + * @throws Zend_InfoCard_Xml_Exception + */ + public function getKeyThumbprintEncodingType() + { + + $keyident = $this->_getKeyIdentifier(); + + $dom = self::convertToDOM($keyident); + + if(!$dom->hasAttribute('EncodingType')) { + throw new Zend_InfoCard_Xml_Exception("Unable to determine the encoding type for the key identifier"); + } + + return $dom->getAttribute('EncodingType'); + } + + /** + * Get the key reference data used to identify the public key + * + * @param bool $decode if true, will return a decoded version of the key + * @return string the key reference thumbprint, either in binary or encoded form + * @throws Zend_InfoCard_Xml_Exception + */ + public function getKeyReference($decode = true) + { + $keyIdentifier = $this->_getKeyIdentifier(); + + $dom = self::convertToDOM($keyIdentifier); + $encoded = $dom->nodeValue; + + if(empty($encoded)) { + throw new Zend_InfoCard_Xml_Exception("Could not find the Key Reference Encoded Value"); + } + + if($decode) { + + $decoded = ""; + switch($this->getKeyThumbprintEncodingType()) { + case self::ENCODING_BASE64BIN: + + if(version_compare(PHP_VERSION, "5.2.0", ">=")) { + $decoded = base64_decode($encoded, true); + } else { + $decoded = base64_decode($encoded); + } + + break; + default: + throw new Zend_InfoCard_Xml_Exception("Unknown Key Reference Encoding Type: {$this->getKeyThumbprintEncodingType()}"); + } + + if(!$decoded || empty($decoded)) { + throw new Zend_InfoCard_Xml_Exception("Failed to decode key reference"); + } + + return $decoded; + } + + return $encoded; + } +}