Upgrade Zend Framework to version 1.12.8

This commit is contained in:
Michael RICOIS 2014-09-16 08:17:36 +00:00
parent 7545fdb588
commit 90cd2f7c85
49 changed files with 0 additions and 5458 deletions

View File

@ -1,261 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Auth
* @subpackage Zend_Auth_Adapter
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: InfoCard.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* @see Zend_Auth_Adapter_Interface
*/
require_once 'Zend/Auth/Adapter/Interface.php';
/**
* @see Zend_Auth_Result
*/
require_once 'Zend/Auth/Result.php';
/**
* @see Zend_InfoCard
*/
require_once 'Zend/InfoCard.php';
/**
* A Zend_Auth Authentication Adapter allowing the use of Information Cards as an
* authentication mechanism
*
* @category Zend
* @package Zend_Auth
* @subpackage Zend_Auth_Adapter
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_Auth_Adapter_InfoCard implements Zend_Auth_Adapter_Interface
{
/**
* The XML Token being authenticated
*
* @var string
*/
protected $_xmlToken;
/**
* The instance of Zend_InfoCard
*
* @var Zend_InfoCard
*/
protected $_infoCard;
/**
* Constructor
*
* @param string $strXmlDocument The XML Token provided by the client
* @return void
*/
public function __construct($strXmlDocument)
{
$this->_xmlToken = $strXmlDocument;
$this->_infoCard = new Zend_InfoCard();
}
/**
* Sets the InfoCard component Adapter to use
*
* @param Zend_InfoCard_Adapter_Interface $a
* @return Zend_Auth_Adapter_InfoCard Provides a fluent interface
*/
public function setAdapter(Zend_InfoCard_Adapter_Interface $a)
{
$this->_infoCard->setAdapter($a);
return $this;
}
/**
* Retrieves the InfoCard component adapter being used
*
* @return Zend_InfoCard_Adapter_Interface
*/
public function getAdapter()
{
return $this->_infoCard->getAdapter();
}
/**
* Retrieves the InfoCard public key cipher object being used
*
* @return Zend_InfoCard_Cipher_PKI_Interface
*/
public function getPKCipherObject()
{
return $this->_infoCard->getPKCipherObject();
}
/**
* Sets the InfoCard public key cipher object to use
*
* @param Zend_InfoCard_Cipher_PKI_Interface $cipherObj
* @return Zend_Auth_Adapter_InfoCard Provides a fluent interface
*/
public function setPKICipherObject(Zend_InfoCard_Cipher_PKI_Interface $cipherObj)
{
$this->_infoCard->setPKICipherObject($cipherObj);
return $this;
}
/**
* Retrieves the Symmetric cipher object being used
*
* @return Zend_InfoCard_Cipher_Symmetric_Interface
*/
public function getSymCipherObject()
{
return $this->_infoCard->getSymCipherObject();
}
/**
* Sets the InfoCard symmetric cipher object to use
*
* @param Zend_InfoCard_Cipher_Symmetric_Interface $cipherObj
* @return Zend_Auth_Adapter_InfoCard Provides a fluent interface
*/
public function setSymCipherObject(Zend_InfoCard_Cipher_Symmetric_Interface $cipherObj)
{
$this->_infoCard->setSymCipherObject($cipherObj);
return $this;
}
/**
* Remove a Certificate Pair by Key ID from the search list
*
* @param string $key_id The Certificate Key ID returned from adding the certificate pair
* @throws Zend_InfoCard_Exception
* @return Zend_Auth_Adapter_InfoCard Provides a fluent interface
*/
public function removeCertificatePair($key_id)
{
$this->_infoCard->removeCertificatePair($key_id);
return $this;
}
/**
* Add a Certificate Pair to the list of certificates searched by the component
*
* @param string $private_key_file The path to the private key file for the pair
* @param string $public_key_file The path to the certificate / public key for the pair
* @param string $type (optional) The URI for the type of key pair this is (default RSA with OAEP padding)
* @param string $password (optional) The password for the private key file if necessary
* @throws Zend_InfoCard_Exception
* @return string A key ID representing this key pair in the component
*/
public function addCertificatePair($private_key_file, $public_key_file, $type = Zend_InfoCard_Cipher::ENC_RSA_OAEP_MGF1P, $password = null)
{
return $this->_infoCard->addCertificatePair($private_key_file, $public_key_file, $type, $password);
}
/**
* Return a Certificate Pair from a key ID
*
* @param string $key_id The Key ID of the certificate pair in the component
* @throws Zend_InfoCard_Exception
* @return array An array containing the path to the private/public key files,
* the type URI and the password if provided
*/
public function getCertificatePair($key_id)
{
return $this->_infoCard->getCertificatePair($key_id);
}
/**
* Set the XML Token to be processed
*
* @param string $strXmlToken The XML token to process
* @return Zend_Auth_Adapter_InfoCard Provides a fluent interface
*/
public function setXmlToken($strXmlToken)
{
$this->_xmlToken = $strXmlToken;
return $this;
}
/**
* Get the XML Token being processed
*
* @return string The XML token to be processed
*/
public function getXmlToken()
{
return $this->_xmlToken;
}
/**
* Authenticates the XML token
*
* @return Zend_Auth_Result The result of the authentication
*/
public function authenticate()
{
try {
$claims = $this->_infoCard->process($this->getXmlToken());
} catch(Exception $e) {
return new Zend_Auth_Result(Zend_Auth_Result::FAILURE , null, array('Exception Thrown',
$e->getMessage(),
$e->getTraceAsString(),
serialize($e)));
}
if(!$claims->isValid()) {
switch($claims->getCode()) {
case Zend_infoCard_Claims::RESULT_PROCESSING_FAILURE:
return new Zend_Auth_Result(
Zend_Auth_Result::FAILURE,
$claims,
array(
'Processing Failure',
$claims->getErrorMsg()
)
);
break;
case Zend_InfoCard_Claims::RESULT_VALIDATION_FAILURE:
return new Zend_Auth_Result(
Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID,
$claims,
array(
'Validation Failure',
$claims->getErrorMsg()
)
);
break;
default:
return new Zend_Auth_Result(
Zend_Auth_Result::FAILURE,
$claims,
array(
'Unknown Failure',
$claims->getErrorMsg()
)
);
break;
}
}
return new Zend_Auth_Result(
Zend_Auth_Result::SUCCESS,
$claims
);
}
}

View File

@ -1,399 +0,0 @@
<?php
/**
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Cloud
* @subpackage StorageService
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
require_once 'Zend/Cloud/StorageService/Adapter.php';
require_once 'Zend/Cloud/StorageService/Exception.php';
require_once 'Zend/Service/Nirvanix.php';
/**
* Adapter for Nirvanix cloud storage
*
* @category Zend
* @package Zend_Cloud
* @subpackage StorageService
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_Cloud_StorageService_Adapter_Nirvanix
implements Zend_Cloud_StorageService_Adapter
{
const USERNAME = 'auth_username';
const PASSWORD = 'auth_password';
const APP_KEY = 'auth_accesskey';
const REMOTE_DIRECTORY = 'remote_directory';
/**
* The Nirvanix adapter
* @var Zend_Service_Nirvanix
*/
protected $_nirvanix;
protected $_imfNs;
protected $_metadataNs;
protected $_remoteDirectory;
private $maxPageSize = 500;
/**
* Constructor
*
* @param array|Zend_Config $options
* @return void
*/
function __construct($options = array())
{
if ($options instanceof Zend_Config) {
$options = $options->toArray();
}
if (!is_array($options)) {
throw new Zend_Cloud_StorageService_Exception('Invalid options provided');
}
$auth = array(
'username' => $options[self::USERNAME],
'password' => $options[self::PASSWORD],
'appKey' => $options[self::APP_KEY],
);
$nirvanix_options = array();
if (isset($options[self::HTTP_ADAPTER])) {
$httpc = new Zend_Http_Client();
$httpc->setAdapter($options[self::HTTP_ADAPTER]);
$nirvanix_options['httpClient'] = $httpc;
}
try {
$this->_nirvanix = new Zend_Service_Nirvanix($auth, $nirvanix_options);
$this->_remoteDirectory = $options[self::REMOTE_DIRECTORY];
$this->_imfNs = $this->_nirvanix->getService('IMFS');
$this->_metadataNs = $this->_nirvanix->getService('Metadata');
} catch (Zend_Service_Nirvanix_Exception $e) {
throw new Zend_Cloud_StorageService_Exception('Error on create: '.$e->getMessage(), $e->getCode(), $e);
}
}
/**
* Get an item from the storage service.
*
* @param string $path
* @param array $options
* @return mixed
*/
public function fetchItem($path, $options = null)
{
$path = $this->_getFullPath($path);
try {
$item = $this->_imfNs->getContents($path);
} catch (Zend_Service_Nirvanix_Exception $e) {
throw new Zend_Cloud_StorageService_Exception('Error on fetch: '.$e->getMessage(), $e->getCode(), $e);
}
return $item;
}
/**
* Store an item in the storage service.
* WARNING: This operation overwrites any item that is located at
* $destinationPath.
* @param string $destinationPath
* @param mixed $data
* @param array $options
* @return void
*/
public function storeItem($destinationPath, $data, $options = null)
{
try {
$path = $this->_getFullPath($destinationPath);
$this->_imfNs->putContents($path, $data);
} catch (Zend_Service_Nirvanix_Exception $e) {
throw new Zend_Cloud_StorageService_Exception('Error on store: '.$e->getMessage(), $e->getCode(), $e);
}
return true;
}
/**
* Delete an item in the storage service.
*
* @param string $path
* @param array $options
* @return void
*/
public function deleteItem($path, $options = null)
{
try {
$path = $this->_getFullPath($path);
$this->_imfNs->unlink($path);
} catch(Zend_Service_Nirvanix_Exception $e) {
// if (trim(strtoupper($e->getMessage())) != 'INVALID PATH') {
// // TODO Differentiate among errors in the Nirvanix adapter
throw new Zend_Cloud_StorageService_Exception('Error on delete: '.$e->getMessage(), $e->getCode(), $e);
}
}
/**
* Copy an item in the storage service to a given path.
* WARNING: This operation is *very* expensive for services that do not
* support copying an item natively.
*
* @param string $sourcePath
* @param string $destination path
* @param array $options
* @return void
*/
public function copyItem($sourcePath, $destinationPath, $options = null)
{
try {
$sourcePath = $this->_getFullPath($sourcePath);
$destinationPath = $this->_getFullPath($destinationPath);
$this->_imfNs->CopyFiles(array('srcFilePath' => $sourcePath,
'destFolderPath' => $destinationPath));
} catch (Zend_Service_Nirvanix_Exception $e) {
throw new Zend_Cloud_StorageService_Exception('Error on copy: '.$e->getMessage(), $e->getCode(), $e);
}
}
/**
* Move an item in the storage service to a given path.
* WARNING: This operation is *very* expensive for services that do not
* support moving an item natively.
*
* @param string $sourcePath
* @param string $destination path
* @param array $options
* @return void
*/
public function moveItem($sourcePath, $destinationPath, $options = null)
{
try {
$sourcePath = $this->_getFullPath($sourcePath);
$destinationPath = $this->_getFullPath($destinationPath);
$this->_imfNs->RenameFile(array('filePath' => $sourcePath,
'newFileName' => $destinationPath));
// $this->_imfNs->MoveFiles(array('srcFilePath' => $sourcePath,
// 'destFolderPath' => $destinationPath));
} catch (Zend_Service_Nirvanix_Exception $e) {
throw new Zend_Cloud_StorageService_Exception('Error on move: '.$e->getMessage(), $e->getCode(), $e);
}
}
/**
* Rename an item in the storage service to a given name.
*
*
* @param string $path
* @param string $name
* @param array $options
* @return void
*/
public function renameItem($path, $name, $options = null)
{
require_once 'Zend/Cloud/OperationNotAvailableException.php';
throw new Zend_Cloud_OperationNotAvailableException('Renaming not implemented');
}
/**
* Get a key/value array of metadata for the given path.
*
* @param string $path
* @param array $options
* @return array An associative array of key/value pairs specifying the metadata for this object.
* If no metadata exists, an empty array is returned.
*/
public function fetchMetadata($path, $options = null)
{
$path = $this->_getFullPath($path);
try {
$metadataNode = $this->_metadataNs->getMetadata(array('path' => $path));
} catch (Zend_Service_Nirvanix_Exception $e) {
throw new Zend_Cloud_StorageService_Exception('Error on fetching metadata: '.$e->getMessage(), $e->getCode(), $e);
}
$metadata = array();
$length = count($metadataNode->Metadata);
// Need to special case this as Nirvanix returns an array if there is
// more than one, but doesn't return an array if there is only one.
if ($length == 1)
{
$metadata[(string)$metadataNode->Metadata->Type->value] = (string)$metadataNode->Metadata->Value;
}
else if ($length > 1)
{
for ($i=0; $i<$length; $i++)
{
$metadata[(string)$metadataNode->Metadata[$i]->Type] = (string)$metadataNode->Metadata[$i]->Value;
}
}
return $metadata;
}
/**
* Store a key/value array of metadata at the given path.
* WARNING: This operation overwrites any metadata that is located at
* $destinationPath.
*
* @param string $destinationPath
* @param array $metadata associative array specifying the key/value pairs for the metadata.
* @param array $options
* @return void
*/
public function storeMetadata($destinationPath, $metadata, $options = null)
{
$destinationPath = $this->_getFullPath($destinationPath);
if ($metadata != null) {
try {
foreach ($metadata AS $key=>$value) {
$metadataString = $key . ":" . $value;
$this->_metadataNs->SetMetadata(array(
'path' => $destinationPath,
'metadata' => $metadataString,
));
}
} catch (Zend_Service_Nirvanix_Exception $e) {
throw new Zend_Cloud_StorageService_Exception('Error on storing metadata: '.$e->getMessage(), $e->getCode(), $e);
}
}
}
/**
* Delete a key/value array of metadata at the given path.
*
* @param string $path
* @param array $metadata - An associative array specifying the key/value pairs for the metadata
* to be deleted. If null, all metadata associated with the object will
* be deleted.
* @param array $options
* @return void
*/
public function deleteMetadata($path, $metadata = null, $options = null)
{
$path = $this->_getFullPath($path);
try {
if ($metadata == null) {
$this->_metadataNs->DeleteAllMetadata(array('path' => $path));
} else {
foreach ($metadata AS $key=>$value) {
$this->_metadataNs->DeleteMetadata(array(
'path' => $path,
'metadata' => $key,
));
}
}
} catch (Zend_Service_Nirvanix_Exception $e) {
throw new Zend_Cloud_StorageService_Exception('Error on deleting metadata: '.$e->getMessage(), $e->getCode(), $e);
}
}
/*
* Recursively traverse all the folders and build an array that contains
* the path names for each folder.
*
* @param string $path folder path to get the list of folders from.
* @param array& $resultArray reference to the array that contains the path names
* for each folder.
*/
private function getAllFolders($path, &$resultArray)
{
$response = $this->_imfNs->ListFolder(array(
'folderPath' => $path,
'pageNumber' => 1,
'pageSize' => $this->maxPageSize,
));
$numFolders = $response->ListFolder->TotalFolderCount;
if ($numFolders == 0) {
return;
} else {
//Need to special case this as Nirvanix returns an array if there is
//more than one, but doesn't return an array if there is only one.
if ($numFolders == 1) {
$folderPath = $response->ListFolder->Folder->Path;
array_push($resultArray, $folderPath);
$this->getAllFolders('/' . $folderPath, $resultArray);
} else {
foreach ($response->ListFolder->Folder as $arrayElem) {
$folderPath = $arrayElem->Path;
array_push($resultArray, $folderPath);
$this->getAllFolders('/' . $folderPath, $resultArray);
}
}
}
}
/**
* Return an array of the items contained in the given path. The items
* returned are the files or objects that in the specified path.
*
* @param string $path
* @param array $options
* @return array
*/
public function listItems($path, $options = null)
{
$path = $this->_getFullPath($path);
$resultArray = array();
if (!isset($path)) {
return false;
} else {
try {
$response = $this->_imfNs->ListFolder(array(
'folderPath' => $path,
'pageNumber' => 1,
'pageSize' => $this->maxPageSize,
));
} catch (Zend_Service_Nirvanix_Exception $e) {
throw new Zend_Cloud_StorageService_Exception('Error on list: '.$e->getMessage(), $e->getCode(), $e);
}
$numFiles = $response->ListFolder->TotalFileCount;
//Add the file names to the array
if ($numFiles != 0) {
//Need to special case this as Nirvanix returns an array if there is
//more than one, but doesn't return an array if there is only one.
if ($numFiles == 1) {
$resultArray[] = (string)$response->ListFolder->File->Name;
}
else {
foreach ($response->ListFolder->File as $arrayElem) {
$resultArray[] = (string) $arrayElem->Name;
}
}
}
}
return $resultArray;
}
/**
* Get full path to an object
*
* @param string $path
* @return string
*/
private function _getFullPath($path)
{
return $this->_remoteDirectory . $path;
}
/**
* Get the concrete client.
* @return Zend_Service_Nirvanix
*/
public function getClient()
{
return $this->_nirvanix;
}
}

