diff --git a/lib/SimpleSAML/Module.php b/lib/SimpleSAML/Module.php index be9cdbbdbbb433c5b3099fa17eab1581207c86ef..22b7f2ea87d7377d854c00b18c0df4835f7f4d21 100644 --- a/lib/SimpleSAML/Module.php +++ b/lib/SimpleSAML/Module.php @@ -4,12 +4,91 @@ /** * Helper class for accessing information about modules. * - * @author Olav Morken, UNINETT AS. + * @author Olav Morken <olav.morken@uninett.no>, UNINETT AS. + * @author Boy Baukema, SURFnet. + * @author Jaime Perez <jaime.perez@uninett.no>, UNINETT AS. * @package SimpleSAMLphp */ class SimpleSAML_Module { + /** + * Autoload function for SimpleSAMLphp modules following PSR-0. + * + * @param string $className Name of the class. + * + * 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)) { + require_once($file); + } + + if (!class_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)) { + // the class has been migrated, create an alias and warn about it + SimpleSAML_Logger::warning( + "The class '$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. @@ -32,7 +111,7 @@ class SimpleSAML_Module /** * Determine whether a module is enabled. * - * Will return false if the given module doesn't exists. + * Will return false if the given module doesn't exist. * * @param string $module Name of the module * diff --git a/lib/_autoload_modules.php b/lib/_autoload_modules.php index 77bfd81d8e8f20be592ab5726965bfcac6e2a6aa..62aa262e4c9ca797271871a63ab57c2991ebc5b3 100644 --- a/lib/_autoload_modules.php +++ b/lib/_autoload_modules.php @@ -1,89 +1,12 @@ <?php /** - * This file implements a autoloader for SimpleSAMLphp modules. + * This file registers an autoloader for SimpleSAMLphp modules. * * @author Boy Baukema, SURFnet * @author Jaime Perez <jaime.perez@uninett.no>, UNINETT * @package SimpleSAMLphp */ -/** - * Autoload function for SimpleSAMLphp modules following PSR-0. - * - * @param string $className Name of the class. - * - * TODO: this autoloader should be removed once everything has been migrated to namespaces. - */ -function SimpleSAML_autoload_psr0($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)) { - require_once($file); - } - - if (!class_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)) { - // the class has been migrated, create an alias and warn about it - SimpleSAML_Logger::warning( - "The class '$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 SimpleSAML_autoload_psr4($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('SimpleSAML_autoload_psr0'); -spl_autoload_register('SimpleSAML_autoload_psr4'); +spl_autoload_register(array('SimpleSAML_Module', 'autoloadPSR0')); +spl_autoload_register(array('SimpleSAML_Module', 'autoloadPSR4'));