From 1408e1f931f1db7174f0cad37fd83a8341013b72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaime=20Pe=CC=81rez=20Crespo?= <jaime.perez@uninett.no> Date: Wed, 22 Nov 2017 13:43:51 +0100 Subject: [PATCH] Move the PSR* autoload functions outside of SimpleSAML\Module. Doing so allows us to mock the class. Otherwise, the _autoload_module.php is always called first, and when it tries to register the functions from that class, it automatically autoloads it, making it impossible to mock it afterwards. --- lib/SimpleSAML/Module.php | 83 ------------------------------------- lib/_autoload_modules.php | 87 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 85 insertions(+), 85 deletions(-) diff --git a/lib/SimpleSAML/Module.php b/lib/SimpleSAML/Module.php index 0492b0aae..6c9b3c6e0 100644 --- a/lib/SimpleSAML/Module.php +++ b/lib/SimpleSAML/Module.php @@ -27,89 +27,6 @@ class Module public static $module_info = array(); - /** - * Autoload function for SimpleSAMLphp modules following PSR-0. - * - * @param string $className Name of the class. - * - * @deprecated This method will be removed in SSP 2.0. - * - * TODO: this autoloader should be removed once everything has been migrated to namespaces. - */ - public static function autoloadPSR0($className) - { - $modulePrefixLength = strlen('sspmod_'); - $classPrefix = substr($className, 0, $modulePrefixLength); - if ($classPrefix !== 'sspmod_') { - return; - } - - $modNameEnd = strpos($className, '_', $modulePrefixLength); - $module = substr($className, $modulePrefixLength, $modNameEnd - $modulePrefixLength); - $path = explode('_', substr($className, $modNameEnd + 1)); - - if (!self::isModuleEnabled($module)) { - return; - } - - $file = self::getModuleDir($module).'/lib/'.join('/', $path).'.php'; - if (!file_exists($file)) { - return; - } - require_once($file); - - if (!class_exists($className, false) && !interface_exists($className, false)) { - // the file exists, but the class is not defined. Is it using namespaces? - $nspath = join('\\', $path); - if (class_exists('SimpleSAML\Module\\'.$module.'\\'.$nspath) || - interface_exists('SimpleSAML\Module\\'.$module.'\\'.$nspath) - ) { - // the class has been migrated, create an alias and warn about it - \SimpleSAML\Logger::warning( - "The class or interface '$className' is now using namespaces, please use 'SimpleSAML\\Module\\". - $module."\\".$nspath."' instead." - ); - class_alias("SimpleSAML\\Module\\$module\\$nspath", $className); - } - } - } - - - /** - * Autoload function for SimpleSAMLphp modules following PSR-4. - * - * @param string $className Name of the class. - */ - public static function autoloadPSR4($className) - { - $elements = explode('\\', $className); - if ($elements[0] === '') { // class name starting with /, ignore - array_shift($elements); - } - if (count($elements) < 4) { - return; // it can't be a module - } - if (array_shift($elements) !== 'SimpleSAML') { - return; // the first element is not "SimpleSAML" - } - if (array_shift($elements) !== 'Module') { - return; // the second element is not "module" - } - - // this is a SimpleSAMLphp module following PSR-4 - $module = array_shift($elements); - if (!self::isModuleEnabled($module)) { - return; // module not enabled, avoid giving out any information at all - } - - $file = self::getModuleDir($module).'/lib/'.implode('/', $elements).'.php'; - - if (file_exists($file)) { - require_once($file); - } - } - - /** * Retrieve the base directory for a module. * diff --git a/lib/_autoload_modules.php b/lib/_autoload_modules.php index 1cbe07459..9a2c753f7 100644 --- a/lib/_autoload_modules.php +++ b/lib/_autoload_modules.php @@ -69,6 +69,89 @@ function temporaryLoader($class) } } + +/** + * Autoload function for SimpleSAMLphp modules following PSR-0. + * + * @param string $className Name of the class. + * + * @deprecated This method will be removed in SSP 2.0. + * + * TODO: this autoloader should be removed once everything has been migrated to namespaces. + */ +function sspmodAutoloadPSR0($className) +{ + $modulePrefixLength = strlen('sspmod_'); + $classPrefix = substr($className, 0, $modulePrefixLength); + if ($classPrefix !== 'sspmod_') { + return; + } + + $modNameEnd = strpos($className, '_', $modulePrefixLength); + $module = substr($className, $modulePrefixLength, $modNameEnd - $modulePrefixLength); + $path = explode('_', substr($className, $modNameEnd + 1)); + + if (!\SimpleSAML\Module::isModuleEnabled($module)) { + return; + } + + $file = \SimpleSAML\Module::getModuleDir($module).'/lib/'.join('/', $path).'.php'; + if (!file_exists($file)) { + return; + } + require_once($file); + + if (!class_exists($className, false) && !interface_exists($className, false)) { + // the file exists, but the class is not defined. Is it using namespaces? + $nspath = join('\\', $path); + if (class_exists('SimpleSAML\Module\\'.$module.'\\'.$nspath) || + interface_exists('SimpleSAML\Module\\'.$module.'\\'.$nspath) + ) { + // the class has been migrated, create an alias and warn about it + \SimpleSAML\Logger::warning( + "The class or interface '$className' is now using namespaces, please use 'SimpleSAML\\Module\\". + $module."\\".$nspath."' instead." + ); + class_alias("SimpleSAML\\Module\\$module\\$nspath", $className); + } + } +} + + +/** + * Autoload function for SimpleSAMLphp modules following PSR-4. + * + * @param string $className Name of the class. + */ +function sspmodAutoloadPSR4($className) +{ + $elements = explode('\\', $className); + if ($elements[0] === '') { // class name starting with /, ignore + array_shift($elements); + } + if (count($elements) < 4) { + return; // it can't be a module + } + if (array_shift($elements) !== 'SimpleSAML') { + return; // the first element is not "SimpleSAML" + } + if (array_shift($elements) !== 'Module') { + return; // the second element is not "module" + } + + // this is a SimpleSAMLphp module following PSR-4 + $module = array_shift($elements); + if (!\SimpleSAML\Module::isModuleEnabled($module)) { + return; // module not enabled, avoid giving out any information at all + } + + $file = \SimpleSAML\Module::getModuleDir($module).'/lib/'.implode('/', $elements).'.php'; + + if (file_exists($file)) { + require_once($file); + } +} + spl_autoload_register("temporaryLoader"); -spl_autoload_register(array('SimpleSAML\Module', 'autoloadPSR0')); -spl_autoload_register(array('SimpleSAML\Module', 'autoloadPSR4')); +spl_autoload_register('sspmodAutoloadPSR0'); +spl_autoload_register('sspmodAutoloadPSR4'); -- GitLab