View File

@ -1,497 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: InfoCard.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Xml_EncryptedData
*/
require_once 'Zend/InfoCard/Xml/EncryptedData.php';
/**
* Zend_InfoCard_Xml_Assertion
*/
require_once 'Zend/InfoCard/Xml/Assertion.php';
/**
* Zend_InfoCard_Cipher
*/
require_once 'Zend/InfoCard/Cipher.php';
/**
* Zend_InfoCard_Xml_Security
*/
require_once 'Zend/InfoCard/Xml/Security.php';
/**
* Zend_InfoCard_Adapter_Interface
*/
require_once 'Zend/InfoCard/Adapter/Interface.php';
/**
* Zend_InfoCard_Claims
*/
require_once 'Zend/InfoCard/Claims.php';
/**
* @category Zend
* @package Zend_InfoCard
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard
{
/**
* URI for XML Digital Signature SHA1 Digests
*/
const DIGEST_SHA1 = 'http://www.w3.org/2000/09/xmldsig#sha1';
/**
* An array of certificate pair files and optional passwords for them to search
* when trying to determine which certificate was used to encrypt the transient key
*
* @var Array
*/
protected $_keyPairs;
/**
* The instance to use to decrypt public-key encrypted data
*
* @var Zend_InfoCard_Cipher_Pki_Interface
*/
protected $_pkiCipherObj;
/**
* The instance to use to decrypt symmetric encrypted data
*
* @var Zend_InfoCard_Cipher_Symmetric_Interface
*/
protected $_symCipherObj;
/**
* The InfoCard Adapter to use for callbacks into the application using the component
* such as when storing assertions, etc.
*
* @var Zend_InfoCard_Adapter_Interface
*/
protected $_adapter;
/**
* InfoCard Constructor
*
* @throws Zend_InfoCard_Exception
*/
public function __construct()
{
$this->_keyPairs = array();
if(!extension_loaded('mcrypt')) {
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("Use of the Zend_InfoCard component requires the mcrypt extension to be enabled in PHP");
}
if(!extension_loaded('openssl')) {
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("Use of the Zend_InfoCard component requires the openssl extension to be enabled in PHP");
}
}
/**
* Sets the adapter uesd for callbacks into the application using the component, used
* when doing things such as storing / retrieving assertions, etc.
*
* @param Zend_InfoCard_Adapter_Interface $a The Adapter instance
* @return Zend_InfoCard The instnace
*/
public function setAdapter(Zend_InfoCard_Adapter_Interface $a)
{
$this->_adapter = $a;
return $this;
}
/**
* Retrieves the adapter used for callbacks into the application using the component.
* If no adapter was set then an instance of Zend_InfoCard_Adapter_Default is used
*
* @return Zend_InfoCard_Adapter_Interface The Adapter instance
*/
public function getAdapter()
{
if($this->_adapter === null) {
require_once 'Zend/InfoCard/Adapter/Default.php';
$this->setAdapter(new Zend_InfoCard_Adapter_Default());
}
return $this->_adapter;
}
/**
* Gets the Public Key Cipher object used in this instance
*
* @return Zend_InfoCard_Cipher_Pki_Interface
*/
public function getPkiCipherObject()
{
return $this->_pkiCipherObj;
}
/**
* Sets the Public Key Cipher Object used in this instance
*
* @param Zend_InfoCard_Cipher_Pki_Interface $cipherObj
* @return Zend_InfoCard
*/
public function setPkiCipherObject(Zend_InfoCard_Cipher_Pki_Interface $cipherObj)
{
$this->_pkiCipherObj = $cipherObj;
return $this;
}
/**
* Get the Symmetric Cipher Object used in this instance
*
* @return Zend_InfoCard_Cipher_Symmetric_Interface
*/
public function getSymCipherObject()
{
return $this->_symCipherObj;
}
/**
* Sets the Symmetric Cipher Object used in this instance
*
* @param Zend_InfoCard_Cipher_Symmetric_Interface $cipherObj
* @return Zend_InfoCard
*/
public function setSymCipherObject($cipherObj)
{
$this->_symCipherObj = $cipherObj;
return $this;
}
/**
* Remove a Certificate Pair by Key ID from the search list
*
* @throws Zend_InfoCard_Exception
* @param string $key_id The Certificate Key ID returned from adding the certificate pair
* @return Zend_InfoCard
*/
public function removeCertificatePair($key_id)
{
if(!key_exists($key_id, $this->_keyPairs)) {
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("Attempted to remove unknown key id: $key_id");
}
unset($this->_keyPairs[$key_id]);
return $this;
}
/**
* Add a Certificate Pair to the list of certificates searched by the component
*
* @throws Zend_InfoCard_Exception
* @param string $private_key_file The path to the private key file for the pair
* @param string $public_key_file The path to the certificate / public key for the pair
* @param string $type (optional) The URI for the type of key pair this is (default RSA with OAEP padding)
* @param string $password (optional) The password for the private key file if necessary
* @return string A key ID representing this key pair in the component
*/
public function addCertificatePair($private_key_file, $public_key_file, $type = Zend_InfoCard_Cipher::ENC_RSA_OAEP_MGF1P, $password = null)
{
if(!file_exists($private_key_file) ||
!file_exists($public_key_file)) {
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("Could not locate the public and private certificate pair files: $private_key_file, $public_key_file");
}
if(!is_readable($private_key_file) ||
!is_readable($public_key_file)) {
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("Could not read the public and private certificate pair files (check permissions): $private_key_file, $public_key_file");
}
$key_id = md5($private_key_file.$public_key_file);
if(key_exists($key_id, $this->_keyPairs)) {
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("Attempted to add previously existing certificate pair: $private_key_file, $public_key_file");
}
switch($type) {
case Zend_InfoCard_Cipher::ENC_RSA:
case Zend_InfoCard_Cipher::ENC_RSA_OAEP_MGF1P:
$this->_keyPairs[$key_id] = array('private' => $private_key_file,
'public' => $public_key_file,
'type_uri' => $type);
if($password !== null) {
$this->_keyPairs[$key_id]['password'] = $password;
} else {
$this->_keyPairs[$key_id]['password'] = null;
}
return $key_id;
break;
default:
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("Invalid Certificate Pair Type specified: $type");
}
}
/**
* Return a Certificate Pair from a key ID
*
* @throws Zend_InfoCard_Exception
* @param string $key_id The Key ID of the certificate pair in the component
* @return array An array containing the path to the private/public key files,
* the type URI and the password if provided
*/
public function getCertificatePair($key_id)
{
if(key_exists($key_id, $this->_keyPairs)) {
return $this->_keyPairs[$key_id];
}
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("Invalid Certificate Pair ID provided: $key_id");
}
/**
* Retrieve the digest of a given public key / certificate using the provided digest
* method
*
* @throws Zend_InfoCard_Exception
* @param string $key_id The certificate key id in the component
* @param string $digestMethod The URI of the digest method to use (default SHA1)
* @return string The digest value in binary format
*/
protected function _getPublicKeyDigest($key_id, $digestMethod = self::DIGEST_SHA1)
{
$certificatePair = $this->getCertificatePair($key_id);
$temp = file($certificatePair['public']);
unset($temp[count($temp)-1]);
unset($temp[0]);
$certificateData = base64_decode(implode("\n", $temp));
switch($digestMethod) {
case self::DIGEST_SHA1:
$digest_retval = sha1($certificateData, true);
break;
default:
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("Invalid Digest Type Provided: $digestMethod");
}
return $digest_retval;
}
/**
* Find a certificate pair based on a digest of its public key / certificate file
*
* @param string $digest The digest value of the public key wanted in binary form
* @param string $digestMethod The URI of the digest method used to calculate the digest
* @return mixed The Key ID of the matching certificate pair or false if not found
*/
protected function _findCertifiatePairByDigest($digest, $digestMethod = self::DIGEST_SHA1)
{
foreach($this->_keyPairs as $key_id => $certificate_data) {
$cert_digest = $this->_getPublicKeyDigest($key_id, $digestMethod);
if($cert_digest == $digest) {
return $key_id;
}
}
return false;
}
/**
* Extracts the Signed Token from an EncryptedData block
*
* @throws Zend_InfoCard_Exception
* @param string $strXmlToken The EncryptedData XML block
* @return string The XML of the Signed Token inside of the EncryptedData block
*/
protected function _extractSignedToken($strXmlToken)
{
$encryptedData = Zend_InfoCard_Xml_EncryptedData::getInstance($strXmlToken);
// Determine the Encryption Method used to encrypt the token
switch($encryptedData->getEncryptionMethod()) {
case Zend_InfoCard_Cipher::ENC_AES128CBC:
case Zend_InfoCard_Cipher::ENC_AES256CBC:
break;
default:
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("Unknown Encryption Method used in the secure token");
}
// Figure out the Key we are using to decrypt the token
$keyinfo = $encryptedData->getKeyInfo();
if(!($keyinfo instanceof Zend_InfoCard_Xml_KeyInfo_XmlDSig)) {
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("Expected a XML digital signature KeyInfo, but was not found");
}
$encryptedKey = $keyinfo->getEncryptedKey();
switch($encryptedKey->getEncryptionMethod()) {
case Zend_InfoCard_Cipher::ENC_RSA:
case Zend_InfoCard_Cipher::ENC_RSA_OAEP_MGF1P:
break;
default:
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("Unknown Key Encryption Method used in secure token");
}
$securityTokenRef = $encryptedKey->getKeyInfo()->getSecurityTokenReference();
$key_id = $this->_findCertifiatePairByDigest($securityTokenRef->getKeyReference());
if(!$key_id) {
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("Unable to find key pair used to encrypt symmetric InfoCard Key");
}
$certificate_pair = $this->getCertificatePair($key_id);
// Santity Check
if($certificate_pair['type_uri'] != $encryptedKey->getEncryptionMethod()) {
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("Certificate Pair which matches digest is not of same algorithm type as document, check addCertificate()");
}
$PKcipher = Zend_InfoCard_Cipher::getInstanceByURI($encryptedKey->getEncryptionMethod());
$base64DecodeSupportsStrictParam = version_compare(PHP_VERSION, '5.2.0', '>=');
if ($base64DecodeSupportsStrictParam) {
$keyCipherValueBase64Decoded = base64_decode($encryptedKey->getCipherValue(), true);
} else {
$keyCipherValueBase64Decoded = base64_decode($encryptedKey->getCipherValue());
}
$symmetricKey = $PKcipher->decrypt(
$keyCipherValueBase64Decoded,
file_get_contents($certificate_pair['private']),
$certificate_pair['password']
);
$symCipher = Zend_InfoCard_Cipher::getInstanceByURI($encryptedData->getEncryptionMethod());
if ($base64DecodeSupportsStrictParam) {
$dataCipherValueBase64Decoded = base64_decode($encryptedData->getCipherValue(), true);
} else {
$dataCipherValueBase64Decoded = base64_decode($encryptedData->getCipherValue());
}
$signedToken = $symCipher->decrypt($dataCipherValueBase64Decoded, $symmetricKey);
return $signedToken;
}
/**
* Process an input Infomation Card EncryptedData block sent from the client,
* validate it, and return the claims contained within it on success or an error message on error
*
* @param string $strXmlToken The XML token sent to the server from the client
* @return Zend_Infocard_Claims The Claims object containing the claims, or any errors which occurred
*/
public function process($strXmlToken)
{
$retval = new Zend_InfoCard_Claims();
require_once 'Zend/InfoCard/Exception.php';
try {
$signedAssertionsXml = $this->_extractSignedToken($strXmlToken);
} catch(Zend_InfoCard_Exception $e) {
$retval->setError('Failed to extract assertion document');
$retval->setCode(Zend_InfoCard_Claims::RESULT_PROCESSING_FAILURE);
return $retval;
}
try {
$assertions = Zend_InfoCard_Xml_Assertion::getInstance($signedAssertionsXml);
} catch(Zend_InfoCard_Exception $e) {
$retval->setError('Failure processing assertion document');
$retval->setCode(Zend_InfoCard_Claims::RESULT_PROCESSING_FAILURE);
return $retval;
}
if(!($assertions instanceof Zend_InfoCard_Xml_Assertion_Interface)) {
throw new Zend_InfoCard_Exception("Invalid Assertion Object returned");
}
if(!($reference_id = Zend_InfoCard_Xml_Security::validateXMLSignature($assertions->asXML()))) {
$retval->setError("Failure Validating the Signature of the assertion document");
$retval->setCode(Zend_InfoCard_Claims::RESULT_VALIDATION_FAILURE);
return $retval;
}
// The reference id should be locally scoped as far as I know
if($reference_id[0] == '#') {
$reference_id = substr($reference_id, 1);
} else {
$retval->setError("Reference of document signature does not reference the local document");
$retval->setCode(Zend_InfoCard_Claims::RESULT_VALIDATION_FAILURE);
return $retval;
}
// Make sure the signature is in reference to the same document as the assertions
if($reference_id != $assertions->getAssertionID()) {
$retval->setError("Reference of document signature does not reference the local document");
$retval->setCode(Zend_InfoCard_Claims::RESULT_VALIDATION_FAILURE);
}
// Validate we haven't seen this before and the conditions are acceptable
$conditions = $this->getAdapter()->retrieveAssertion($assertions->getAssertionURI(), $assertions->getAssertionID());
if($conditions === false) {
$conditions = $assertions->getConditions();
}
if(is_array($condition_error = $assertions->validateConditions($conditions))) {
$retval->setError("Conditions of assertion document are not met: {$condition_error[1]} ({$condition_error[0]})");
$retval->setCode(Zend_InfoCard_Claims::RESULT_VALIDATION_FAILURE);
}
$attributes = $assertions->getAttributes();
$retval->setClaims($attributes);
if($retval->getCode() == 0) {
$retval->setCode(Zend_InfoCard_Claims::RESULT_SUCCESS);
}
return $retval;
}
}

