diff options
Diffstat (limited to 'phpBB/includes/extension')
| -rw-r--r-- | phpBB/includes/extension/base.php | 135 | ||||
| -rw-r--r-- | phpBB/includes/extension/exception.php | 27 | ||||
| -rw-r--r-- | phpBB/includes/extension/finder.php | 523 | ||||
| -rw-r--r-- | phpBB/includes/extension/interface.php | 67 | ||||
| -rw-r--r-- | phpBB/includes/extension/manager.php | 513 | ||||
| -rw-r--r-- | phpBB/includes/extension/metadata_manager.php | 371 | ||||
| -rw-r--r-- | phpBB/includes/extension/provider.php | 76 | 
7 files changed, 0 insertions, 1712 deletions
| diff --git a/phpBB/includes/extension/base.php b/phpBB/includes/extension/base.php deleted file mode 100644 index c4462b64d8..0000000000 --- a/phpBB/includes/extension/base.php +++ /dev/null @@ -1,135 +0,0 @@ -<?php -/** -* -* @package extension -* @copyright (c) 2011 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 -* -*/ - -/** -* @ignore -*/ -if (!defined('IN_PHPBB')) -{ -	exit; -} - -use Symfony\Component\DependencyInjection\ContainerInterface; - -/** -* A base class for extensions without custom enable/disable/purge code. -* -* @package extension -*/ -class phpbb_extension_base implements phpbb_extension_interface -{ -	/** @var ContainerInterface */ -	protected $container; - -	/** @var phpbb_extension_finder */ -	protected $finder; - -	/** @var phpbb_db_migrator */ -	protected $migrator; - -	/** @var string */ -	protected $extension_name; - -	/** @var string */ -	protected $extension_path; - -	/** -	* Constructor -	* -	* @param ContainerInterface $container Container object -	* @param phpbb_extension_finder $extension_finder -	* @param string $extension_name Name of this extension (from ext.manager) -	* @param string $extension_path Relative path to this extension -	*/ -	public function __construct(ContainerInterface $container, phpbb_extension_finder $extension_finder, phpbb_db_migrator $migrator, $extension_name, $extension_path) -	{ -		$this->container = $container; -		$this->extension_finder = $extension_finder; -		$this->migrator = $migrator; - -		$this->extension_name = $extension_name; -		$this->extension_path = $extension_path; -	} - -	/** -	* Single enable step that installs any included migrations -	* -	* @param mixed $old_state State returned by previous call of this method -	* @return false Indicates no further steps are required -	*/ -	public function enable_step($old_state) -	{ -		$migrations = $this->get_migration_file_list(); - -		$this->migrator->set_migrations($migrations); - -		$this->migrator->update(); - -		return !$this->migrator->finished(); -	} - -	/** -	* Single disable step that does nothing -	* -	* @param mixed $old_state State returned by previous call of this method -	* @return false Indicates no further steps are required -	*/ -	public function disable_step($old_state) -	{ -		return false; -	} - -	/** -	* Single purge step that reverts any included and installed migrations -	* -	* @param mixed $old_state State returned by previous call of this method -	* @return false Indicates no further steps are required -	*/ -	public function purge_step($old_state) -	{ -		$migrations = $this->get_migration_file_list(); - -		$this->migrator->set_migrations($migrations); - -		foreach ($migrations as $migration) -		{ -			while ($this->migrator->migration_state($migration) !== false) -			{ -				$this->migrator->revert($migration); - -				return true; -			} -		} - -		return false; -	} - -	/** -	* Get the list of migration files from this extension -	* -	* @return array -	*/ -	protected function get_migration_file_list() -	{ -		static $migrations = false; - -		if ($migrations !== false) -		{ -			return $migrations; -		} - -		// Only have the finder search in this extension path directory -		$migrations = $this->extension_finder -			->extension_directory('/migrations') -			->find_from_extension($this->extension_name, $this->extension_path); -		$migrations = $this->extension_finder->get_classes_from_files($migrations); - -		return $migrations; -	} -} diff --git a/phpBB/includes/extension/exception.php b/phpBB/includes/extension/exception.php deleted file mode 100644 index e08a8912ea..0000000000 --- a/phpBB/includes/extension/exception.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php -/** -* -* @package extension -* @copyright (c) 2012 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 -* -*/ - -/** -* @ignore -*/ -if (!defined('IN_PHPBB')) -{ -	exit; -} - -/** - * Exception class for metadata - */ -class phpbb_extension_exception extends UnexpectedValueException -{ -	public function __toString() -	{ -		return $this->getMessage(); -	} -}
\ No newline at end of file diff --git a/phpBB/includes/extension/finder.php b/phpBB/includes/extension/finder.php deleted file mode 100644 index 49bb2a514f..0000000000 --- a/phpBB/includes/extension/finder.php +++ /dev/null @@ -1,523 +0,0 @@ -<?php -/** -* -* @package extension -* @copyright (c) 2011 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 -* -*/ - -/** -* @ignore -*/ -if (!defined('IN_PHPBB')) -{ -	exit; -} - -/** -* The extension finder provides a simple way to locate files in active extensions -* -* @package extension -*/ -class phpbb_extension_finder -{ -	protected $extension_manager; -	protected $filesystem; -	protected $phpbb_root_path; -	protected $cache; -	protected $php_ext; - -	/** -	* The cache variable name used to store $this->cached_queries in $this->cache. -	* -	* Allows the use of multiple differently configured finders with the same cache. -	* @var string -	*/ -	protected $cache_name; - -	/** -	* An associative array, containing all search parameters set in methods. -	* @var	array -	*/ -	protected $query; - -	/** -	* A map from md5 hashes of serialized queries to their previously retrieved -	* results. -	* @var	array -	*/ -	protected $cached_queries; - -	/** -	* Creates a new finder instance with its dependencies -	* -	* @param phpbb_extension_manager $extension_manager An extension manager -	*            instance that provides the finder with a list of active -	*            extensions and their locations -	* @param phpbb_filesystem $filesystem Filesystem instance -	* @param string $phpbb_root_path Path to the phpbb root directory -	* @param phpbb_cache_driver_interface $cache A cache instance or null -	* @param string $php_ext php file extension -	* @param string $cache_name The name of the cache variable, defaults to -	*                           _ext_finder -	*/ -	public function __construct(phpbb_extension_manager $extension_manager, phpbb_filesystem $filesystem, $phpbb_root_path = '', phpbb_cache_driver_interface $cache = null, $php_ext = 'php', $cache_name = '_ext_finder') -	{ -		$this->extension_manager = $extension_manager; -		$this->filesystem = $filesystem; -		$this->phpbb_root_path = $phpbb_root_path; -		$this->cache = $cache; -		$this->php_ext = $php_ext; -		$this->cache_name = $cache_name; - -		$this->query = array( -			'core_path' => false, -			'core_suffix' => false, -			'core_prefix' => false, -			'core_directory' => false, -			'extension_suffix' => false, -			'extension_prefix' => false, -			'extension_directory' => false, -		); - -		$this->cached_queries = ($this->cache) ? $this->cache->get($this->cache_name) : false; -	} - -	/** -	* Sets a core path to be searched in addition to extensions -	* -	* @param string $core_path The path relative to phpbb_root_path -	* @return phpbb_extension_finder This object for chaining calls -	*/ -	public function core_path($core_path) -	{ -		$this->query['core_path'] = $core_path; -		return $this; -	} - -	/** -	* Sets the suffix all files found in extensions and core must match. -	* -	* There is no default file extension, so to find PHP files only, you will -	* have to specify .php as a suffix. However when using get_classes, the .php -	* file extension is automatically added to suffixes. -	* -	* @param string $suffix A filename suffix -	* @return phpbb_extension_finder This object for chaining calls -	*/ -	public function suffix($suffix) -	{ -		$this->core_suffix($suffix); -		$this->extension_suffix($suffix); -		return $this; -	} - -	/** -	* Sets a suffix all files found in extensions must match -	* -	* There is no default file extension, so to find PHP files only, you will -	* have to specify .php as a suffix. However when using get_classes, the .php -	* file extension is automatically added to suffixes. -	* -	* @param string $extension_suffix A filename suffix -	* @return phpbb_extension_finder This object for chaining calls -	*/ -	public function extension_suffix($extension_suffix) -	{ -		$this->query['extension_suffix'] = $extension_suffix; -		return $this; -	} - -	/** -	* Sets a suffix all files found in the core path must match -	* -	* There is no default file extension, so to find PHP files only, you will -	* have to specify .php as a suffix. However when using get_classes, the .php -	* file extension is automatically added to suffixes. -	* -	* @param string $core_suffix A filename suffix -	* @return phpbb_extension_finder This object for chaining calls -	*/ -	public function core_suffix($core_suffix) -	{ -		$this->query['core_suffix'] = $core_suffix; -		return $this; -	} - -	/** -	* Sets the prefix all files found in extensions and core must match -	* -	* @param string $prefix A filename prefix -	* @return phpbb_extension_finder This object for chaining calls -	*/ -	public function prefix($prefix) -	{ -		$this->core_prefix($prefix); -		$this->extension_prefix($prefix); -		return $this; -	} - -	/** -	* Sets a prefix all files found in extensions must match -	* -	* @param string $extension_prefix A filename prefix -	* @return phpbb_extension_finder This object for chaining calls -	*/ -	public function extension_prefix($extension_prefix) -	{ -		$this->query['extension_prefix'] = $extension_prefix; -		return $this; -	} - -	/** -	* Sets a prefix all files found in the core path must match -	* -	* @param string $core_prefix A filename prefix -	* @return phpbb_extension_finder This object for chaining calls -	*/ -	public function core_prefix($core_prefix) -	{ -		$this->query['core_prefix'] = $core_prefix; -		return $this; -	} - -	/** -	* Sets a directory all files found in extensions and core must be contained in -	* -	* Automatically sets the core_directory if its value does not differ from -	* the current directory. -	* -	* @param string $directory -	* @return phpbb_extension_finder This object for chaining calls -	*/ -	public function directory($directory) -	{ -		$this->core_directory($directory); -		$this->extension_directory($directory); -		return $this; -	} - -	/** -	* Sets a directory all files found in extensions must be contained in -	* -	* @param string $extension_directory -	* @return phpbb_extension_finder This object for chaining calls -	*/ -	public function extension_directory($extension_directory) -	{ -		$this->query['extension_directory'] = $this->sanitise_directory($extension_directory); -		return $this; -	} - -	/** -	* Sets a directory all files found in the core path must be contained in -	* -	* @param string $core_directory -	* @return phpbb_extension_finder This object for chaining calls -	*/ -	public function core_directory($core_directory) -	{ -		$this->query['core_directory'] = $this->sanitise_directory($core_directory); -		return $this; -	} - -	/** -	* Removes occurances of /./ and makes sure path ends without trailing slash -	* -	* @param string $directory A directory pattern -	* @return string A cleaned up directory pattern -	*/ -	protected function sanitise_directory($directory) -	{ -		$directory = $this->filesystem->clean_path($directory); -		$dir_len = strlen($directory); - -		if ($dir_len > 1 && $directory[$dir_len - 1] === '/') -		{ -			$directory = substr($directory, 0, -1); -		} - -		return $directory; -	} - -	/** -	* Finds classes matching the configured options if they follow phpBB naming rules. -	* -	* The php file extension is automatically added to suffixes. -	* -	* Note: If a file is matched but contains a class name not following the -	* phpBB naming rules an incorrect class name will be returned. -	* -	* @param bool $cache Whether the result should be cached -	* @param bool $use_all_available Use all available instead of just all -	* 						enabled extensions -	* @return array An array of found class names -	*/ -	public function get_classes($cache = true, $use_all_available = false) -	{ -		$this->query['extension_suffix'] .= '.' . $this->php_ext; -		$this->query['core_suffix'] .= '.' . $this->php_ext; - -		$files = $this->find($cache, false, $use_all_available); - -		return $this->get_classes_from_files($files); -	} - -	/** -	* Get class names from a list of files -	* -	* @param array $files Array of files (from find()) -	* @return array Array of class names -	*/ -	public function get_classes_from_files($files) -	{ -		$classes = array(); -		foreach ($files as $file => $ext_name) -		{ -			$file = preg_replace('#^includes/#', '', $file); - -			$classes[] = 'phpbb_' . str_replace('/', '_', substr($file, 0, -strlen('.' . $this->php_ext))); -		} -		return $classes; -	} - -	/** -	* Finds all directories matching the configured options -	* -	* @param bool $cache Whether the result should be cached -	* @param bool $use_all_available Use all available instead of just all -	* 						enabled extensions -	* @param bool $extension_keys Whether the result should have extension name as array key -	* @return array An array of paths to found directories -	*/ -	public function get_directories($cache = true, $use_all_available = false, $extension_keys = false) -	{ -		return $this->find_with_root_path($cache, true, $use_all_available, $extension_keys); -	} - -	/** -	* Finds all files matching the configured options. -	* -	* @param bool $cache Whether the result should be cached -	* @param bool $use_all_available Use all available instead of just all -	* 						enabled extensions -	* @return array An array of paths to found files -	*/ -	public function get_files($cache = true, $use_all_available = false) -	{ -		return $this->find_with_root_path($cache, false, $use_all_available); -	} - -	/** -	* A wrapper around the general find which prepends a root path to results -	* -	* @param bool $cache Whether the result should be cached -	* @param bool $is_dir Directories will be returned when true, only files -	*                     otherwise -	* @param bool $use_all_available Use all available instead of just all -	* 						enabled extensions -	* @param bool $extension_keys If true, result will be associative array -	*					with extension name as key -	* @return array An array of paths to found items -	*/ -	protected function find_with_root_path($cache = true, $is_dir = false, $use_all_available = false, $extension_keys = false) -	{ -		$items = $this->find($cache, $is_dir, $use_all_available); - -		$result = array(); -		foreach ($items as $item => $ext_name) -		{ -			if ($extension_keys) -			{ -				$result[$ext_name] = $this->phpbb_root_path . $item; -			} -			else -			{ -				$result[] = $this->phpbb_root_path . $item; -			} -		} - -		return $result; -	} - -	/** -	* Finds all file system entries matching the configured options -	* -	* @param bool $cache Whether the result should be cached -	* @param bool $is_dir Directories will be returned when true, only files -	*                     otherwise -	* @param bool $use_all_available Use all available instead of just all -	* 						enabled extensions -	* @return array An array of paths to found items -	*/ -	public function find($cache = true, $is_dir = false, $use_all_available = false) -	{ -		if ($use_all_available) -		{ -			$extensions = $this->extension_manager->all_available(); -		} -		else -		{ -			$extensions = $this->extension_manager->all_enabled(); -		} - -		if ($this->query['core_path']) -		{ -			$extensions['/'] = $this->phpbb_root_path . $this->query['core_path']; -		} - -		$files = array(); -		$file_list = $this->find_from_paths($extensions, $cache, $is_dir); - -		foreach ($file_list as $file) -		{ -			$files[$file['named_path']] = $file['ext_name']; -		} - -		return $files; -	} -	 -	/** -	* Finds all file system entries matching the configured options for one -	* specific extension -	* -	* @param string $extension_name Name of the extension -	* @param string $extension_path Relative path to the extension root directory -	* @param bool $cache Whether the result should be cached -	* @param bool $is_dir Directories will be returned when true, only files -	*                     otherwise -	* @return array An array of paths to found items -	*/ -	public function find_from_extension($extension_name, $extension_path, $cache = true, $is_dir = false) -	{ -		$extensions = array( -			$extension_name => $extension_path, -		); - -		$files = array(); -		$file_list = $this->find_from_paths($extensions, $cache, $is_dir); - -		foreach ($file_list as $file) -		{ -			$files[$file['named_path']] = $file['ext_name']; -		} - -		return $files; -	} - -	/** -	* Finds all file system entries matching the configured options from -	* an array of paths -	* -	* @param array $extensions Array of extensions (name => full relative path) -	* @param bool $cache Whether the result should be cached -	* @param bool $is_dir Directories will be returned when true, only files -	*                     otherwise -	* @return array An array of paths to found items -	*/ -	public function find_from_paths($extensions, $cache = true, $is_dir = false) -	{ -		$this->query['is_dir'] = $is_dir; -		$query = md5(serialize($this->query) . serialize($extensions)); - -		if (!defined('DEBUG') && $cache && isset($this->cached_queries[$query])) -		{ -			return $this->cached_queries[$query]; -		} - -		$files = array(); - -		foreach ($extensions as $name => $path) -		{ -			$ext_name = $name; - -			if (!file_exists($path)) -			{ -				continue; -			} - -			if ($name === '/') -			{ -				$location = $this->query['core_path']; -				$name = ''; -				$suffix = $this->query['core_suffix']; -				$prefix = $this->query['core_prefix']; -				$directory = $this->query['core_directory']; -			} -			else -			{ -				$location = 'ext/'; -				$name .= '/'; -				$suffix = $this->query['extension_suffix']; -				$prefix = $this->query['extension_prefix']; -				$directory = $this->query['extension_directory']; -			} - -			// match only first directory if leading slash is given -			if ($directory === '/') -			{ -				$directory_pattern = '^' . preg_quote(DIRECTORY_SEPARATOR, '#'); -			} -			else if ($directory && $directory[0] === '/') -			{ -				$directory_pattern = '^' . preg_quote(str_replace('/', DIRECTORY_SEPARATOR, $directory) . DIRECTORY_SEPARATOR, '#'); -			} -			else -			{ -				$directory_pattern = preg_quote(DIRECTORY_SEPARATOR . str_replace('/', DIRECTORY_SEPARATOR, $directory) . DIRECTORY_SEPARATOR, '#'); -			} -			if ($is_dir) -			{ -				$directory_pattern .= '$'; -			} -			$directory_pattern = '#' . $directory_pattern . '#'; - -			$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST); -			foreach ($iterator as $file_info) -			{ -				$filename = $file_info->getFilename(); -				if ($filename == '.' || $filename == '..') -				{ -					continue; -				} - -				if ($file_info->isDir() == $is_dir) -				{ -					if ($is_dir) -					{ -						$relative_path = $iterator->getInnerIterator()->getSubPath() . DIRECTORY_SEPARATOR . basename($filename) . DIRECTORY_SEPARATOR; -						if ($relative_path[0] !== DIRECTORY_SEPARATOR) -						{ -							$relative_path = DIRECTORY_SEPARATOR . $relative_path; -						} -					} -					else -					{ -						$relative_path = DIRECTORY_SEPARATOR . $iterator->getInnerIterator()->getSubPathname(); -					} - -					if ((!$suffix || substr($relative_path, -strlen($suffix)) === $suffix) && -						(!$prefix || substr($filename, 0, strlen($prefix)) === $prefix) && -						(!$directory || preg_match($directory_pattern, $relative_path))) -					{ -						$files[] = array( -							'named_path'	=> str_replace(DIRECTORY_SEPARATOR, '/', $location . $name . substr($relative_path, 1)), -							'ext_name'		=> $ext_name, -							'path'			=> str_replace(array(DIRECTORY_SEPARATOR, $this->phpbb_root_path), array('/', ''), $file_info->getPath()) . '/', -							'filename'		=> $filename, -						); -					} -				} -			} -		} - -		if ($cache && $this->cache) -		{ -			$this->cached_queries[$query] = $files; -			$this->cache->put($this->cache_name, $this->cached_queries); -		} - -		return $files; -	} -} diff --git a/phpBB/includes/extension/interface.php b/phpBB/includes/extension/interface.php deleted file mode 100644 index 7b36a12bf6..0000000000 --- a/phpBB/includes/extension/interface.php +++ /dev/null @@ -1,67 +0,0 @@ -<?php -/** -* -* @package extension -* @copyright (c) 2011 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 -* -*/ - -/** -* @ignore -*/ -if (!defined('IN_PHPBB')) -{ -	exit; -} - -/** -* The interface extension meta classes have to implement to run custom code -* on enable/disable/purge. -* -* @package extension -*/ -interface phpbb_extension_interface -{ -	/** -	* enable_step is executed on enabling an extension until it returns false. -	* -	* Calls to this function can be made in subsequent requests, when the -	* function is invoked through a webserver with a too low max_execution_time. -	* -	* @param	mixed	$old_state	The return value of the previous call -	*								of this method, or false on the first call -	* @return	mixed				Returns false after last step, otherwise -	*								temporary state which is passed as an -	*								argument to the next step -	*/ -	public function enable_step($old_state); - -	/** -	* Disables the extension. -	* -	* Calls to this function can be made in subsequent requests, when the -	* function is invoked through a webserver with a too low max_execution_time. -	* -	* @param	mixed	$old_state	The return value of the previous call -	*								of this method, or false on the first call -	* @return	mixed				Returns false after last step, otherwise -	*								temporary state which is passed as an -	*								argument to the next step -	*/ -	public function disable_step($old_state); - -	/** -	* purge_step is executed on purging an extension until it returns false. -	* -	* Calls to this function can be made in subsequent requests, when the -	* function is invoked through a webserver with a too low max_execution_time. -	* -	* @param	mixed	$old_state	The return value of the previous call -	*								of this method, or false on the first call -	* @return	mixed				Returns false after last step, otherwise -	*								temporary state which is passed as an -	*								argument to the next step -	*/ -	public function purge_step($old_state); -} diff --git a/phpBB/includes/extension/manager.php b/phpBB/includes/extension/manager.php deleted file mode 100644 index 4451049d04..0000000000 --- a/phpBB/includes/extension/manager.php +++ /dev/null @@ -1,513 +0,0 @@ -<?php -/** -* -* @package extension -* @copyright (c) 2011 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 -* -*/ - -/** -* @ignore -*/ -if (!defined('IN_PHPBB')) -{ -	exit; -} - -use Symfony\Component\DependencyInjection\ContainerInterface; - -/** -* The extension manager provides means to activate/deactivate extensions. -* -* @package extension -*/ -class phpbb_extension_manager -{ -	/** @var ContainerInterface */ -	protected $container; - -	protected $db; -	protected $config; -	protected $cache; -	protected $php_ext; -	protected $extensions; -	protected $extension_table; -	protected $phpbb_root_path; -	protected $cache_name; - -	/** -	* Creates a manager and loads information from database -	* -	* @param ContainerInterface $container A container -	* @param phpbb_db_driver $db A database connection -	* @param phpbb_config $config phpbb_config -	* @param phpbb_filesystem $filesystem -	* @param string $extension_table The name of the table holding extensions -	* @param string $phpbb_root_path Path to the phpbb includes directory. -	* @param string $php_ext php file extension -	* @param phpbb_cache_driver_interface $cache A cache instance or null -	* @param string $cache_name The name of the cache variable, defaults to _ext -	*/ -	public function __construct(ContainerInterface $container, phpbb_db_driver $db, phpbb_config $config, phpbb_filesystem $filesystem, $extension_table, $phpbb_root_path, $php_ext = 'php', phpbb_cache_driver_interface $cache = null, $cache_name = '_ext') -	{ -		$this->container = $container; -		$this->phpbb_root_path = $phpbb_root_path; -		$this->db = $db; -		$this->config = $config; -		$this->cache = $cache; -		$this->filesystem = $filesystem; -		$this->php_ext = $php_ext; -		$this->extension_table = $extension_table; -		$this->cache_name = $cache_name; - -		$this->extensions = ($this->cache) ? $this->cache->get($this->cache_name) : false; - -		if ($this->extensions === false) -		{ -			$this->load_extensions(); -		} -	} - -	/** -	* Loads all extension information from the database -	* -	* @return null -	*/ -	public function load_extensions() -	{ -		$this->extensions = array(); - -		// Do not try to load any extensions when installing or updating -		// Note: database updater invokes this code, and in 3.0 -		// there is no extension table therefore the rest of this function -		// fails -		if (defined('IN_INSTALL')) -		{ -			return; -		} - -		$sql = 'SELECT * -			FROM ' . $this->extension_table; - -		$result = $this->db->sql_query($sql); -		$extensions = $this->db->sql_fetchrowset($result); -		$this->db->sql_freeresult($result); - -		foreach ($extensions as $extension) -		{ -			$extension['ext_path'] = $this->get_extension_path($extension['ext_name']); -			$this->extensions[$extension['ext_name']] = $extension; -		} - -		ksort($this->extensions); - -		if ($this->cache) -		{ -			$this->cache->put($this->cache_name, $this->extensions); -		} -	} - -	/** -	* Generates the path to an extension -	* -	* @param string $name The name of the extension -	* @param bool $phpbb_relative Whether the path should be relative to phpbb root -	* @return string Path to an extension -	*/ -	public function get_extension_path($name, $phpbb_relative = false) -	{ -		$name = str_replace('.', '', $name); - -		return (($phpbb_relative) ? $this->phpbb_root_path : '') . 'ext/' . $name . '/'; -	} - -	/** -	* Instantiates the extension meta class for the extension with the given name -	* -	* @param string $name The extension name -	* @return phpbb_extension_interface Instance of the extension meta class or -	*                     phpbb_extension_base if the class does not exist -	*/ -	public function get_extension($name) -	{ -		$extension_class_name = 'phpbb_ext_' . str_replace('/', '_', $name) . '_ext'; - -		$migrator = $this->container->get('migrator'); - -		if (class_exists($extension_class_name)) -		{ -			return new $extension_class_name($this->container, $this->get_finder(), $migrator, $name, $this->get_extension_path($name, true)); -		} -		else -		{ -			return new phpbb_extension_base($this->container, $this->get_finder(), $migrator, $name, $this->get_extension_path($name, true)); -		} -	} - -	/** -	* Instantiates the metadata manager for the extension with the given name -	* -	* @param string $name The extension name -	* @param string $template The template manager -	* @return phpbb_extension_metadata_manager Instance of the metadata manager -	*/ -	public function create_extension_metadata_manager($name, phpbb_template $template) -	{ -		return new phpbb_extension_metadata_manager($name, $this->config, $this, $template, $this->phpbb_root_path); -	} - -	/** -	* Runs a step of the extension enabling process. -	* -	* Allows the exentension to enable in a long running script that works -	* in multiple steps across requests. State is kept for the extension -	* in the extensions table. -	* -	* @param	string	$name	The extension's name -	* @return	bool			False if enabling is finished, true otherwise -	*/ -	public function enable_step($name) -	{ -		// ignore extensions that are already enabled -		if (isset($this->extensions[$name]) && $this->extensions[$name]['ext_active']) -		{ -			return false; -		} - -		$old_state = (isset($this->extensions[$name]['ext_state'])) ? unserialize($this->extensions[$name]['ext_state']) : false; - -		$extension = $this->get_extension($name); -		$state = $extension->enable_step($old_state); - -		$active = ($state === false); - -		$extension_data = array( -			'ext_name'		=> $name, -			'ext_active'	=> $active, -			'ext_state'		=> serialize($state), -		); - -		$this->extensions[$name] = $extension_data; -		$this->extensions[$name]['ext_path'] = $this->get_extension_path($extension_data['ext_name']); -		ksort($this->extensions); - -		$sql = 'SELECT COUNT(ext_name) as row_count -			FROM ' . $this->extension_table . " -			WHERE ext_name = '" . $this->db->sql_escape($name) . "'"; -		$result = $this->db->sql_query($sql); -		$count = $this->db->sql_fetchfield('row_count'); -		$this->db->sql_freeresult($result); - -		if ($count) -		{ -			$sql = 'UPDATE ' . $this->extension_table . ' -				SET ' . $this->db->sql_build_array('UPDATE', $extension_data) . " -				WHERE ext_name = '" . $this->db->sql_escape($name) . "'"; -			$this->db->sql_query($sql); -		} -		else -		{ -			$sql = 'INSERT INTO ' . $this->extension_table . ' -				' . $this->db->sql_build_array('INSERT', $extension_data); -			$this->db->sql_query($sql); -		} - -		if ($this->cache) -		{ -			$this->cache->purge(); -		} - -		return !$active; -	} - -	/** -	* Enables an extension -	* -	* This method completely enables an extension. But it could be long running -	* so never call this in a script that has a max_execution time. -	* -	* @param string $name The extension's name -	* @return null -	*/ -	public function enable($name) -	{ -		while ($this->enable_step($name)); -	} - -	/** -	* Disables an extension -	* -	* Calls the disable method on the extension's meta class to allow it to -	* process the event. -	* -	* @param string $name The extension's name -	* @return bool False if disabling is finished, true otherwise -	*/ -	public function disable_step($name) -	{ -		// ignore extensions that are already disabled -		if (!isset($this->extensions[$name]) || !$this->extensions[$name]['ext_active']) -		{ -			return false; -		} - -		$old_state = unserialize($this->extensions[$name]['ext_state']); - -		$extension = $this->get_extension($name); -		$state = $extension->disable_step($old_state); - -		// continue until the state is false -		if ($state !== false) -		{ -			$extension_data = array( -				'ext_state'		=> serialize($state), -			); -			$this->extensions[$name]['ext_state'] = serialize($state); - -			$sql = 'UPDATE ' . $this->extension_table . ' -				SET ' . $this->db->sql_build_array('UPDATE', $extension_data) . " -				WHERE ext_name = '" . $this->db->sql_escape($name) . "'"; -			$this->db->sql_query($sql); - -			if ($this->cache) -			{ -				$this->cache->purge(); -			} - -			return true; -		} - -		$extension_data = array( -			'ext_active'	=> false, -			'ext_state'		=> serialize(false), -		); -		$this->extensions[$name]['ext_active'] = false; -		$this->extensions[$name]['ext_state'] = serialize(false); - -		$sql = 'UPDATE ' . $this->extension_table . ' -			SET ' . $this->db->sql_build_array('UPDATE', $extension_data) . " -			WHERE ext_name = '" . $this->db->sql_escape($name) . "'"; -		$this->db->sql_query($sql); - -		if ($this->cache) -		{ -			$this->cache->purge(); -		} - -		return false; -	} - -	/** -	* Disables an extension -	* -	* Disables an extension completely at once. This process could run for a -	* while so never call this in a script that has a max_execution time. -	* -	* @param string $name The extension's name -	* @return null -	*/ -	public function disable($name) -	{ -		while ($this->disable_step($name)); -	} - -	/** -	* Purge an extension -	* -	* Disables the extension first if active, and then calls purge on the -	* extension's meta class to delete the extension's database content. -	* -	* @param string $name The extension's name -	* @return bool False if purging is finished, true otherwise -	*/ -	public function purge_step($name) -	{ -		// ignore extensions that do not exist -		if (!isset($this->extensions[$name])) -		{ -			return false; -		} - -		// disable first if necessary -		if ($this->extensions[$name]['ext_active']) -		{ -			$this->disable($name); -		} - -		$old_state = unserialize($this->extensions[$name]['ext_state']); - -		$extension = $this->get_extension($name); -		$state = $extension->purge_step($old_state); - -		// continue until the state is false -		if ($state !== false) -		{ -			$extension_data = array( -				'ext_state'		=> serialize($state), -			); -			$this->extensions[$name]['ext_state'] = serialize($state); - -			$sql = 'UPDATE ' . $this->extension_table . ' -				SET ' . $this->db->sql_build_array('UPDATE', $extension_data) . " -				WHERE ext_name = '" . $this->db->sql_escape($name) . "'"; -			$this->db->sql_query($sql); - -			if ($this->cache) -			{ -				$this->cache->purge(); -			} - -			return true; -		} - -		unset($this->extensions[$name]); - -		$sql = 'DELETE FROM ' . $this->extension_table . " -			WHERE ext_name = '" . $this->db->sql_escape($name) . "'"; -		$this->db->sql_query($sql); - -		if ($this->cache) -		{ -			$this->cache->purge(); -		} - -		return false; -	} - -	/** -	* Purge an extension -	* -	* Purges an extension completely at once. This process could run for a while -	* so never call this in a script that has a max_execution time. -	* -	* @param string $name The extension's name -	* @return null -	*/ -	public function purge($name) -	{ -		while ($this->purge_step($name)); -	} - -	/** -	* Retrieves a list of all available extensions on the filesystem -	* -	* @return array An array with extension names as keys and paths to the -	*               extension as values -	*/ -	public function all_available() -	{ -		$available = array(); -		if (!is_dir($this->phpbb_root_path . 'ext/')) -		{ -			return $available; -		} - -		$iterator = new RecursiveIteratorIterator( -			new RecursiveDirectoryIterator($this->phpbb_root_path . 'ext/', FilesystemIterator::NEW_CURRENT_AND_KEY | FilesystemIterator::FOLLOW_SYMLINKS), -			RecursiveIteratorIterator::SELF_FIRST); -		foreach ($iterator as $file_info) -		{ -			if ($file_info->isFile() && $file_info->getFilename() == 'ext.' . $this->php_ext) -			{ -				$ext_name = $iterator->getInnerIterator()->getSubPath(); - -				$ext_name = str_replace(DIRECTORY_SEPARATOR, '/', $ext_name); - -				$available[$ext_name] = $this->phpbb_root_path . 'ext/' . $ext_name . '/'; -			} -		} -		ksort($available); -		return $available; -	} - -	/** -	* Retrieves all configured extensions. -	* -	* All enabled and disabled extensions are considered configured. A purged -	* extension that is no longer in the database is not configured. -	* -	* @return array An array with extension names as keys and and the -	*               database stored extension information as values -	*/ -	public function all_configured() -	{ -		$configured = array(); -		foreach ($this->extensions as $name => $data) -		{ -			$data['ext_path'] = $this->phpbb_root_path . $data['ext_path']; -			$configured[$name] = $data; -		} -		return $configured; -	} - -	/** -	* Retrieves all enabled extensions. -	* -	* @return array An array with extension names as keys and and the -	*               database stored extension information as values -	*/ -	public function all_enabled() -	{ -		$enabled = array(); -		foreach ($this->extensions as $name => $data) -		{ -			if ($data['ext_active']) -			{ -				$enabled[$name] = $this->phpbb_root_path . $data['ext_path']; -			} -		} -		return $enabled; -	} - -	/** -	* Retrieves all disabled extensions. -	* -	* @return array An array with extension names as keys and and the -	*               database stored extension information as values -	*/ -	public function all_disabled() -	{ -		$disabled = array(); -		foreach ($this->extensions as $name => $data) -		{ -			if (!$data['ext_active']) -			{ -				$disabled[$name] = $this->phpbb_root_path . $data['ext_path']; -			} -		} -		return $disabled; -	} - -	/** -	* Check to see if a given extension is available on the filesystem -	* -	* @param string $name Extension name to check NOTE: Can be user input -	* @return bool Depending on whether or not the extension is available -	*/ -	public function available($name) -	{ -		return file_exists($this->get_extension_path($name, true)); -	} - -	/** -	* Check to see if a given extension is enabled -	* -	* @param string $name Extension name to check -	* @return bool Depending on whether or not the extension is enabled -	*/ -	public function enabled($name) -	{ -		return isset($this->extensions[$name]) && $this->extensions[$name]['ext_active']; -	} - -	/** -	* Instantiates a phpbb_extension_finder. -	* -	* @return phpbb_extension_finder An extension finder instance -	*/ -	public function get_finder() -	{ -		return new phpbb_extension_finder($this, $this->filesystem, $this->phpbb_root_path, $this->cache, $this->php_ext, $this->cache_name . '_finder'); -	} -} diff --git a/phpBB/includes/extension/metadata_manager.php b/phpBB/includes/extension/metadata_manager.php deleted file mode 100644 index 14b77c085b..0000000000 --- a/phpBB/includes/extension/metadata_manager.php +++ /dev/null @@ -1,371 +0,0 @@ -<?php -/** -* -* @package extension -* @copyright (c) 2012 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 -* -*/ - -/** -* @ignore -*/ -if (!defined('IN_PHPBB')) -{ -	exit; -} - -/** -* The extension metadata manager validates and gets meta-data for extensions -* -* @package extension -*/ -class phpbb_extension_metadata_manager -{ -	/** -	* phpBB Config instance -	* @var phpbb_config -	*/ -	protected $config; - -	/** -	* phpBB Extension Manager -	* @var phpbb_extension_manager -	*/ -	protected $extension_manager; - -	/** -	* phpBB Template instance -	* @var phpbb_template -	*/ -	protected $template; - -	/** -	* phpBB root path -	* @var string -	*/ -	protected $phpbb_root_path; - -	/** -	* Name (including vendor) of the extension -	* @var string -	*/ -	protected $ext_name; - -	/** -	* Metadata from the composer.json file -	* @var array -	*/ -	protected $metadata; - -	/** -	* Link (including root path) to the metadata file -	* @var string -	*/ -	protected $metadata_file; - -	/** -	* Creates the metadata manager -	* -	* @param string				$ext_name			Name (including vendor) of the extension -	* @param phpbb_config		$config				phpBB Config instance -	* @param phpbb_extension_manager	$extension_manager An instance of the phpBBb extension manager -	* @param phpbb_template		$template			phpBB Template instance -	* @param string				$phpbb_root_path	Path to the phpbb includes directory. -	*/ -	public function __construct($ext_name, phpbb_config $config, phpbb_extension_manager $extension_manager, phpbb_template $template, $phpbb_root_path) -	{ -		$this->config = $config; -		$this->extension_manager = $extension_manager; -		$this->template = $template; -		$this->phpbb_root_path = $phpbb_root_path; - -		$this->ext_name = $ext_name; -		$this->metadata = array(); -		$this->metadata_file = ''; -	} - -	/** -	 * Processes and gets the metadata requested -	 * -	 * @param  string $element			All for all metadata that it has and is valid, otherwise specify which section you want by its shorthand term. -	 * @return array					Contains all of the requested metadata, throws an exception on failure -	 */ -	public function get_metadata($element = 'all') -	{ -		$this->set_metadata_file(); - -		// Fetch the metadata -		$this->fetch_metadata(); - -		// Clean the metadata -		$this->clean_metadata_array(); - -		switch ($element) -		{ -			case 'all': -			default: -				// Validate the metadata -				if (!$this->validate()) -				{ -					return false; -				} - -				return $this->metadata; -			break; - -			case 'name': -				return ($this->validate('name')) ? $this->metadata['name'] : false; -			break; - -			case 'display-name': -				if (isset($this->metadata['extra']['display-name'])) -				{ -					return $this->metadata['extra']['display-name']; -				} -				else -				{ -					return ($this->validate('name')) ? $this->metadata['name'] : false; -				} -			break; -		} -	} - -	/** -	 * Sets the filepath of the metadata file -	 * -	 * @return boolean  Set to true if it exists, throws an exception on failure -	 */ -	private function set_metadata_file() -	{ -		$ext_filepath = $this->extension_manager->get_extension_path($this->ext_name); -		$metadata_filepath = $this->phpbb_root_path . $ext_filepath . 'composer.json'; - -		$this->metadata_file = $metadata_filepath; - -		if (!file_exists($this->metadata_file)) -		{ -    		throw new phpbb_extension_exception('The required file does not exist: ' . $this->metadata_file); -		} -	} - -	/** -	 * Gets the contents of the composer.json file -	 * -	 * @return bool True if success, throws an exception on failure -	 */ -	private function fetch_metadata() -	{ -		if (!file_exists($this->metadata_file)) -		{ -			throw new phpbb_extension_exception('The required file does not exist: ' . $this->metadata_file); -		} -		else -		{ -			if (!($file_contents = file_get_contents($this->metadata_file))) -			{ -    			throw new phpbb_extension_exception('file_get_contents failed on ' . $this->metadata_file); -			} - -			if (($metadata = json_decode($file_contents, true)) === NULL) -			{ -    			throw new phpbb_extension_exception('json_decode failed on ' . $this->metadata_file); -			} - -			$this->metadata = $metadata; - -			return true; -		} -	} - -	/** -	 * This array handles the cleaning of the array -	 * -	 * @return array Contains the cleaned metadata array -	 */ -	private function clean_metadata_array() -	{ -		return $this->metadata; -	} - -	/** -	* Validate fields -	* -	* @param string $name  ("all" for display and enable validation -	* 						"display" for name, type, and authors -	* 						"name", "type") -	* @return Bool True if valid, throws an exception if invalid -	*/ -	public function validate($name = 'display') -    { -    	// Basic fields -    	$fields = array( -    		'name'		=> '#^[a-zA-Z0-9_\x7f-\xff]{2,}/[a-zA-Z0-9_\x7f-\xff]{2,}$#', -    		'type'		=> '#^phpbb3-extension$#', -    		'licence'	=> '#.+#', -    		'version'	=> '#.+#', -    	); - -    	switch ($name) -    	{ -    		case 'all': -    			$this->validate('display'); - -				$this->validate_enable(); -    		break; - -    		case 'display': -    			foreach ($fields as $field => $data) -				{ -					$this->validate($field); -				} - -				$this->validate_authors(); -    		break; - -    		default: -    			if (isset($fields[$name])) -    			{ -    				if (!isset($this->metadata[$name])) -    				{ -    					throw new phpbb_extension_exception("Required meta field '$name' has not been set."); -					} - -					if (!preg_match($fields[$name], $this->metadata[$name])) -					{ -    					throw new phpbb_extension_exception("Meta field '$name' is invalid."); -					} -				} -			break; -		} - -		return true; -    } - -	/** -	 * Validates the contents of the authors field -	 * -	 * @return boolean True when passes validation, throws exception if invalid -	 */ -	public function validate_authors() -	{ -		if (empty($this->metadata['authors'])) -		{ -    		throw new phpbb_extension_exception("Required meta field 'authors' has not been set."); -		} - -		foreach ($this->metadata['authors'] as $author) -		{ -			if (!isset($author['name'])) -			{ -    			throw new phpbb_extension_exception("Required meta field 'author name' has not been set."); -			} -		} - -		return true; -	} - -	/** -	 * This array handles the verification that this extension can be enabled on this board -	 * -	 * @return bool True if validation succeeded, False if failed -	 */ -	public function validate_enable() -	{ -		// Check for phpBB, PHP versions -		if (!$this->validate_require_phpbb() || !$this->validate_require_php()) -		{ -			return false; -		} - -		return true; -	} - - -	/** -	 * Validates the contents of the phpbb requirement field -	 * -	 * @return boolean True when passes validation -	 */ -	public function validate_require_phpbb() -	{ -		if (!isset($this->metadata['require']['phpbb'])) -		{ -			return true; -		} - -		return $this->_validate_version($this->metadata['require']['phpbb'], $this->config['version']); -	} - -	/** -	 * Validates the contents of the php requirement field -	 * -	 * @return boolean True when passes validation -	 */ -	public function validate_require_php() -	{ -		if (!isset($this->metadata['require']['php'])) -		{ -			return true; -		} - -		return $this->_validate_version($this->metadata['require']['php'], phpversion()); -	} - -	/** -	* Version validation helper -	* -	* @param string $string The string for comparing to a version -	* @param string $current_version The version to compare to -	* @return bool True/False if meets version requirements -	*/ -	private function _validate_version($string, $current_version) -	{ -		// Allow them to specify their own comparison operator (ex: <3.1.2, >=3.1.0) -		$comparison_matches = false; -		preg_match('#[=<>]+#', $string, $comparison_matches); - -		if (!empty($comparison_matches)) -		{ -			return version_compare($current_version, str_replace(array($comparison_matches[0], ' '), '', $string), $comparison_matches[0]); -		} - -		return version_compare($current_version, $string, '>='); -	} - -	/** -	 * Outputs the metadata into the template -	 * -	 * @return null -	 */ -	public function output_template_data() -	{ -		$this->template->assign_vars(array( -			'META_NAME'			=> htmlspecialchars($this->metadata['name']), -			'META_TYPE'			=> htmlspecialchars($this->metadata['type']), -			'META_DESCRIPTION'	=> (isset($this->metadata['description'])) ? htmlspecialchars($this->metadata['description']) : '', -			'META_HOMEPAGE'		=> (isset($this->metadata['homepage'])) ? $this->metadata['homepage'] : '', -			'META_VERSION'		=> (isset($this->metadata['version'])) ? htmlspecialchars($this->metadata['version']) : '', -			'META_TIME'			=> (isset($this->metadata['time'])) ? htmlspecialchars($this->metadata['time']) : '', -			'META_LICENCE'		=> htmlspecialchars($this->metadata['licence']), - -			'META_REQUIRE_PHP'		=> (isset($this->metadata['require']['php'])) ? htmlspecialchars($this->metadata['require']['php']) : '', -			'META_REQUIRE_PHP_FAIL'	=> !$this->validate_require_php(), - -			'META_REQUIRE_PHPBB'		=> (isset($this->metadata['require']['phpbb'])) ? htmlspecialchars($this->metadata['require']['phpbb']) : '', -			'META_REQUIRE_PHPBB_FAIL'	=> !$this->validate_require_phpbb(), - -			'META_DISPLAY_NAME'	=> (isset($this->metadata['extra']['display-name'])) ? htmlspecialchars($this->metadata['extra']['display-name']) : '', -		)); - -		foreach ($this->metadata['authors'] as $author) -		{ -			$this->template->assign_block_vars('meta_authors', array( -				'AUTHOR_NAME'		=> htmlspecialchars($author['name']), -				'AUTHOR_EMAIL'		=> (isset($author['email'])) ? $author['email'] : '', -				'AUTHOR_HOMEPAGE'	=> (isset($author['homepage'])) ? $author['homepage'] : '', -				'AUTHOR_ROLE'		=> (isset($author['role'])) ? htmlspecialchars($author['role']) : '', -			)); -		} -	} -} diff --git a/phpBB/includes/extension/provider.php b/phpBB/includes/extension/provider.php deleted file mode 100644 index 45b55e5cab..0000000000 --- a/phpBB/includes/extension/provider.php +++ /dev/null @@ -1,76 +0,0 @@ -<?php -/** -* -* @package extension -* @copyright (c) 2011 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 -* -*/ - -/** -* @ignore -*/ -if (!defined('IN_PHPBB')) -{ -	exit; -} - -/** -* Provides a set of items found in extensions. -* -* This abstract class is essentially a wrapper around item-specific -* finding logic. It handles storing the extension manager via constructor -* for the finding logic to use to find the items, and provides an -* iterator interface over the items found by the finding logic. -* -* Items could be anything, for example template paths or cron task names. -* Derived classes completely define what the items are. -* -* @package extension -*/ -abstract class phpbb_extension_provider implements IteratorAggregate -{ -	/** -	* Array holding all found items -	* @var array|null -	*/ -	protected $items = null; - -	/** -	* An extension manager to search for items in extensions -	* @var phpbb_extension_manager -	*/ -	protected $extension_manager; - -	/** -	* Constructor. Loads all available items. -	* -	* @param phpbb_extension_manager $extension_manager phpBB extension manager -	*/ -	public function __construct(phpbb_extension_manager $extension_manager) -	{ -		$this->extension_manager = $extension_manager; -	} - -	/** -	* Finds items using the extension manager. -	* -	* @return array     List of task names -	*/ -	abstract protected function find(); - -	/** -	* Retrieve an iterator over all items -	* -	* @return ArrayIterator An iterator for the array of template paths -	*/ -	public function getIterator() -	{ -		if ($this->items === null) -		{ -			$this->items = $this->find(); -		} - -		return new ArrayIterator($this->items); -	} -} | 
