From b9b4fc427528f6cf5be9318328c559ab319707c3 Mon Sep 17 00:00:00 2001
From: Jaime Perez <jaime.perez@uninett.no>
Date: Wed, 5 Mar 2014 09:53:44 +0100
Subject: [PATCH] Remove MetaDataStorageHandlerDynamicXML. This closes #4.

---
 .../MetaDataStorageHandlerDynamicXML.php      | 259 ------------------
 .../Metadata/MetaDataStorageSource.php        |   2 -
 2 files changed, 261 deletions(-)
 delete mode 100644 lib/SimpleSAML/Metadata/MetaDataStorageHandlerDynamicXML.php

diff --git a/lib/SimpleSAML/Metadata/MetaDataStorageHandlerDynamicXML.php b/lib/SimpleSAML/Metadata/MetaDataStorageHandlerDynamicXML.php
deleted file mode 100644
index fb21c7bf0..000000000
--- a/lib/SimpleSAML/Metadata/MetaDataStorageHandlerDynamicXML.php
+++ /dev/null
@@ -1,259 +0,0 @@
-<?php
-
-/**
- * This class implements the dynamic SAML profile, where the entityID equals a URL where
- * metadata is located. The XML files should be in the SAML 2.0 metadata format.
- *
- * @author Andreas Ă…kre Solberg, UNINETT AS.
- * @author Olav Morken, UNINETT AS.
- * @package simpleSAMLphp
- */
-class SimpleSAML_Metadata_MetaDataStorageHandlerDynamicXML extends SimpleSAML_Metadata_MetaDataStorageSource {
-
-	/**
-	 * The cache directory, or NULL if no cache directory is configured.
-	 */
-	private $cacheDir;
-
-
-	/**
-	 * The maximum cache length, in seconds.
-	 */
-	private $cacheLength;
-
-
-	/**
-	 * This function initializes the dynamic XML metadata source.
-	 *
-	 * Options:
-	 * - 'cachedir':  Directory where metadata can be cached. Optional.
-	 * - 'cachelength': Maximum time metadata cah be cached, in seconds. Default to 24
-	 *                  hours (86400 seconds).
-	 *
-	 * @param array $config  The configuration for this instance of the XML metadata source.
-	 */
-	protected function __construct($config) {
-		assert('is_array($config)');
-
-		if (array_key_exists('cachedir', $config)) {
-			$globalConfig = SimpleSAML_Configuration::getInstance();
-			$this->cacheDir = $globalConfig->resolvePath($config['cachedir']);
-		} else {
-			$this->cacheDir = NULL;
-		}
-
-		if (array_key_exists('cachelength', $config)) {
-			$this->cacheLength = $config['cachelength'];
-		} else {
-			$this->cacheLength = 86400;
-		}
-
-	}
-
-
-	/**
-	 * This function returns an associative array with metadata for all entities in the given set. The
-	 * key of the array is the entity id.
-	 *
-	 * @param $set  The set we want to list metadata for.
-	 * @return An associative array with all entities in the given set.
-	 */
-	public function getMetadataSet($set) {
-
-		/* We don't have this metadata set. */
-		return array();
-	}
-
-
-	/**
-	 * Find the cache file name for an entity,
-	 *
-	 * @param string $set  The metadata set this entity belongs to.
-	 * @param string $entityId  The entity id of this entity.
-	 * @return string  The full path to the cache file.
-	 */
-	private function getCacheFilename($set, $entityId) {
-		assert('is_string($set)');
-		assert('is_string($entityId)');
-
-		$cachekey = sha1($entityId);
-		$globalConfig = SimpleSAML_Configuration::getInstance();
-		return $this->cacheDir . '/' . $set . '-' . $cachekey . '.cached.xml';
-	}
-
-
-	/**
-	 * Load a entity from the cache.
-	 *
-	 * @param string $set  The metadata set this entity belongs to.
-	 * @param string $entityId  The entity id of this entity.
-	 * @return array|NULL  The associative array with the metadata for this entity, or NULL
-	 *                     if the entity could not be found.
-	 */
-	private function getFromCache($set, $entityId) {
-		assert('is_string($set)');
-		assert('is_string($entityId)');
-
-		if (empty($this->cacheDir)) {
-			return NULL;
-		}
-
-		$cachefilename = $this->getCacheFilename($set, $entityId);
-		if (!file_exists($cachefilename)) return NULL;
-		if (!is_readable($cachefilename)) throw new Exception('Could not read cache file for entity [' . $cachefilename. ']');
-		SimpleSAML_Logger::debug('MetaData - Handler.DynamicXML: Reading cache [' . $entityId . '] => [' . $cachefilename . ']' );
-
-		/* Ensure that this metadata isn't older that the cachelength option allows. This
-		 * must be verified based on the file, since this option may be changed after the
-		 * file is written.
-		 */
-		$stat = stat($cachefilename);
-		if ($stat['mtime'] + $this->cacheLength <= time()) {
-			SimpleSAML_Logger::debug('MetaData - Handler.DynamicXML: Cache file older that the cachelength option allows.');
-			return NULL;
-		}
-
-		$rawData = file_get_contents($cachefilename);
-		if (empty($rawData)) {
-			throw new Exception('Error reading metadata from cache file "' . $cachefilename . '": ' .
-				SimpleSAML_Utilities::getLastError());
-		}
-
-		$data = unserialize($rawData);
-		if ($data === FALSE) {
-			throw new Exception('Error deserializing cached data from file "' . $cachefilename .'".');
-		}
-
-		if (!is_array($data)) {
-			throw new Exception('Cached metadata from "' . $cachefilename . '" wasn\'t an array.');
-		}
-
-		return $data;
-	}
-
-
-	/**
-	 * Save a entity to the cache.
-	 *
-	 * @param string $set  The metadata set this entity belongs to.
-	 * @param string $entityId  The entity id of this entity.
-	 * @param array $data  The associative array with the metadata for this entity.
-	 */
-	private function writeToCache($set, $entityId, $data) {
-		assert('is_string($set)');
-		assert('is_string($entityId)');
-		assert('is_array($data)');
-
-		if (empty($this->cacheDir)) {
-			return;
-		}
-
-		$cachefilename = $this->getCacheFilename($set, $entityId);
-		if (!is_writable(dirname($cachefilename))) throw new Exception('Could not write cache file for entity [' . $cachefilename. ']');
-		SimpleSAML_Logger::debug('MetaData - Handler.DynamicXML: Writing cache [' . $entityId . '] => [' . $cachefilename . ']' );
-		file_put_contents($cachefilename, serialize($data));
-	}
-
-
-	/**
-	 * Retrieve metadata for the correct set from a SAML2Parser.
-	 *
-	 * @param SimpleSAML_Metadata_SAMLParser $entity  A SAML2Parser representing an entity.
-	 * @param string $set  The metadata set we are looking for.
-	 * @return array|NULL  The associative array with the metadata, or NULL if no metadata for
-	 *                     the given set was found.
-	 */
-	private static function getParsedSet(SimpleSAML_Metadata_SAMLParser $entity, $set) {
-		assert('is_string($set)');
-
-		switch($set) {
-		case 'saml20-idp-remote':
-			return $entity->getMetadata20IdP();
-		case 'saml20-sp-remote':
-			return $entity->getMetadata20SP();
-		case 'shib13-idp-remote':
-			return $entity->getMetadata1xIdP();
-		case 'shib13-sp-remote':
-			return $entity->getMetadata1xSP();
-		default:
-			SimpleSAML_Logger::warning('MetaData - Handler.DynamicXML: Unknown metadata set: ' . $set);
-		}
-
-		return NULL;
-	}
-
-
-	/**
-	 * Overriding this function from the superclass SimpleSAML_Metadata_MetaDataStorageSource.
-	 *
-	 * This function retrieves metadata for the given entity id in the given set of metadata.
-	 * It will return NULL if it is unable to locate the metadata.
-	 *
-	 * This class implements this function using the getMetadataSet-function. A subclass should
-	 * override this function if it doesn't implement the getMetadataSet function, or if the
-	 * implementation of getMetadataSet is slow.
-	 *
-	 * @param $index  The entityId or metaindex we are looking up.
-	 * @param $set  The set we are looking for metadata in.
-	 * @return An associative array with metadata for the given entity, or NULL if we are unable to
-	 *         locate the entity.
-	 */
-	public function getMetaData($index, $set) {
-		assert('is_string($index)');
-		assert('is_string($set)');
-
-		if (!preg_match('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@', $index)) {
-			SimpleSAML_Logger::info('MetaData - Handler.DynamicXML: EntityID/index [' . $index . '] does not look like a URL. Skipping.' );
-			return NULL;
-		}
-
-		SimpleSAML_Logger::info('MetaData - Handler.DynamicXML: Loading metadata entity [' . $index . '] from [' . $set . ']' );
-
-		/* Read from cache if possible. */
-		$data = $this->getFromCache($set, $index);
-
-		if ($data !== NULL && array_key_exists('expires', $data) && $data['expires'] < time()) {
-			/* Metadata has expired. */
-			$data = NULL;
-		}
-
-		if (isset($data)) {
-			/* Metadata found in cache and not expired. */
-			SimpleSAML_Logger::debug('MetaData - Handler.DynamicXML: Using cached metadata.');
-			return $data;
-		}
-
-		SimpleSAML_Logger::debug('MetaData - Handler.DynamicXML: Downloading [' . $index . ']' );
-		$xmldata = file_get_contents($index);
-		if (empty($xmldata)) {
-			throw new Exception('Error downloading metadata from "' . $index . '": ' .
-				SimpleSAML_Utilities::getLastError());
-		}
-
-		$entities = SimpleSAML_Metadata_SAMLParser::parseDescriptorsString($xmldata);
-		SimpleSAML_Logger::debug('MetaData - Handler.DynamicXML: Completed parsing of [' .
-			$index . '] Found [' . count($entities). '] entries.' );
-
-		if (count($entities) === 0) {
-			throw new Exception('No entities found in "' . $index . '".');
-		}
-
-		if (!array_key_exists($index, $entities)) {
-			throw new Exception ('No entity with correct entity id found in "' . $index . '".');
-		}
-
-		$entity = $entities[$index];
-		$data = self::getParsedSet($entity, $set);
-		if ($data === NULL) {
-			throw new Exception('No metadata for set "' . $set .
-				'" available from "' . $index . '".');
-		}
-
-		$this->writeToCache($set, $index, $data);
-
-		return $data;
-	}
-
-}
-
-?>
\ No newline at end of file
diff --git a/lib/SimpleSAML/Metadata/MetaDataStorageSource.php b/lib/SimpleSAML/Metadata/MetaDataStorageSource.php
index aefdb6df8..5a4ebf238 100644
--- a/lib/SimpleSAML/Metadata/MetaDataStorageSource.php
+++ b/lib/SimpleSAML/Metadata/MetaDataStorageSource.php
@@ -64,8 +64,6 @@ abstract class SimpleSAML_Metadata_MetaDataStorageSource {
 				return new SimpleSAML_Metadata_MetaDataStorageHandlerFlatFile($sourceConfig);
 			case 'xml':
 				return new SimpleSAML_Metadata_MetaDataStorageHandlerXML($sourceConfig);
-			case 'dynamicxml':
-				return new SimpleSAML_Metadata_MetaDataStorageHandlerDynamicXML($sourceConfig);
 			case 'serialize':
 				return new SimpleSAML_Metadata_MetaDataStorageHandlerSerialize($sourceConfig);
 			default:
-- 
GitLab