View File

@ -1,79 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Adapter
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Default.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Adapter_Interface
*/
require_once 'Zend/InfoCard/Adapter/Interface.php';
/**
* The default InfoCard component Adapter which serves as a pass-thru placeholder
* for developers. Initially developed to provide a callback mechanism to store and retrieve
* assertions as part of the validation process it can be used anytime callback facilities
* are necessary
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Adapter
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Adapter_Default implements Zend_InfoCard_Adapter_Interface
{
/**
* Store the assertion (pass-thru does nothing)
*
* @param string $assertionURI The assertion type URI
* @param string $assertionID The specific assertion ID
* @param array $conditions An array of claims to store associated with the assertion
* @return bool Always returns true (would return false on store failure)
*/
public function storeAssertion($assertionURI, $assertionID, $conditions)
{
return true;
}
/**
* Retrieve an assertion (pass-thru does nothing)
*
* @param string $assertionURI The assertion type URI
* @param string $assertionID The assertion ID to retrieve
* @return mixed False if the assertion ID was not found for that URI, or an array of
* conditions associated with that assertion if found (always returns false)
*/
public function retrieveAssertion($assertionURI, $assertionID)
{
return false;
}
/**
* Remove an assertion (pass-thru does nothing)
*
* @param string $assertionURI The assertion type URI
* @param string $assertionID The assertion ID to remove
* @return bool Always returns true (false on removal failure)
*/
public function removeAssertion($assertionURI, $assertionID)
{
return null;
}
}

View File

@ -1,37 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Adapter
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Exception.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* @see Zend_InfoCard_Exception
*/
require_once 'Zend/InfoCard/Exception.php';
/**
* @category Zend
* @package Zend_InfoCard
* @subpackage Adapter
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Adapter_Exception extends Zend_InfoCard_Exception
{
}

View File

@ -1,64 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Adapter
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Interface.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* The interface required by all Zend_InfoCard Adapter classes to implement. It represents
* a series of callback methods used by the component during processing of an information card
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Adapter
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
interface Zend_InfoCard_Adapter_Interface
{
/**
* Store the assertion's claims in persistent storage
*
* @param string $assertionURI The assertion type URI
* @param string $assertionID The specific assertion ID
* @param array $conditions An array of claims to store associated with the assertion
* @return bool True on success, false on failure
*/
public function storeAssertion($assertionURI, $assertionID, $conditions);
/**
* Retrieve the claims of a given assertion from persistent storage
*
* @param string $assertionURI The assertion type URI
* @param string $assertionID The assertion ID to retrieve
* @return mixed False if the assertion ID was not found for that URI, or an array of
* conditions associated with that assertion if found in the same format
* provided
*/
public function retrieveAssertion($assertionURI, $assertionID);
/**
* Remove the claims of a given assertion from persistent storage
*
* @param string $asserionURI The assertion type URI
* @param string $assertionID The assertion ID to remove
* @return bool True on success, false on failure
*/
public function removeAssertion($asserionURI, $assertionID);
}

View File

@ -1,99 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Cipher.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Provides an abstraction for encryption ciphers used in an Information Card
* implementation
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Cipher
{
/**
* AES 256 Encryption with CBC
*/
const ENC_AES256CBC = 'http://www.w3.org/2001/04/xmlenc#aes256-cbc';
/**
* AES 128 Encryption with CBC
*/
const ENC_AES128CBC = 'http://www.w3.org/2001/04/xmlenc#aes128-cbc';
/**
* RSA Public Key Encryption with OAEP Padding
*/
const ENC_RSA_OAEP_MGF1P = 'http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p';
/**
* RSA Public Key Encryption with no padding
*/
const ENC_RSA = 'http://www.w3.org/2001/04/xmlenc#rsa-1_5';
/**
* Constructor (disabled)
*
* @return void
* @codeCoverageIgnoreStart
*/
protected function __construct()
{
}
// @codeCoverageIgnoreEnd
/**
* Returns an instance of a cipher object supported based on the URI provided
*
* @throws Zend_InfoCard_Cipher_Exception
* @param string $uri The URI of the encryption method wantde
* @return mixed an Instance of Zend_InfoCard_Cipher_Symmetric_Interface or Zend_InfoCard_Cipher_Pki_Interface
* depending on URI
*/
static public function getInstanceByURI($uri)
{
switch($uri) {
case self::ENC_AES256CBC:
include_once 'Zend/InfoCard/Cipher/Symmetric/Adapter/Aes256cbc.php';
return new Zend_InfoCard_Cipher_Symmetric_Adapter_Aes256cbc();
case self::ENC_AES128CBC:
include_once 'Zend/InfoCard/Cipher/Symmetric/Adapter/Aes128cbc.php';
return new Zend_InfoCard_Cipher_Symmetric_Adapter_Aes128cbc();
case self::ENC_RSA_OAEP_MGF1P:
include_once 'Zend/InfoCard/Cipher/Pki/Adapter/Rsa.php';
return new Zend_InfoCard_Cipher_Pki_Adapter_Rsa(Zend_InfoCard_Cipher_Pki_Adapter_Rsa::OAEP_PADDING);
break;
case self::ENC_RSA:
include_once 'Zend/InfoCard/Cipher/Pki/Adapter/Rsa.php';
return new Zend_InfoCard_Cipher_Pki_Adapter_Rsa(Zend_InfoCard_Cipher_Pki_Adapter_Rsa::NO_PADDING);
break;
default:
require_once 'Zend/InfoCard/Cipher/Exception.php';
throw new Zend_InfoCard_Cipher_Exception("Unknown Cipher URI");
}
}
}

View File

@ -1,38 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Exception.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Exception
*/
require_once 'Zend/InfoCard/Exception.php';
/**
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Cipher_Exception extends Zend_InfoCard_Exception
{
}

View File

@ -1,88 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Abstract.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Cipher_Pki_Interface
*/
require_once 'Zend/InfoCard/Cipher/Pki/Interface.php';
/**
* An abstract class for public-key ciphers
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
abstract class Zend_InfoCard_Cipher_Pki_Adapter_Abstract implements Zend_InfoCard_Cipher_Pki_Interface
{
/**
* OAEP Padding public key encryption
*/
const OAEP_PADDING = 1;
/**
* No padding public key encryption
*/
const NO_PADDING = 2;
/**
* The type of padding to use
*
* @var integer one of the padding constants in this class
*/
protected $_padding;
/**
* Set the padding of the public key encryption
*
* @throws Zend_InfoCard_Cipher_Exception
* @param integer $padding One of the constnats in this class
* @return Zend_InfoCard_Pki_Adapter_Abstract
*/
public function setPadding($padding)
{
switch($padding) {
case self::OAEP_PADDING:
case self::NO_PADDING:
$this->_padding = $padding;
break;
default:
require_once 'Zend/InfoCard/Cipher/Exception.php';
throw new Zend_InfoCard_Cipher_Exception("Invalid Padding Type Provided");
break;
}
return $this;
}
/**
* Retruns the public-key padding used
*
* @return integer One of the padding constants in this class
*/
public function getPadding()
{
return $this->_padding;
}
}

View File

@ -1,120 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Rsa.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Cipher_Pki_Adapter_Abstract
*/
require_once 'Zend/InfoCard/Cipher/Pki/Adapter/Abstract.php';
/**
* Zend_InfoCard_Cipher_Pki_Rsa_Interface
*/
require_once 'Zend/InfoCard/Cipher/Pki/Rsa/Interface.php';
/**
* RSA Public Key Encryption Cipher Object for the InfoCard component. Relies on OpenSSL
* to implement the RSA algorithm
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Cipher_Pki_Adapter_Rsa
extends Zend_InfoCard_Cipher_Pki_Adapter_Abstract
implements Zend_InfoCard_Cipher_Pki_Rsa_Interface
{
/**
* Object Constructor
*
* @param integer $padding The type of Padding to use
*/
public function __construct($padding = Zend_InfoCard_Cipher_Pki_Adapter_Abstract::NO_PADDING)
{
// Can't test this..
// @codeCoverageIgnoreStart
if(!extension_loaded('openssl')) {
require_once 'Zend/InfoCard/Cipher/Exception.php';
throw new Zend_InfoCard_Cipher_Exception("Use of this PKI RSA Adapter requires the openssl extension loaded");
}
// @codeCoverageIgnoreEnd
$this->setPadding($padding);
}
/**
* Decrypts RSA encrypted data using the given private key
*
* @throws Zend_InfoCard_Cipher_Exception
* @param string $encryptedData The encrypted data in binary format
* @param string $privateKey The private key in binary format
* @param string $password The private key passphrase
* @param integer $padding The padding to use during decryption (of not provided object value will be used)
* @return string The decrypted data
*/
public function decrypt($encryptedData, $privateKey, $password = null, $padding = null)
{
$private_key = openssl_pkey_get_private(array($privateKey, $password));
if(!$private_key) {
require_once 'Zend/InfoCard/Cipher/Exception.php';
throw new Zend_InfoCard_Cipher_Exception("Failed to load private key");
}
if($padding !== null) {
try {
$this->setPadding($padding);
} catch(Exception $e) {
openssl_free_key($private_key);
throw $e;
}
}
switch($this->getPadding()) {
case self::NO_PADDING:
$openssl_padding = OPENSSL_NO_PADDING;
break;
case self::OAEP_PADDING:
$openssl_padding = OPENSSL_PKCS1_OAEP_PADDING;
break;
}
$result = openssl_private_decrypt($encryptedData, $decryptedData, $private_key, $openssl_padding);
openssl_free_key($private_key);
if(!$result) {
require_once 'Zend/InfoCard/Cipher/Exception.php';
throw new Zend_InfoCard_Cipher_Exception("Unable to Decrypt Value using provided private key");
}
if($this->getPadding() == self::NO_PADDING) {
$decryptedData = substr($decryptedData, 2);
$start = strpos($decryptedData, 0) + 1;
$decryptedData = substr($decryptedData, $start);
}
return $decryptedData;
}
}

View File

@ -1,33 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Interface.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Empty Interface represents a Pki cipher object
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
interface Zend_InfoCard_Cipher_Pki_Interface
{
}

View File

@ -1,50 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Interface.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Cipher_PKI_Adapter_Abstract
*/
require_once 'Zend/InfoCard/Cipher/Pki/Adapter/Abstract.php';
/**
* The interface which defines the RSA Public-key encryption object
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
interface Zend_InfoCard_Cipher_Pki_Rsa_Interface
{
/**
* Decrypts RSA encrypted data using the given private key
*
* @throws Zend_InfoCard_Cipher_Exception
* @param string $encryptedData The encrypted data in binary format
* @param string $privateKey The private key in binary format
* @param string $password The private key passphrase
* @param integer $padding The padding to use during decryption (of not provided object value will be used)
* @return string The decrypted data
*/
public function decrypt($encryptedData, $privateKey, $password = null, $padding = Zend_InfoCard_Cipher_Pki_Adapter_Abstract::NO_PADDING);
}

View File

@ -1,38 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Abstract.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Cipher_Symmetric_Interface
*/
require_once 'Zend/InfoCard/Cipher/Symmetric/Interface.php';
/**
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
abstract class Zend_InfoCard_Cipher_Symmetric_Adapter_Abstract
implements Zend_InfoCard_Cipher_Symmetric_Interface
{
}

View File

@ -1,40 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Aes128cbc.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Cipher_Symmetric_Adapter_Aes256cbc
*/
require_once 'Zend/InfoCard/Cipher/Symmetric/Adapter/Aes256cbc.php';
/**
* Implements AES128 with CBC encryption implemented using the mCrypt extension
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Cipher_Symmetric_Adapter_Aes128cbc
extends Zend_InfoCard_Cipher_Symmetric_Adapter_Aes256cbc
{
}

View File

@ -1,111 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Aes256cbc.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Cipher_Symmetric_Adapter_Abstract
*/
require_once 'Zend/InfoCard/Cipher/Symmetric/Adapter/Abstract.php';
/**
* Zend_InfoCard_Cipher_Symmetric_Aes256cbc_Interface
*/
require_once 'Zend/InfoCard/Cipher/Symmetric/Aes256cbc/Interface.php';
/**
* Implements AES256 with CBC encryption implemented using the mCrypt extension
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Cipher_Symmetric_Adapter_Aes256cbc
extends Zend_InfoCard_Cipher_Symmetric_Adapter_Abstract
implements Zend_InfoCard_Cipher_Symmetric_Aes256cbc_Interface
{
/**
* The MCRYPT Cipher constant for this encryption
*/
const MCRYPT_CIPHER = MCRYPT_RIJNDAEL_128;
/**
* The MCRYPT Mode constant for this encryption
*/
const MCRYPT_MODE = MCRYPT_MODE_CBC;
/**
* The default length of the IV to use
*/
const IV_LENGTH = 16;
/**
* The object constructor
*
* @throws Zend_InfoCard_Cipher_Exception
*/
public function __construct()
{
// Can't test for this
// @codeCoverageIgnoreStart
if(!extension_loaded('mcrypt')) {
require_once 'Zend/InfoCard/Cipher/Exception.php';
throw new Zend_InfoCard_Cipher_Exception("Use of the AES256CBC Cipher requires the mcrypt extension");
}
// @codeCoveregIgnoreEnd
}
/**
* Decrypts data using the AES Algorithm using the mCrypt extension
*
* @throws Zend_InfoCard_Cipher_Exception
* @param string $encryptedData The encrypted data in binary format
* @param string $decryptionKey The decryption key
* @param integer $iv_length The IV length to use
* @return string the decrypted data with any terminating nulls removed
*/
public function decrypt($encryptedData, $decryptionKey, $iv_length = null)
{
$iv_length = ($iv_length === null) ? self::IV_LENGTH : $iv_length;
$mcrypt_iv = null;
if($iv_length > 0) {
$mcrypt_iv = substr($encryptedData, 0, $iv_length);
$encryptedData = substr($encryptedData, $iv_length);
}
$decrypted = mcrypt_decrypt(self::MCRYPT_CIPHER, $decryptionKey, $encryptedData, self::MCRYPT_MODE, $mcrypt_iv);
if(!$decrypted) {
require_once 'Zend/InfoCard/Cipher/Exception.php';
throw new Zend_InfoCard_Cipher_Exception("Failed to decrypt data using AES256CBC Algorithm");
}
$decryptedLength = strlen($decrypted);
$paddingLength = substr($decrypted, $decryptedLength -1, 1);
$decrypted = substr($decrypted, 0, $decryptedLength - ord($paddingLength));
return rtrim($decrypted, "\0");
}
}

View File

@ -1,38 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Interface.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Cipher_Symmetric_Aes256cbc_Interface
*/
require_once 'Zend/InfoCard/Cipher/Symmetric/Aes256cbc/Interface.php';
/**
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
interface Zend_InfoCard_Cipher_Symmetric_Aes128cbc_Interface
extends Zend_InfoCard_Cipher_Symmetric_Aes256cbc_Interface
{
}

View File

@ -1,33 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Interface.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
interface Zend_InfoCard_Cipher_Symmetric_Aes256cbc_Interface
{
public function decrypt($encryptedData, $decryptionKey, $iv_length = null);
}

View File

@ -1,32 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Interface.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Cipher
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
interface Zend_InfoCard_Cipher_Symmetric_Interface
{
}

View File

@ -1,307 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Claims.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Result value of the InfoCard component, contains any error messages and claims
* from the processing of an information card.
*
* @category Zend
* @package Zend_InfoCard
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Claims
{
/**
* Successful validation and extraion of claims
*/
const RESULT_SUCCESS = 1;
/**
* Indicates there was an error processing the XML document
*/
const RESULT_PROCESSING_FAILURE = 2;
/**
* Indicates that the signature values within the XML document failed verification
*/
const RESULT_VALIDATION_FAILURE = 3;
/**
* The default namespace to assume in these claims
*
* @var string
*/
protected $_defaultNamespace = null;
/**
* A boolean indicating if the claims should be consider "valid" or not based on processing
*
* @var bool
*/
protected $_isValid = true;
/**
* The error message if any
*
* @var string
*/
protected $_error = "";
/**
* An array of claims taken from the information card
*
* @var array
*/
protected $_claims;
/**
* The result code of processing the information card as defined by the constants of this class
*
* @var integer
*/
protected $_code;
/**
* Override for the safeguard which ensures that you don't use claims which failed validation.
* Used in situations when there was a validation error you'd like to ignore
*
* @return Zend_InfoCard_Claims
*/
public function forceValid()
{
trigger_error("Forcing Claims to be valid although it is a security risk", E_USER_WARNING);
$this->_isValid = true;
return $this;
}
/**
* Retrieve the PPI (Private Personal Identifier) associated with the information card
*
* @return string the private personal identifier
*/
public function getCardID()
{
return $this->getClaim('http://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier');
}
/**
* Retrieves the default namespace used in this information card. If a default namespace was not
* set, it figures out which one to consider 'default' by taking the first namespace sorted by use-count
* in claims
*
* @throws Zend_InfoCard_Exception
* @return string The default namespace
*/
public function getDefaultNamespace()
{
if($this->_defaultNamespace === null) {
$namespaces = array();
$leader = '';
foreach($this->_claims as $claim) {
if(!isset($namespaces[$claim['namespace']])) {
$namespaces[$claim['namespace']] = 1;
} else {
$namespaces[$claim['namespace']]++;
}
if(empty($leader) || ($namespaces[$claim['namespace']] > $leader)) {
$leader = $claim['namespace'];
}
}
if(empty($leader)) {
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("Failed to determine default namespace");
}
$this->setDefaultNamespace($leader);
}
return $this->_defaultNamespace;
}
/**
* Set the default namespace, overriding any existing default
*
* @throws Zend_InfoCard_Exception
* @param string $namespace The default namespace to use
* @return Zend_InfoCard_Claims
*/
public function setDefaultNamespace($namespace)
{
foreach($this->_claims as $claim) {
if($namespace == $claim['namespace']) {
$this->_defaultNamespace = $namespace;
return $this;
}
}
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("At least one claim must exist in specified namespace to make it the default namespace");
}
/**
* Indicates if this claim object contains validated claims or not
*
* @return bool
*/
public function isValid()
{
return $this->_isValid;
}
/**
* Set the error message contained within the claims object
*
* @param string $error The error message
* @return Zend_InfoCard_Claims
*/
public function setError($error)
{
$this->_error = $error;
$this->_isValid = false;
return $this;
}
/**
* Retrieve the error message contained within the claims object
*
* @return string The error message
*/
public function getErrorMsg()
{
return $this->_error;
}
/**
* Set the claims for the claims object. Can only be set once and is done
* by the component itself. Internal use only.
*
* @throws Zend_InfoCard_Exception
* @param array $claims
* @return Zend_InfoCard_Claims
*/
public function setClaims(Array $claims)
{
if($this->_claims !== null) {
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("Claim objects are read-only");
}
$this->_claims = $claims;
return $this;
}
/**
* Set the result code of the claims object.
*
* @throws Zend_InfoCard_Exception
* @param int $code The result code
* @return Zend_InfoCard_Claims
*/
public function setCode($code)
{
switch($code) {
case self::RESULT_PROCESSING_FAILURE:
case self::RESULT_SUCCESS:
case self::RESULT_VALIDATION_FAILURE:
$this->_code = $code;
return $this;
}
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("Attempted to set unknown error code");
}
/**
* Gets the result code of the claims object
*
* @return integer The result code
*/
public function getCode()
{
return $this->_code;
}
/**
* Get a claim by providing its complete claim URI
*
* @param string $claimURI The complete claim URI to retrieve
* @return mixed The claim matching that specific URI or null if not found
*/
public function getClaim($claimURI)
{
if($this->claimExists($claimURI)) {
return $this->_claims[$claimURI]['value'];
}
return null;
}
/**
* Indicates if a specific claim URI exists or not within the object
*
* @param string $claimURI The complete claim URI to check
* @return bool true if the claim exists, false if not found
*/
public function claimExists($claimURI)
{
return isset($this->_claims[$claimURI]);
}
/**
* Magic helper function
* @throws Zend_InfoCard_Exception
*/
public function __unset($k)
{
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("Claim objects are read-only");
}
/**
* Magic helper function
*/
public function __isset($k)
{
return $this->claimExists("{$this->getDefaultNamespace()}/$k");
}
/**
* Magic helper function
*/
public function __get($k)
{
return $this->getClaim("{$this->getDefaultNamespace()}/$k");
}
/**
* Magic helper function
* @throws Zend_InfoCard_Exception
*/
public function __set($k, $v)
{
require_once 'Zend/InfoCard/Exception.php';
throw new Zend_InfoCard_Exception("Claim objects are read-only");
}
}

View File

@ -1,43 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Exception.php 24593 2012-01-05 20:35:02Z matthew $
*/
if (class_exists("Zend_Exception")) {
abstract class Zend_InfoCard_Exception_Abstract extends Zend_Exception
{
}
} else {
abstract class Zend_InfoCard_Exception_Abstract extends Exception
{
}
}
/**
* Base Exception class for the InfoCard component
*
* @category Zend
* @package Zend_InfoCard
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Exception extends Zend_InfoCard_Exception_Abstract
{
}

View File

@ -1,88 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Assertion.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Xml_Assertion_Interface
*/
require_once 'Zend/InfoCard/Xml/Assertion/Interface.php';
/**
* Factory object to retrieve an Assertion object based on the type of XML document provided
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
final class Zend_InfoCard_Xml_Assertion
{
/**
* The namespace for a SAML-formatted Assertion document
*/
const TYPE_SAML = 'urn:oasis:names:tc:SAML:1.0:assertion';
/**
* Constructor (disabled)
*
* @return void
*/
private function __construct()
{
}
/**
* Returns an instance of a InfoCard Assertion object based on the XML data provided
*
* @throws Zend_InfoCard_Xml_Exception
* @param string $xmlData The XML-Formatted Assertion
* @return Zend_InfoCard_Xml_Assertion_Interface
* @throws Zend_InfoCard_Xml_Exception
*/
static public function getInstance($xmlData)
{
if($xmlData instanceof Zend_InfoCard_Xml_Element) {
$strXmlData = $xmlData->asXML();
} else if (is_string($xmlData)) {
$strXmlData = $xmlData;
} else {
require_once 'Zend/InfoCard/Xml/Exception.php';
throw new Zend_InfoCard_Xml_Exception("Invalid Data provided to create instance");
}
$sxe = simplexml_load_string($strXmlData);
$namespaces = $sxe->getDocNameSpaces();
foreach($namespaces as $namespace) {
switch($namespace) {
case self::TYPE_SAML:
include_once 'Zend/InfoCard/Xml/Assertion/Saml.php';
return simplexml_load_string($strXmlData, 'Zend_InfoCard_Xml_Assertion_Saml', null);
}
}
require_once 'Zend/InfoCard/Xml/Exception.php';
throw new Zend_InfoCard_Xml_Exception("Unable to determine Assertion type by Namespace");
}
}

View File

@ -1,69 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Interface.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* The Interface required by any InfoCard Assertion Object implemented within the component
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
interface Zend_InfoCard_Xml_Assertion_Interface
{
/**
* Get the Assertion ID of the assertion
*
* @return string The Assertion ID
*/
public function getAssertionID();
/**
* Return an array of attributes (claims) contained within the assertion
*
* @return array An array of attributes / claims within the assertion
*/
public function getAttributes();
/**
* Get the Assertion URI for this type of Assertion
*
* @return string the Assertion URI
*/
public function getAssertionURI();
/**
* Return an array of conditions which the assertions are predicated on
*
* @return array an array of conditions
*/
public function getConditions();
/**
* Validate the conditions array returned from the getConditions() call
*
* @param array $conditions An array of condtions for the assertion taken from getConditions()
* @return mixed Boolean true on success, an array of condition, error message on failure
*/
public function validateConditions(Array $conditions);
}

View File

@ -1,284 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Saml.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Xml_Element
*/
require_once 'Zend/InfoCard/Xml/Element.php';
/**
* Zend_InfoCard_Xml_Assertion_Interface
*/
require_once 'Zend/InfoCard/Xml/Assertion/Interface.php';
/**
* A Xml Assertion Document in SAML Token format
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_Assertion_Saml
extends Zend_InfoCard_Xml_Element
implements Zend_InfoCard_Xml_Assertion_Interface
{
/**
* Audience Restriction Condition
*/
const CONDITION_AUDIENCE = 'AudienceRestrictionCondition';
/**
* The URI for a 'bearer' confirmation
*/
const CONFIRMATION_BEARER = 'urn:oasis:names:tc:SAML:1.0:cm:bearer';
/**
* The amount of time in seconds to buffer when checking conditions to ensure
* that differences between client/server clocks don't interfer too much
*/
const CONDITION_TIME_ADJ = 3600; // +- 5 minutes
protected function _getServerName() {
return $_SERVER['SERVER_NAME'];
}
protected function _getServerPort() {
return $_SERVER['SERVER_PORT'];
}
/**
* Validate the conditions array returned from the getConditions() call
*
* @param array $conditions An array of condtions for the assertion taken from getConditions()
* @return mixed Boolean true on success, an array of condition, error message on failure
*/
public function validateConditions(Array $conditions)
{
$currentTime = time();
if(!empty($conditions)) {
foreach($conditions as $condition => $conditionValue) {
switch(strtolower($condition)) {
case 'audiencerestrictioncondition':
$serverName = $this->_getServerName();
$serverPort = $this->_getServerPort();
$self_aliases[] = $serverName;
$self_aliases[] = "{{$serverName}:{$serverPort}";
$found = false;
if(is_array($conditionValue)) {
foreach($conditionValue as $audience) {
list(,,$audience) = explode('/', $audience);
if(in_array($audience, $self_aliases)) {
$found = true;
break;
}
}
}
if(!$found) {
return array($condition, 'Could not find self in allowed audience list');
}
break;
case 'notbefore':
$notbeforetime = strtotime($conditionValue);
if($currentTime < $notbeforetime) {
if($currentTime + self::CONDITION_TIME_ADJ < $notbeforetime) {
return array($condition, 'Current time is before specified window');
}
}
break;
case 'notonorafter':
$notonoraftertime = strtotime($conditionValue);
if($currentTime >= $notonoraftertime) {
if($currentTime - self::CONDITION_TIME_ADJ >= $notonoraftertime) {
return array($condition, 'Current time is after specified window');
}
}
break;
}
}
}
return true;
}
/**
* Get the Assertion URI for this type of Assertion
*
* @return string the Assertion URI
*/
public function getAssertionURI()
{
return Zend_InfoCard_Xml_Assertion::TYPE_SAML;
}
/**
* Get the Major Version of the SAML Assertion
*
* @return integer The major version number
*/
public function getMajorVersion()
{
return (int)(string)$this['MajorVersion'];
}
/**
* The Minor Version of the SAML Assertion
*
* @return integer The minor version number
*/
public function getMinorVersion()
{
return (int)(string)$this['MinorVersion'];
}
/**
* Get the Assertion ID of the assertion
*
* @return string The Assertion ID
*/
public function getAssertionID()
{
return (string)$this['AssertionID'];
}
/**
* Get the Issuer URI of the assertion
*
* @return string the URI of the assertion Issuer
*/
public function getIssuer()
{
return (string)$this['Issuer'];
}
/**
* Get the Timestamp of when the assertion was issued
*
* @return integer a UNIX timestamp representing when the assertion was issued
*/
public function getIssuedTimestamp()
{
return strtotime((string)$this['IssueInstant']);
}
/**
* Return an array of conditions which the assertions are predicated on
*
* @throws Zend_InfoCard_Xml_Exception
* @return array an array of conditions
*/
public function getConditions()
{
list($conditions) = $this->xpath("//saml:Conditions");
if(!($conditions instanceof Zend_InfoCard_Xml_Element)) {
throw new Zend_InfoCard_Xml_Exception("Unable to find the saml:Conditions block");
}
$retval = array();
foreach($conditions->children('urn:oasis:names:tc:SAML:1.0:assertion') as $key => $value) {
switch($key) {
case self::CONDITION_AUDIENCE:
foreach($value->children('urn:oasis:names:tc:SAML:1.0:assertion') as $audience_key => $audience_value) {
if($audience_key == 'Audience') {
$retval[$key][] = (string)$audience_value;
}
}
break;
}
}
$retval['NotBefore'] = (string)$conditions['NotBefore'];
$retval['NotOnOrAfter'] = (string)$conditions['NotOnOrAfter'];
return $retval;
}
/**
* Get they KeyInfo element for the Subject KeyInfo block
*
* @todo Not Yet Implemented
* @ignore
*/
public function getSubjectKeyInfo()
{
/**
* @todo Not sure if this is part of the scope for now..
*/
if($this->getConfirmationMethod() == self::CONFIRMATION_BEARER) {
throw new Zend_InfoCard_Xml_Exception("Cannot get Subject Key Info when Confirmation Method was Bearer");
}
}
/**
* Return the Confirmation Method URI used in the Assertion
*
* @return string The confirmation method URI
*/
public function getConfirmationMethod()
{
list($confirmation) = $this->xPath("//saml:ConfirmationMethod");
return (string)$confirmation;
}
/**
* Return an array of attributes (claims) contained within the assertion
*
* @return array An array of attributes / claims within the assertion
*/
public function getAttributes()
{
$attributes = $this->xPath('//saml:Attribute');
$retval = array();
foreach($attributes as $key => $value) {
$retkey = (string)$value['AttributeNamespace'].'/'.(string)$value['AttributeName'];
$retval[$retkey]['name'] = (string)$value['AttributeName'];
$retval[$retkey]['namespace'] = (string)$value['AttributeNamespace'];
list($aValue) = $value->children('urn:oasis:names:tc:SAML:1.0:assertion');
$retval[$retkey]['value'] = (string)$aValue;
}
return $retval;
}
}

View File

@ -1,107 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Element.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Xml_Element_Interface
*/
require_once 'Zend/InfoCard/Xml/Element/Interface.php';
/**
* An abstract class representing a an XML data block
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
abstract class Zend_InfoCard_Xml_Element
extends SimpleXMLElement
implements Zend_InfoCard_Xml_Element_Interface
{
/**
* Convert the object to a string by displaying its XML content
*
* @return string an XML representation of the object
*/
public function __toString()
{
return $this->asXML();
}
/**
* Converts an XML Element object into a DOM object
*
* @throws Zend_InfoCard_Xml_Exception
* @param Zend_InfoCard_Xml_Element $e The object to convert
* @return DOMElement A DOMElement representation of the same object
*/
static public function convertToDOM(Zend_InfoCard_Xml_Element $e)
{
$dom = dom_import_simplexml($e);
if(!($dom instanceof DOMElement)) {
// Zend_InfoCard_Xml_Element exntes SimpleXMLElement, so this should *never* fail
// @codeCoverageIgnoreStart
require_once 'Zend/InfoCard/Xml/Exception.php';
throw new Zend_InfoCard_Xml_Exception("Failed to convert between SimpleXML and DOM");
// @codeCoverageIgnoreEnd
}
return $dom;
}
/**
* Converts a DOMElement object into the specific class
*
* @throws Zend_InfoCard_Xml_Exception
* @param DOMElement $e The DOMElement object to convert
* @param string $classname The name of the class to convert it to (must inhert from Zend_InfoCard_Xml_Element)
* @return Zend_InfoCard_Xml_Element a Xml Element object from the DOM element
*/
static public function convertToObject(DOMElement $e, $classname)
{
if (!class_exists($classname)) {
require_once 'Zend/Loader.php';
Zend_Loader::loadClass($classname);
}
$reflection = new ReflectionClass($classname);
if(!$reflection->isSubclassOf('Zend_InfoCard_Xml_Element')) {
require_once 'Zend/InfoCard/Xml/Exception.php';
throw new Zend_InfoCard_Xml_Exception("DOM element must be converted to an instance of Zend_InfoCard_Xml_Element");
}
$sxe = simplexml_import_dom($e, $classname);
if(!($sxe instanceof Zend_InfoCard_Xml_Element)) {
// Since we just checked to see if this was a subclass of Zend_infoCard_Xml_Element this shoudl never fail
// @codeCoverageIgnoreStart
require_once 'Zend/InfoCard/Xml/Exception.php';
throw new Zend_InfoCard_Xml_Exception("Failed to convert between DOM and SimpleXML");
// @codeCoverageIgnoreEnd
}
return $sxe;
}
}

View File

@ -1,44 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Interface.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* The Interface used to represent an XML Data Type
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
interface Zend_InfoCard_Xml_Element_Interface
{
/**
* Return the data within the object as an XML document
*/
public function asXML();
/**
* Magic function which allows us to treat the object as a string to return XML
* (same as the asXML() method)
*/
public function __toString();
}

View File

@ -1,75 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: EncryptedData.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* A factory class for producing Zend_InfoCard_Xml_EncryptedData objects based on
* the type of XML document provided
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
final class Zend_InfoCard_Xml_EncryptedData
{
/**
* Constructor (disabled)
*
* @return void
*/
private function __construct()
{
}
/**
* Returns an instance of the class
*
* @param string $xmlData The XML EncryptedData String
* @return Zend_InfoCard_Xml_EncryptedData_Abstract
* @throws Zend_InfoCard_Xml_Exception
*/
static public function getInstance($xmlData)
{
if($xmlData instanceof Zend_InfoCard_Xml_Element) {
$strXmlData = $xmlData->asXML();
} else if (is_string($xmlData)) {
$strXmlData = $xmlData;
} else {
require_once 'Zend/InfoCard/Xml/Exception.php';
throw new Zend_InfoCard_Xml_Exception("Invalid Data provided to create instance");
}
$sxe = simplexml_load_string($strXmlData);
switch($sxe['Type']) {
case 'http://www.w3.org/2001/04/xmlenc#Element':
include_once 'Zend/InfoCard/Xml/EncryptedData/XmlEnc.php';
return simplexml_load_string($strXmlData, 'Zend_InfoCard_Xml_EncryptedData_XmlEnc');
default:
require_once 'Zend/InfoCard/Xml/Exception.php';
throw new Zend_InfoCard_Xml_Exception("Unknown EncryptedData type found");
break;
}
}
}

View File

@ -1,92 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Abstract.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Xml_Element
*/
require_once 'Zend/InfoCard/Xml/Element.php';
/**
* Zend_InfoCard_Xml_KeyInfo
*/
require_once 'Zend/InfoCard/Xml/KeyInfo.php';
/**
* An abstract class representing a generic EncryptedData XML block. This class is extended
* into a specific type of EncryptedData XML block (i.e. XmlEnc) as necessary
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
abstract class Zend_InfoCard_Xml_EncryptedData_Abstract extends Zend_InfoCard_Xml_Element
{
/**
* Returns the KeyInfo Block
*
* @return Zend_InfoCard_Xml_KeyInfo_Abstract
*/
public function getKeyInfo()
{
return Zend_InfoCard_Xml_KeyInfo::getInstance($this->KeyInfo[0]);
}
/**
* Return the Encryption method used to encrypt the assertion document
* (the symmetric cipher)
*
* @throws Zend_InfoCard_Xml_Exception
* @return string The URI of the Symmetric Encryption Method used
*/
public function getEncryptionMethod()
{
/**
* @todo This is pretty hacky unless we can always be confident that the first
* EncryptionMethod block is the correct one (the AES or compariable symetric algorithm)..
* the second is the PK method if provided.
*/
list($encryption_method) = $this->xpath("//enc:EncryptionMethod");
if(!($encryption_method instanceof Zend_InfoCard_Xml_Element)) {
throw new Zend_InfoCard_Xml_Exception("Unable to find the enc:EncryptionMethod symmetric encryption block");
}
$dom = self::convertToDOM($encryption_method);
if(!$dom->hasAttribute('Algorithm')) {
throw new Zend_InfoCard_Xml_Exception("Unable to determine the encryption algorithm in the Symmetric enc:EncryptionMethod XML block");
}
return $dom->getAttribute('Algorithm');
}
/**
* Returns the value of the encrypted block
*
* @return string the value of the encrypted CipherValue block
*/
abstract function getCipherValue();
}

View File

@ -1,64 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: XmlEnc.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Xml_EncryptedData/Abstract.php
*/
require_once 'Zend/InfoCard/Xml/EncryptedData/Abstract.php';
/**
* An XmlEnc formatted EncryptedData XML block
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_EncryptedData_XmlEnc extends Zend_InfoCard_Xml_EncryptedData_Abstract
{
/**
* Returns the Encrypted CipherValue block from the EncryptedData XML document
*
* @throws Zend_InfoCard_Xml_Exception
* @return string The value of the CipherValue block base64 encoded
*/
public function getCipherValue()
{
$this->registerXPathNamespace('enc', 'http://www.w3.org/2001/04/xmlenc#');
list(,$cipherdata) = $this->xpath("//enc:CipherData");
if(!($cipherdata instanceof Zend_InfoCard_Xml_Element)) {
throw new Zend_InfoCard_Xml_Exception("Unable to find the enc:CipherData block");
}
$cipherdata->registerXPathNamespace('enc', 'http://www.w3.org/2001/04/xmlenc#');
list(,$ciphervalue) = $cipherdata->xpath("//enc:CipherValue");
if(!($ciphervalue instanceof Zend_InfoCard_Xml_Element)) {
throw new Zend_InfoCard_Xml_Exception("Unable to fidn the enc:CipherValue block");
}
return (string)$ciphervalue;
}
}

View File

@ -1,174 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: EncryptedKey.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Xml_Element
*/
require_once 'Zend/InfoCard/Xml/Element.php';
/**
* Zend_InfoCard_Xml_EncryptedKey
*/
require_once 'Zend/InfoCard/Xml/EncryptedKey.php';
/**
* Zend_InfoCard_Xml_KeyInfo_Interface
*/
require_once 'Zend/InfoCard/Xml/KeyInfo/Interface.php';
/**
* An object representing an Xml EncryptedKEy block
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_EncryptedKey
extends Zend_InfoCard_Xml_Element
implements Zend_InfoCard_Xml_KeyInfo_Interface
{
/**
* Return an instance of the object based on input XML Data
*
* @throws Zend_InfoCard_Xml_Exception
* @param string $xmlData The EncryptedKey XML Block
* @return Zend_InfoCard_Xml_EncryptedKey
*/
static public function getInstance($xmlData)
{
if($xmlData instanceof Zend_InfoCard_Xml_Element) {
$strXmlData = $xmlData->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() != "EncryptedKey") {
throw new Zend_InfoCard_Xml_Exception("Invalid XML Block provided for EncryptedKey");
}
return simplexml_load_string($strXmlData, "Zend_InfoCard_Xml_EncryptedKey");
}
/**
* Returns the Encyption Method Algorithm URI of the block
*
* @throws Zend_InfoCard_Xml_Exception
* @return string the Encryption method algorithm URI
*/
public function getEncryptionMethod()
{
$this->registerXPathNamespace('e', 'http://www.w3.org/2001/04/xmlenc#');
list($encryption_method) = $this->xpath("//e:EncryptionMethod");
if(!($encryption_method instanceof Zend_InfoCard_Xml_Element)) {
throw new Zend_InfoCard_Xml_Exception("Unable to find the e:EncryptionMethod KeyInfo encryption block");
}
$dom = self::convertToDOM($encryption_method);
if(!$dom->hasAttribute('Algorithm')) {
throw new Zend_InfoCard_Xml_Exception("Unable to determine the encryption algorithm in the Symmetric enc:EncryptionMethod XML block");
}
return $dom->getAttribute('Algorithm');
}
/**
* Returns the Digest Method Algorithm URI used
*
* @throws Zend_InfoCard_Xml_Exception
* @return string the Digest Method Algorithm URI
*/
public function getDigestMethod()
{
$this->registerXPathNamespace('e', 'http://www.w3.org/2001/04/xmlenc#');
list($encryption_method) = $this->xpath("//e:EncryptionMethod");
if(!($encryption_method instanceof Zend_InfoCard_Xml_Element)) {
throw new Zend_InfoCard_Xml_Exception("Unable to find the e:EncryptionMethod KeyInfo encryption block");
}
if(!($encryption_method->DigestMethod instanceof Zend_InfoCard_Xml_Element)) {
throw new Zend_InfoCard_Xml_Exception("Unable to find the DigestMethod block");
}
$dom = self::convertToDOM($encryption_method->DigestMethod);
if(!$dom->hasAttribute('Algorithm')) {
throw new Zend_InfoCard_Xml_Exception("Unable to determine the digest algorithm for the symmetric Keyinfo");
}
return $dom->getAttribute('Algorithm');
}
/**
* Returns the KeyInfo block object
*
* @throws Zend_InfoCard_Xml_Exception
* @return Zend_InfoCard_Xml_KeyInfo_Abstract
*/
public function getKeyInfo()
{
if(isset($this->KeyInfo)) {
return Zend_InfoCard_Xml_KeyInfo::getInstance($this->KeyInfo);
}
throw new Zend_InfoCard_Xml_Exception("Unable to locate a KeyInfo block");
}
/**
* Return the encrypted value of the block in base64 format
*
* @throws Zend_InfoCard_Xml_Exception
* @return string The Value of the CipherValue block in base64 format
*/
public function getCipherValue()
{
$this->registerXPathNamespace('e', 'http://www.w3.org/2001/04/xmlenc#');
list($cipherdata) = $this->xpath("//e:CipherData");
if(!($cipherdata instanceof Zend_InfoCard_Xml_Element)) {
throw new Zend_InfoCard_Xml_Exception("Unable to find the e:CipherData block");
}
$cipherdata->registerXPathNameSpace('enc', 'http://www.w3.org/2001/04/xmlenc#');
list($ciphervalue) = $cipherdata->xpath("//enc:CipherValue");
if(!($ciphervalue instanceof Zend_InfoCard_Xml_Element)) {
throw new Zend_InfoCard_Xml_Exception("Unable to fidn the enc:CipherValue block");
}
return (string)$ciphervalue;
}
}

View File

@ -1,37 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Exception.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Exception
*/
require_once 'Zend/InfoCard/Exception.php';
/**
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_Exception extends Zend_InfoCard_Exception
{
}

View File

@ -1,90 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: KeyInfo.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Xml_Element
*/
require_once 'Zend/InfoCard/Xml/Element.php';
/**
* Factory class to return a XML KeyInfo block based on input XML
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_KeyInfo
{
/**
* Constructor (disabled)
*
* @return void
*/
private function __construct()
{
}
/**
* Returns an instance of KeyInfo object based on the input KeyInfo XML block
*
* @param string $xmlData The KeyInfo XML Block
* @return Zend_InfoCard_Xml_KeyInfo_Abstract
* @throws Zend_InfoCard_Xml_Exception
*/
static public function getInstance($xmlData)
{
if($xmlData instanceof Zend_InfoCard_Xml_Element) {
$strXmlData = $xmlData->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);
$namespaces = $sxe->getDocNameSpaces();
if(!empty($namespaces)) {
foreach($sxe->getDocNameSpaces() as $namespace) {
switch($namespace) {
case 'http://www.w3.org/2000/09/xmldsig#':
include_once 'Zend/InfoCard/Xml/KeyInfo/XmlDSig.php';
return simplexml_load_string($strXmlData, 'Zend_InfoCard_Xml_KeyInfo_XmlDSig');
default:
throw new Zend_InfoCard_Xml_Exception("Unknown KeyInfo Namespace provided");
// We are ignoring these lines, as XDebug reports each as a "non executed" line
// which breaks my coverage %
// @codeCoverageIgnoreStart
}
}
}
// @codeCoverageIgnoreEnd
include_once 'Zend/InfoCard/Xml/KeyInfo/Default.php';
return simplexml_load_string($strXmlData, 'Zend_InfoCard_Xml_KeyInfo_Default');
}
}

View File

@ -1,37 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Abstract.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Xml_Element
*/
require_once 'Zend/InfoCard/Xml/Element.php';
/**
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
abstract class Zend_InfoCard_Xml_KeyInfo_Abstract extends Zend_InfoCard_Xml_Element
{
}

View File

@ -1,64 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Default.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Xml_KeyInfo_Abstract
*/
require_once 'Zend/InfoCard/Xml/KeyInfo/Abstract.php';
/**
* Zend_InfoCard_Xml_SecurityTokenReference
*/
require_once 'Zend/InfoCard/Xml/SecurityTokenReference.php';
/**
* An object representation of a XML <KeyInfo> block which doesn't provide a namespace
* In this context, it is assumed to mean that it is the type of KeyInfo block which
* contains the SecurityTokenReference
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_KeyInfo_Default extends Zend_InfoCard_Xml_KeyInfo_Abstract
{
/**
* Returns the object representation of the SecurityTokenReference block
*
* @throws Zend_InfoCard_Xml_Exception
* @return Zend_InfoCard_Xml_SecurityTokenReference
*/
public function getSecurityTokenReference()
{
$this->registerXPathNamespace('o', 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd');
list($sectokenref) = $this->xpath('//o:SecurityTokenReference');
if(!($sectokenref instanceof Zend_InfoCard_Xml_Element)) {
throw new Zend_InfoCard_Xml_Exception('Could not locate the Security Token Reference');
}
return Zend_InfoCard_Xml_SecurityTokenReference::getInstance($sectokenref);
}
}

View File

@ -1,38 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Interface.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
interface Zend_InfoCard_Xml_KeyInfo_Interface
{
/**
* Return an object representing a KeyInfo data type
*
* @return Zend_InfoCard_Xml_KeyInfo
*/
public function getKeyInfo();
}

View File

@ -1,76 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: XmlDSig.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Xml_KeyInfo_Abstract
*/
require_once 'Zend/InfoCard/Xml/KeyInfo/Abstract.php';
/**
* Zend_InfoCard_Xml_EncryptedKey
*/
require_once 'Zend/InfoCard/Xml/EncryptedKey.php';
/**
* Zend_InfoCard_Xml_KeyInfo_Interface
*/
require_once 'Zend/InfoCard/Xml/KeyInfo/Interface.php';
/**
* Represents a Xml Digital Signature XML Data Block
*
* @category Zend
* @package Zend_InfoCard
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_KeyInfo_XmlDSig
extends Zend_InfoCard_Xml_KeyInfo_Abstract
implements Zend_InfoCard_Xml_KeyInfo_Interface
{
/**
* Returns an instance of the EncryptedKey Data Block
*
* @throws Zend_InfoCard_Xml_Exception
* @return Zend_InfoCard_Xml_EncryptedKey
*/
public function getEncryptedKey()
{
$this->registerXPathNamespace('e', 'http://www.w3.org/2001/04/xmlenc#');
list($encryptedkey) = $this->xpath('//e:EncryptedKey');
if(!($encryptedkey instanceof Zend_InfoCard_Xml_Element)) {
throw new Zend_InfoCard_Xml_Exception("Failed to retrieve encrypted key");
}
return Zend_InfoCard_Xml_EncryptedKey::getInstance($encryptedkey);
}
/**
* Returns the KeyInfo Block within the encrypted key
*
* @return Zend_InfoCard_Xml_KeyInfo_Default
*/
public function getKeyInfo()
{
return $this->getEncryptedKey()->getKeyInfo();
}
}

View File

@ -1,327 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Security.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Xml_Security_Transform
*/
require_once 'Zend/InfoCard/Xml/Security/Transform.php';
/**
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_Security
{
/**
* ASN.1 type INTEGER class
*/
const ASN_TYPE_INTEGER = 0x02;
/**
* ASN.1 type BIT STRING class
*/
const ASN_TYPE_BITSTRING = 0x03;
/**
* ASN.1 type SEQUENCE class
*/
const ASN_TYPE_SEQUENCE = 0x30;
/**
* The URI for Canonical Method C14N Exclusive
*/
const CANONICAL_METHOD_C14N_EXC = 'http://www.w3.org/2001/10/xml-exc-c14n#';
/**
* The URI for Signature Method SHA1
*/
const SIGNATURE_METHOD_SHA1 = 'http://www.w3.org/2000/09/xmldsig#rsa-sha1';
/**
* The URI for Digest Method SHA1
*/
const DIGEST_METHOD_SHA1 = 'http://www.w3.org/2000/09/xmldsig#sha1';
/**
* The Identifier for RSA Keys
*/
const RSA_KEY_IDENTIFIER = '300D06092A864886F70D0101010500';
/**
* Constructor (disabled)
*
* @return void
*/
private function __construct()
{
}
/**
* Validates the signature of a provided XML block
*
* @param string $strXMLInput An XML block containing a Signature
* @return bool True if the signature validated, false otherwise
* @throws Zend_InfoCard_Xml_Security_Exception
*/
static public function validateXMLSignature($strXMLInput)
{
if(!extension_loaded('openssl')) {
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("You must have the openssl extension installed to use this class");
}
$sxe = simplexml_load_string($strXMLInput);
if(!isset($sxe->Signature)) {
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Could not identify XML Signature element");
}
if(!isset($sxe->Signature->SignedInfo)) {
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Signature is missing a SignedInfo block");
}
if(!isset($sxe->Signature->SignatureValue)) {
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Signature is missing a SignatureValue block");
}
if(!isset($sxe->Signature->KeyInfo)) {
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Signature is missing a KeyInfo block");
}
if(!isset($sxe->Signature->KeyInfo->KeyValue)) {
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Signature is missing a KeyValue block");
}
switch((string)$sxe->Signature->SignedInfo->CanonicalizationMethod['Algorithm']) {
case self::CANONICAL_METHOD_C14N_EXC:
$cMethod = (string)$sxe->Signature->SignedInfo->CanonicalizationMethod['Algorithm'];
break;
default:
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Unknown or unsupported CanonicalizationMethod Requested");
break;
}
switch((string)$sxe->Signature->SignedInfo->SignatureMethod['Algorithm']) {
case self::SIGNATURE_METHOD_SHA1:
$sMethod = (string)$sxe->Signature->SignedInfo->SignatureMethod['Algorithm'];
break;
default:
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Unknown or unsupported SignatureMethod Requested");
break;
}
switch((string)$sxe->Signature->SignedInfo->Reference->DigestMethod['Algorithm']) {
case self::DIGEST_METHOD_SHA1:
$dMethod = (string)$sxe->Signature->SignedInfo->Reference->DigestMethod['Algorithm'];
break;
default:
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Unknown or unsupported DigestMethod Requested");
break;
}
$base64DecodeSupportsStrictParam = version_compare(PHP_VERSION, '5.2.0', '>=');
if ($base64DecodeSupportsStrictParam) {
$dValue = base64_decode((string)$sxe->Signature->SignedInfo->Reference->DigestValue, true);
} else {
$dValue = base64_decode((string)$sxe->Signature->SignedInfo->Reference->DigestValue);
}
if ($base64DecodeSupportsStrictParam) {
$signatureValue = base64_decode((string)$sxe->Signature->SignatureValue, true);
} else {
$signatureValue = base64_decode((string)$sxe->Signature->SignatureValue);
}
$transformer = new Zend_InfoCard_Xml_Security_Transform();
foreach($sxe->Signature->SignedInfo->Reference->Transforms->children() as $transform) {
$transformer->addTransform((string)$transform['Algorithm']);
}
$transformed_xml = $transformer->applyTransforms($strXMLInput);
$transformed_xml_binhash = pack("H*", sha1($transformed_xml));
if(!self::_secureStringCompare($transformed_xml_binhash, $dValue)) {
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Locally Transformed XML does not match XML Document. Cannot Verify Signature");
}
$public_key = null;
switch(true) {
case isset($sxe->Signature->KeyInfo->KeyValue->X509Certificate):
$certificate = (string)$sxe->Signature->KeyInfo->KeyValue->X509Certificate;
$pem = "-----BEGIN CERTIFICATE-----\n" .
wordwrap($certificate, 64, "\n", true) .
"\n-----END CERTIFICATE-----";
$public_key = openssl_pkey_get_public($pem);
if(!$public_key) {
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Unable to extract and prcoess X509 Certificate from KeyValue");
}
break;
case isset($sxe->Signature->KeyInfo->KeyValue->RSAKeyValue):
if(!isset($sxe->Signature->KeyInfo->KeyValue->RSAKeyValue->Modulus) ||
!isset($sxe->Signature->KeyInfo->KeyValue->RSAKeyValue->Exponent)) {
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("RSA Key Value not in Modulus/Exponent form");
}
$modulus = base64_decode((string)$sxe->Signature->KeyInfo->KeyValue->RSAKeyValue->Modulus);
$exponent = base64_decode((string)$sxe->Signature->KeyInfo->KeyValue->RSAKeyValue->Exponent);
$pem_public_key = self::_getPublicKeyFromModExp($modulus, $exponent);
$public_key = openssl_pkey_get_public ($pem_public_key);
break;
default:
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Unable to determine or unsupported representation of the KeyValue block");
}
$transformer = new Zend_InfoCard_Xml_Security_Transform();
$transformer->addTransform((string)$sxe->Signature->SignedInfo->CanonicalizationMethod['Algorithm']);
// The way we are doing our XML processing requires that we specifically add this
// (even though it's in the <Signature> parent-block).. otherwise, our canonical form
// fails signature verification
$sxe->Signature->SignedInfo->addAttribute('xmlns', 'http://www.w3.org/2000/09/xmldsig#');
$canonical_signedinfo = $transformer->applyTransforms($sxe->Signature->SignedInfo->asXML());
if(@openssl_verify($canonical_signedinfo, $signatureValue, $public_key)) {
return (string)$sxe->Signature->SignedInfo->Reference['URI'];
}
return false;
}
/**
* Transform an RSA Key in Modulus/Exponent format into a PEM encoding and
* return an openssl resource for it
*
* @param string $modulus The RSA Modulus in binary format
* @param string $exponent The RSA exponent in binary format
* @return string The PEM encoded version of the key
*/
static protected function _getPublicKeyFromModExp($modulus, $exponent)
{
$modulusInteger = self::_encodeValue($modulus, self::ASN_TYPE_INTEGER);
$exponentInteger = self::_encodeValue($exponent, self::ASN_TYPE_INTEGER);
$modExpSequence = self::_encodeValue($modulusInteger . $exponentInteger, self::ASN_TYPE_SEQUENCE);
$modExpBitString = self::_encodeValue($modExpSequence, self::ASN_TYPE_BITSTRING);
$binRsaKeyIdentifier = pack( "H*", self::RSA_KEY_IDENTIFIER );
$publicKeySequence = self::_encodeValue($binRsaKeyIdentifier . $modExpBitString, self::ASN_TYPE_SEQUENCE);
$publicKeyInfoBase64 = base64_encode( $publicKeySequence );
$publicKeyString = "-----BEGIN PUBLIC KEY-----\n";
$publicKeyString .= wordwrap($publicKeyInfoBase64, 64, "\n", true);
$publicKeyString .= "\n-----END PUBLIC KEY-----\n";
return $publicKeyString;
}
/**
* Encode a limited set of data types into ASN.1 encoding format
* which is used in X.509 certificates
*
* @param string $data The data to encode
* @param const $type The encoding format constant
* @return string The encoded value
* @throws Zend_InfoCard_Xml_Security_Exception
*/
static protected function _encodeValue($data, $type)
{
// Null pad some data when we get it (integer values > 128 and bitstrings)
if( (($type == self::ASN_TYPE_INTEGER) && (ord($data) > 0x7f)) ||
($type == self::ASN_TYPE_BITSTRING)) {
$data = "\0$data";
}
$len = strlen($data);
// encode the value based on length of the string
// I'm fairly confident that this is by no means a complete implementation
// but it is enough for our purposes
switch(true) {
case ($len < 128):
return sprintf("%c%c%s", $type, $len, $data);
case ($len < 0x0100):
return sprintf("%c%c%c%s", $type, 0x81, $len, $data);
case ($len < 0x010000):
return sprintf("%c%c%c%c%s", $type, 0x82, $len / 0x0100, $len % 0x0100, $data);
default:
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Could not encode value");
}
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Invalid code path");
}
/**
* Securely compare two strings for equality while avoided C level memcmp()
* optimisations capable of leaking timing information useful to an attacker
* attempting to iteratively guess the unknown string (e.g. password) being
* compared against.
*
* @param string $a
* @param string $b
* @return bool
*/
static protected function _secureStringCompare($a, $b)
{
if (strlen($a) !== strlen($b)) {
return false;
}
$result = 0;
for ($i = 0; $i < strlen($a); $i++) {
$result |= ord($a[$i]) ^ ord($b[$i]);
}
return $result == 0;
}
}

View File

@ -1,37 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Exception.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Xml_Exception
*/
require_once 'Zend/InfoCard/Xml/Exception.php';
/**
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_Security_Exception extends Zend_InfoCard_Xml_Exception
{
}

View File

@ -1,116 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Transform.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* A class to create a transform rule set based on XML URIs and then apply those rules
* in the correct order to a given XML input
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_Security_Transform
{
/**
* A list of transforms to apply
*
* @var array
*/
protected $_transformList = array();
/**
* Returns the name of the transform class based on a given URI
*
* @throws Zend_InfoCard_Xml_Security_Exception
* @param string $uri The transform URI
* @return string The transform implementation class name
*/
protected function _findClassbyURI($uri)
{
switch($uri) {
case 'http://www.w3.org/2000/09/xmldsig#enveloped-signature':
return 'Zend_InfoCard_Xml_Security_Transform_EnvelopedSignature';
case 'http://www.w3.org/2001/10/xml-exc-c14n#':
return 'Zend_InfoCard_Xml_Security_Transform_XmlExcC14N';
default:
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Unknown or Unsupported Transformation Requested");
}
}
/**
* Add a Transform URI to the list of transforms to perform
*
* @param string $uri The Transform URI
* @return Zend_InfoCard_Xml_Security_Transform
*/
public function addTransform($uri)
{
$class = $this->_findClassbyURI($uri);
$this->_transformList[] = array('uri' => $uri,
'class' => $class);
return $this;
}
/**
* Return the list of transforms to perform
*
* @return array The list of transforms
*/
public function getTransformList()
{
return $this->_transformList;
}
/**
* Apply the transforms in the transform list to the input XML document
*
* @param string $strXmlDocument The input XML
* @return string The XML after the transformations have been applied
*/
public function applyTransforms($strXmlDocument)
{
foreach($this->_transformList as $transform) {
if (!class_exists($transform['class'])) {
require_once 'Zend/Loader.php';
Zend_Loader::loadClass($transform['class']);
}
$transformer = new $transform['class'];
// We can't really test this check because it would require logic changes in the component itself
// @codeCoverageIgnoreStart
if(!($transformer instanceof Zend_InfoCard_Xml_Security_Transform_Interface)) {
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
throw new Zend_InfoCard_Xml_Security_Exception("Transforms must implement the Transform Interface");
}
// @codeCoverageIgnoreEnd
$strXmlDocument = $transformer->transform($strXmlDocument);
}
return $strXmlDocument;
}
}

View File

@ -1,60 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: EnvelopedSignature.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Xml_Security_Transform_Interface
*/
require_once 'Zend/InfoCard/Xml/Security/Transform/Interface.php';
/**
* A object implementing the EnvelopedSignature XML Transform
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_Security_Transform_EnvelopedSignature
implements Zend_InfoCard_Xml_Security_Transform_Interface
{
/**
* Transforms the XML Document according to the EnvelopedSignature Transform
*
* @throws Zend_InfoCard_Xml_Security_Transform_Exception
* @param string $strXMLData The input XML data
* @return string the transformed XML data
*/
public function transform($strXMLData)
{
$sxe = simplexml_load_string($strXMLData);
if(!$sxe->Signature) {
require_once 'Zend/InfoCard/Xml/Security/Transform/Exception.php';
throw new Zend_InfoCard_Xml_Security_Transform_Exception("Unable to locate Signature Block for EnvelopedSignature Transform");
}
unset($sxe->Signature);
return $sxe->asXML();
}
}

View File

@ -1,37 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Exception.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Xml_Security_Exception
*/
require_once 'Zend/InfoCard/Xml/Security/Exception.php';
/**
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_Security_Transform_Exception extends Zend_InfoCard_Xml_Security_Exception
{
}

View File

@ -1,43 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Interface.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Interface for XML Security Transforms
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
interface Zend_InfoCard_Xml_Security_Transform_Interface
{
/**
* Transform the given XML string according to the transform rules
* implemented by the object using this interface
*
* @throws Zend_InfoCard_Xml_Security_Transform_Exception
* @param string $strXmlData the input XML
* @return string the output XML
*/
public function transform($strXmlData);
}

View File

@ -1,59 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: XmlExcC14N.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Xml_Security_Transform_Interface
*/
require_once 'Zend/InfoCard/Xml/Security/Transform/Interface.php';
/**
* A Transform to perform C14n XML Exclusive Canonicalization
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml_Security
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_Security_Transform_XmlExcC14N
implements Zend_InfoCard_Xml_Security_Transform_Interface
{
/**
* Transform the input XML based on C14n XML Exclusive Canonicalization rules
*
* @throws Zend_InfoCard_Xml_Security_Transform_Exception
* @param string $strXMLData The input XML
* @return string The output XML
*/
public function transform($strXMLData)
{
$dom = new DOMDocument();
$dom->loadXML($strXMLData);
if(method_exists($dom, 'C14N')) {
return $dom->C14N(true, false);
}
require_once 'Zend/InfoCard/Xml/Security/Transform/Exception.php';
throw new Zend_InfoCard_Xml_Security_Transform_Exception("This transform requires the C14N() method to exist in the DOM extension");
}
}

View File

@ -1,173 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: SecurityTokenReference.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* Zend_InfoCard_Xml_Element
*/
require_once 'Zend/InfoCard/Xml/Element.php';
/**
* Represents a SecurityTokenReference XML block
*
* @category Zend
* @package Zend_InfoCard
* @subpackage Zend_InfoCard_Xml
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_InfoCard_Xml_SecurityTokenReference extends Zend_InfoCard_Xml_Element
{
/**
* Base64 Binary Encoding URI
*/
const ENCODING_BASE64BIN = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary';
/**
* Return an instance of the object based on the input XML
*
* @param string $xmlData The SecurityTokenReference XML Block
* @return Zend_InfoCard_Xml_SecurityTokenReference
* @throws Zend_InfoCard_Xml_Exception
*/
static public function getInstance($xmlData)
{
if($xmlData instanceof Zend_InfoCard_Xml_Element) {
$strXmlData = $xmlData->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;
}
}

View File

@ -1,107 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Service
* @subpackage Nirvanix
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Nirvanix.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* @see Zend_Http_Client
*/
require_once 'Zend/Http/Client.php';
/**
* This class allows Nirvanix authentication credentials to be specified
* in one place and provides a factory for returning convenience wrappers
* around the Nirvanix web service namespaces.
*
* @category Zend
* @package Zend_Service
* @subpackage Nirvanix
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_Service_Nirvanix
{
/**
* Options to pass to namespace proxies
* @param array
*/
protected $_options;
/**
* Class constructor. Authenticates with Nirvanix to receive a
* sessionToken, which is then passed to each future request.
*
* @param array $authParams Authentication POST parameters. This
* should have keys "username", "password",
* and "appKey".
* @param array $options Options to pass to namespace proxies
*/
public function __construct($authParams, $options = array())
{
// merge options with default options
$defaultOptions = array('defaults' => array(),
'httpClient' => new Zend_Http_Client(),
'host' => 'http://services.nirvanix.com');
$this->_options = array_merge($defaultOptions, $options);
// login and save sessionToken to default POST params
$resp = $this->getService('Authentication')->login($authParams);
$this->_options['defaults']['sessionToken'] = (string)$resp->SessionToken;
}
/**
* Nirvanix divides its service into namespaces, with each namespace
* providing different functionality. This is a factory method that
* returns a preconfigured Zend_Service_Nirvanix_Namespace_Base proxy.
*
* @param string $namespace Name of the namespace
* @return Zend_Service_Nirvanix_Namespace_Base
*/
public function getService($namespace, $options = array())
{
switch ($namespace) {
case 'IMFS':
$class = 'Zend_Service_Nirvanix_Namespace_Imfs';
break;
default:
$class = 'Zend_Service_Nirvanix_Namespace_Base';
}
$options['namespace'] = ucfirst($namespace);
$options = array_merge($this->_options, $options);
if (!class_exists($class)) {
require_once 'Zend/Loader.php';
Zend_Loader::loadClass($class);
}
return new $class($options);
}
/**
* Get the configured options.
*
* @return array
*/
public function getOptions()
{
return $this->_options;
}
}

View File

@ -1,36 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Service
* @subpackage Nirvanix
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Exception.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* @see Zend_Service_Exception
*/
require_once 'Zend/Service/Exception.php';
/**
* @category Zend
* @package Zend_Service
* @subpackage Nirvanix
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_Service_Nirvanix_Exception extends Zend_Service_Exception
{}

View File

@ -1,172 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Service
* @subpackage Nirvanix
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Base.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* @see Zend_Http_Client
*/
require_once 'Zend/Http/Client.php';
/**
* @see Zend_Service_Nirvanix_Response
*/
require_once 'Zend/Service/Nirvanix/Response.php';
/**
* The Nirvanix web services are split into namespaces. This is a proxy class
* representing one namespace. It allows calls to the namespace to be made by
* PHP object calls rather than by having to construct HTTP client requests.
*
* @category Zend
* @package Zend_Service
* @subpackage Nirvanix
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_Service_Nirvanix_Namespace_Base
{
/**
* HTTP client instance that will be used to make calls to
* the Nirvanix web services.
* @var Zend_Http_Client
*/
protected $_httpClient;
/**
* Host to use for calls to this Nirvanix namespace. It is possible
* that the user will wish to use different hosts for different namespaces.
* @var string
*/
protected $_host = 'http://services.nirvanix.com';
/**
* Name of this namespace as used in the URL.
* @var string
*/
protected $_namespace = '';
/**
* Defaults for POST parameters. When a request to the service is to be
* made, the POST parameters are merged into these. This is a convenience
* feature so parameters that are repeatedly required like sessionToken
* do not need to be supplied again and again by the user.
*
* @param array
*/
protected $_defaults = array();
/**
* Class constructor.
*
* @param array $options Options and dependency injection
*/
public function __construct($options = array())
{
if (isset($options['baseUrl'])) {
$this->_host = $options['baseUrl'];
}
if (isset($options['namespace'])) {
$this->_namespace = $options['namespace'];
}
if (isset($options['defaults'])) {
$this->_defaults = $options['defaults'];
}
if (! isset($options['httpClient'])) {
$options['httpClient'] = new Zend_Http_Client();
}
$this->_httpClient = $options['httpClient'];
}
/**
* When a method call is made against this proxy, convert it to
* an HTTP request to make against the Nirvanix REST service.
*
* $imfs->DeleteFiles(array('filePath' => 'foo'));
*
* Assuming this object was proxying the IMFS namespace, the
* method call above would call the DeleteFiles command. The
* POST parameters would be filePath, merged with the
* $this->_defaults (containing the sessionToken).
*
* @param string $methodName Name of the command to call
* on this namespace.
* @param array $args Only the first is used and it must be
* an array. It contains the POST params.
*
* @return Zend_Service_Nirvanix_Response
*/
public function __call($methodName, $args)
{
$uri = $this->_makeUri($methodName);
$this->_httpClient->setUri($uri);
if (!isset($args[0]) || !is_array($args[0])) {
$args[0] = array();
}
$params = array_merge($this->_defaults, $args[0]);
$this->_httpClient->resetParameters();
$this->_httpClient->setParameterPost($params);
$httpResponse = $this->_httpClient->request(Zend_Http_Client::POST);
return $this->_wrapResponse($httpResponse);
}
/**
* Return the HTTP client used for this namespace. This is useful
* for inspecting the last request or directly interacting with the
* HTTP client.
*
* @return Zend_Http_Client
*/
public function getHttpClient()
{
return $this->_httpClient;
}
/**
* Make a complete URI from an RPC method name. All Nirvanix REST
* service URIs use the same format.
*
* @param string $methodName RPC method name
* @return string
*/
protected function _makeUri($methodName)
{
$methodName = ucfirst($methodName);
return "{$this->_host}/ws/{$this->_namespace}/{$methodName}.ashx";
}
/**
* All Nirvanix REST service calls return an XML payload. This method
* makes a Zend_Service_Nirvanix_Response from that XML payload.
*
* @param Zend_Http_Response $httpResponse Raw response from Nirvanix
* @return Zend_Service_Nirvanix_Response Wrapped response
*/
protected function _wrapResponse($httpResponse)
{
return new Zend_Service_Nirvanix_Response($httpResponse->getBody());
}
}

View File

@ -1,105 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Service
* @subpackage Nirvanix
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Imfs.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* @see Zend_Service_Nirvanix_Namespace_Base
*/
require_once 'Zend/Service/Nirvanix/Namespace/Base.php';
/**
* Namespace proxy with additional convenience methods for the IMFS namespace.
*
* @category Zend
* @package Zend_Service
* @subpackage Nirvanix
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_Service_Nirvanix_Namespace_Imfs extends Zend_Service_Nirvanix_Namespace_Base
{
/**
* Convenience function to get the contents of a file on
* the Nirvanix IMFS. Analog to PHP's file_get_contents().
*
* @param string $filePath Remote path and filename
* @param integer $expiration Number of seconds that Nirvanix
* make the file available for download.
* @return string Contents of file
*/
public function getContents($filePath, $expiration = 3600)
{
// get url to download the file
$params = array('filePath' => $filePath,
'expiration' => $expiration);
$resp = $this->getOptimalUrls($params);
$url = (string)$resp->Download->DownloadURL;
// download the file
$this->_httpClient->resetParameters();
$this->_httpClient->setUri($url);
$resp = $this->_httpClient->request(Zend_Http_Client::GET);
return $resp->getBody();
}
/**
* Convenience function to put the contents of a string into
* the Nirvanix IMFS. Analog to PHP's file_put_contents().
*
* @param string $filePath Remote path and filename
* @param integer $data Data to store in the file
* @param string $mimeType Mime type of data
* @return Zend_Service_Nirvanix_Response
*/
public function putContents($filePath, $data, $mimeType = null)
{
// get storage node for upload
$params = array('sizeBytes' => strlen($data));
$resp = $this->getStorageNode($params);
$host = (string)$resp->GetStorageNode->UploadHost;
$uploadToken = (string)$resp->GetStorageNode->UploadToken;
// http upload data into remote file
$this->_httpClient->resetParameters();
$this->_httpClient->setUri("http://{$host}/Upload.ashx");
$this->_httpClient->setParameterPost('uploadToken', $uploadToken);
$this->_httpClient->setParameterPost('destFolderPath', str_replace('\\', '/',dirname($filePath)));
$this->_httpClient->setFileUpload(basename($filePath), 'uploadFile', $data, $mimeType);
$response = $this->_httpClient->request(Zend_Http_Client::POST);
return new Zend_Service_Nirvanix_Response($response->getBody());
}
/**
* Convenience function to remove a file from the Nirvanix IMFS.
* Analog to PHP's unlink().
*
* @param string $filePath Remove path and filename
* @return Zend_Service_Nirvanix_Response
*/
public function unlink($filePath)
{
$params = array('filePath' => $filePath);
return $this->deleteFiles($params);
}
}

View File

@ -1,123 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Service
* @subpackage Nirvanix
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id: Response.php 24593 2012-01-05 20:35:02Z matthew $
*/
/**
* This class decorates a SimpleXMLElement parsed from a Nirvanix web service
* response. It is primarily exists to provide a convenience feature that
* throws an exception when <ResponseCode> contains an error.
*
* @category Zend
* @package Zend_Service
* @subpackage Nirvanix
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_Service_Nirvanix_Response
{
/**
* SimpleXMLElement parsed from Nirvanix web service response.
*
* @var SimpleXMLElement
*/
protected $_sxml;
/**
* Class constructor. Parse the XML response from a Nirvanix method
* call into a decorated SimpleXMLElement element.
*
* @param string $xml XML response string from Nirvanix
* @throws Zend_Service_Nirvanix_Exception
*/
public function __construct($xml)
{
$this->_sxml = @simplexml_load_string($xml);
if (! $this->_sxml instanceof SimpleXMLElement) {
$this->_throwException("XML could not be parsed from response: $xml");
}
$name = $this->_sxml->getName();
if ($name != 'Response') {
$this->_throwException("Expected XML element Response, got $name");
}
$code = (int)$this->_sxml->ResponseCode;
if ($code != 0) {
$msg = (string)$this->_sxml->ErrorMessage;
$this->_throwException($msg, $code);
}
}
/**
* Return the SimpleXMLElement representing this response
* for direct access.
*
* @return SimpleXMLElement
*/
public function getSxml()
{
return $this->_sxml;
}
/**
* Delegate undefined properties to the decorated SimpleXMLElement.
*
* @param string $offset Undefined property name
* @return mixed
*/
public function __get($offset)
{
return $this->_sxml->$offset;
}
/**
* Delegate undefined methods to the decorated SimpleXMLElement.
*
* @param string $offset Underfined method name
* @param array $args Method arguments
* @return mixed
*/
public function __call($method, $args)
{
return call_user_func_array(array($this->_sxml, $method), $args);
}
/**
* Throw an exception. This method exists to only contain the
* lazy-require() of the exception class.
*
* @param string $message Error message
* @param integer $code Error code
* @throws Zend_Service_Nirvanix_Exception
* @return void
*/
protected function _throwException($message, $code = null)
{
/**
* @see Zend_Service_Nirvanix_Exception
*/
require_once 'Zend/Service/Nirvanix/Exception.php';
throw new Zend_Service_Nirvanix_Exception($message, $code);
}
}

View File

@ -1,317 +0,0 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_View
* @subpackage Helper
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
/** Zend_View_Helper_HtmlElement */
require_once 'Zend/View/Helper/HtmlElement.php';
/**
* Helper for generating urls and/or image tags for use with tinysrc.net
*
* tinysrc.net provides an API for generating scaled, browser device-specific
* images. In essence, you pass the API the URL to an image on your own server,
* and tinysrc.net then provides the appropriate image based on the device that
* accesses it.
*
* Additionally, tinysrc.net allows you to specify additional configuration via
* the API:
*
* - image size. You may define this as:
* - explicit size
* - subtractive size (size of screen minus specified number of pixels)
* - percentage size (percentage of screen size))
* - image format. This will convert the image to the given format; allowed
* values are "png" or "jpeg". By default, gif images are converted to png.
*
* This helper allows you to specify all configuration options, as well as:
*
* - whether or not to generate the full image tag (or just the URL)
* - base url to images (which should include the protocol, server, and
* optionally port and base path)
*
* @see http://tinysrc.net/
* @package Zend_View
* @subpackage Helper
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_View_Helper_TinySrc extends Zend_View_Helper_HtmlElement
{
const TINYSRC_BASE = 'http://i.tinysrc.mobi';
/**
* @var string Base URL for images
*/
protected $_baseUrl;
/**
* @var bool Whether or not to create an image tag
*/
protected $_createTagFlag = true;
/**
* @var string Default width and height
*/
protected $_dimensions = '';
/**
* Default options
*
* Used when determining what options were passed, and needing to merge
* them with default options.
*
* @var array
*/
protected $_defaultOptions = array(
'base_url' => null,
'format' => null,
'width' => false,
'height' => false,
'create_tag' => true,
);
/**
* @var string Default image format to use
*/
protected $_format = '';
/**
* Generate a link or image tag pointing to tinysrc.net
*
* @param mixed $image
* @param array $options
* @return void
*/
public function tinySrc($image = null, array $options = array())
{
if (null === $image) {
return $this;
}
$defaultOptions = $this->_defaultOptions;
$defaultOptions['create_tag'] = $this->createTag();
$options = array_merge($defaultOptions, $options);
$url = '/' . $this->_mergeBaseUrl($options) . ltrim($image, '/');
$src = self::TINYSRC_BASE
. $this->_mergeFormat($options)
. $this->_mergeDimensions($options)
. $url;
if (!$options['create_tag']) {
return $src;
}
foreach (array_keys($this->_defaultOptions) as $key) {
switch ($key) {
case 'width':
case 'height':
if (!is_int($options[$key]) || !is_numeric($options[$key]) || $options[$key] < 0) {
unset($options[$key]);
}
break;
default:
unset($options[$key]);
break;
}
}
$options['src'] = $src;
$tag = '<img' . $this->_htmlAttribs($options) . $this->getClosingBracket();
return $tag;
}
/**
* Set base URL for images
*
* @param string $url
* @return Zend_View_Helper_TinySrc
*/
public function setBaseUrl($url)
{
$this->_baseUrl = rtrim($url, '/') . '/';
return $this;
}
/**
* Get base URL for images
*
* If none already set, uses the ServerUrl and BaseUrl view helpers to
* determine the base URL to images.
*
* @return string
*/
public function getBaseUrl()
{
if (null === $this->_baseUrl) {
$this->setBaseUrl($this->view->serverUrl($this->view->baseUrl()));
}
return $this->_baseUrl;
}
/**
* Set default image format
*
* If set, this will set the default format to use on all images.
*
* @param null|string $format
* @return Zend_View_Helper_TinySrc
* @throws Zend_View_Exception
*/
public function setDefaultFormat($format = null)
{
if (null === $format) {
$this->_format = '';
return $this;
}
$format = strtolower($format);
if (!in_array($format, array('png', 'jpeg'))) {
require_once 'Zend/View/Exception.php';
throw new Zend_View_Exception('Invalid format; must be one of "jpeg" or "png"');
}
$this->_format = "/$format";
return $this;
}
/**
* Set default dimensions
*
* If null is specified for width, default dimensions will be cleared. If
* only width is specified, only width will be used. If either dimension
* fails validation, an exception is raised.
*
* @param null|int|string $width
* @param null|int|string $height
* @return Zend_View_Helper_TinySrc
* @throws Zend_View_Exception
*/
public function setDefaultDimensions($width = null, $height = null)
{
if (null === $width) {
$this->_dimensions = '';
return $this;
}
if (!$this->_validateDimension($width)) {
require_once 'Zend/View/Exception.php';
throw new Zend_View_Exception('Invalid dimension; must be an integer, optionally preceded by "-" or "x"');
}
$this->_dimensions = "/$width";
if (null === $height) {
return $this;
}
if (!$this->_validateDimension($height)) {
require_once 'Zend/View/Exception.php';
throw new Zend_View_Exception('Invalid dimension; must be an integer, optionally preceded by "-" or "x"');
}
$this->_dimensions .= "/$height";
return $this;
}
/**
* Set state of "create tag" flag
*
* @param bool $flag
* @return Zend_View_Helper_TinySrc
*/
public function setCreateTag($flag)
{
$this->_createTagFlag = (bool) $flag;
return $this;
}
/**
* Should the helper create an image tag?
*
* @return bool
*/
public function createTag()
{
return $this->_createTagFlag;
}
/**
* Validate a dimension
*
* Dimensions may be integers, optionally preceded by '-' or 'x'.
*
* @param string $dim
* @return bool
*/
protected function _validateDimension($dim)
{
if (!is_scalar($dim) || is_bool($dim)) {
return false;
}
return preg_match('/^(-|x)?\d+$/', (string) $dim);
}
/**
* Determine whether to use default base URL, or base URL from options
*
* @param array $options
* @return string
*/
protected function _mergeBaseUrl(array $options)
{
if (null === $options['base_url']) {
return $this->getBaseUrl();
}
return rtrim($options['base_url'], '/') . '/';
}
/**
* Determine whether to use default format or format provided in options.
*
* @param array $options
* @return string
*/
protected function _mergeFormat(array $options)
{
if (in_array($options['format'], array('png', 'jpeg'))) {
return '/' . $options['format'];
}
return $this->_format;
}
/**
* Determine whether to use default dimensions, or those passed in options.
*
* @param array $options
* @return string
*/
protected function _mergeDimensions(array $options)
{
if (!$this->_validateDimension($options['width'])) {
return $this->_dimensions;
}
$dimensions = '/' . $options['width'];
if (!$this->_validateDimension($options['height'])) {
return $dimensions;
}
$dimensions .= '/' . $options['height'];
return $dimensions;
}
}