Skip to content
Snippets Groups Projects
Kernel.php 4.74 KiB
Newer Older
Tim van Dijen's avatar
Tim van Dijen committed
<?php

declare(strict_types=1);

namespace SimpleSAML;

use SimpleSAML\Utils\System;
Tim van Dijen's avatar
Tim van Dijen committed
use Symfony\Bundle\FrameworkBundle\FrameworkBundle;
use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
use Symfony\Component\Config\Exception\FileLocatorFileNotFoundException;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Config\Loader\LoaderInterface;
Tim van Dijen's avatar
Tim van Dijen committed
use Symfony\Component\DependencyInjection\{ContainerBuilder, Definition};
Tim van Dijen's avatar
Tim van Dijen committed
use Symfony\Component\DependencyInjection\Loader\DirectoryLoader;
use Symfony\Component\HttpKernel\Kernel as BaseKernel;
Sascha Grossenbacher's avatar
Sascha Grossenbacher committed
use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
use function getenv;
use function is_dir;
use function sys_get_temp_dir;

Tim van Dijen's avatar
Tim van Dijen committed
/**
 * A class to create the container and handle a given request.
 */
class Kernel extends BaseKernel
{
    use MicroKernelTrait;

    public const CONFIG_EXTS = '.{php,xml,yaml,yml}';
Tim van Dijen's avatar
Tim van Dijen committed
    /** @var string */
    private string $module;
Tim van Dijen's avatar
Tim van Dijen committed


    /**
     * @param string $module
     */
Tim van Dijen's avatar
Tim van Dijen committed
    public function __construct(string $module)
Tim van Dijen's avatar
Tim van Dijen committed
    {
        $this->module = $module;

        $env = getenv('APP_ENV') ?: (getenv('SYMFONY_ENV') ?: 'prod');

        parent::__construct($env, false);
    }


    /**
     * @return string
     */
Tim van Dijen's avatar
Tim van Dijen committed
    public function getCacheDir(): string
Tim van Dijen's avatar
Tim van Dijen committed
    {
        $configuration = Configuration::getInstance();
Tim van Dijen's avatar
Tim van Dijen committed
        $cachePath = $configuration->getString('tempdir') . DIRECTORY_SEPARATOR
            . 'cache' . DIRECTORY_SEPARATOR . $this->module;
        $sysUtils = new System();
        if ($sysUtils->isAbsolutePath($cachePath)) {
Tim van Dijen's avatar
Tim van Dijen committed
            return $cachePath;
        }

        return $configuration->getBaseDir() . DIRECTORY_SEPARATOR . $cachePath;
Tim van Dijen's avatar
Tim van Dijen committed
    }


    /**
     * @return string
     */
Tim van Dijen's avatar
Tim van Dijen committed
    public function getLogDir(): string
Tim van Dijen's avatar
Tim van Dijen committed
    {
        $configuration = Configuration::getInstance();
        $handler = $configuration->getString('logging.handler');
        $loggingPath = $configuration->getOptionalString('loggingdir', sys_get_temp_dir());
        $sysUtils = new System();
        if ($sysUtils->isAbsolutePath($loggingPath)) {
Tim van Dijen's avatar
Tim van Dijen committed
            return $loggingPath;
        }

        return $configuration->getBaseDir() . DIRECTORY_SEPARATOR . $loggingPath;
Tim van Dijen's avatar
Tim van Dijen committed
     * {@inheritdoc}
Tim van Dijen's avatar
Tim van Dijen committed
    public function registerBundles(): array
Tim van Dijen's avatar
Tim van Dijen committed
    {
        return [
            new FrameworkBundle(),
        ];
    }


    /**
     * Get the module loaded in this kernel.
     *
     * @return string
     */
Tim van Dijen's avatar
Tim van Dijen committed
    public function getModule(): string
Tim van Dijen's avatar
Tim van Dijen committed
    {
        return $this->module;
    }


    /**
     * Configures the container.
     *
     * @param ContainerBuilder $container
     * @param LoaderInterface $loader
     */
Tim van Dijen's avatar
Tim van Dijen committed
    protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader): void
Tim van Dijen's avatar
Tim van Dijen committed
    {
        $configuration = Configuration::getInstance();
        $baseDir = $configuration->getBaseDir();
        $loader->load($baseDir . '/routing/services/*' . self::CONFIG_EXTS, 'glob');
        $confDir = Module::getModuleDir($this->module) . '/routing/services';
        if (is_dir($confDir)) {
            $loader->load($confDir . '/**/*' . self::CONFIG_EXTS, 'glob');
        }

        $container->loadFromExtension('framework', [
            'secret' => Configuration::getInstance()->getString('secretsalt'),
        ]);

        $this->registerModuleControllers($container);
    }


    /**
     * Import routes.
     *
Sascha Grossenbacher's avatar
Sascha Grossenbacher committed
     * @param RoutingConfigurator  $routes
Sascha Grossenbacher's avatar
Sascha Grossenbacher committed
    protected function configureRoutes(RoutingConfigurator $routes): void
Tim van Dijen's avatar
Tim van Dijen committed
    {
        $configuration = Configuration::getInstance();
        $baseDir = $configuration->getBaseDir();
Sascha Grossenbacher's avatar
Sascha Grossenbacher committed
        $routes->import($baseDir . '/routing/routes/*' . self::CONFIG_EXTS);
Tim van Dijen's avatar
Tim van Dijen committed
        $confDir = Module::getModuleDir($this->module) . '/routing/routes';
        if (is_dir($confDir)) {
Sascha Grossenbacher's avatar
Sascha Grossenbacher committed
            $routes->import($confDir . '/**/*' . self::CONFIG_EXTS)->prefix($this->module);
Tim van Dijen's avatar
Tim van Dijen committed
        }
    }


    /**
     * @param ContainerBuilder $container
     */
Tim van Dijen's avatar
Tim van Dijen committed
    private function registerModuleControllers(ContainerBuilder $container): void
Tim van Dijen's avatar
Tim van Dijen committed
    {
        try {
            $definition = new Definition();
            $definition->setAutowired(true);
            $definition->setPublic(true);

Tim van Dijen's avatar
Tim van Dijen committed
            $controllerDir = Module::getModuleDir($this->module) . '/src/Controller';
Tim van Dijen's avatar
Tim van Dijen committed

            if (!is_dir($controllerDir)) {
                return;
            }

            $loader = new DirectoryLoader(
                $container,
                new FileLocator($controllerDir . '/')
            );
            $loader->registerClasses(
                $definition,
                'SimpleSAML\\Module\\' . $this->module . '\\Controller\\',
                $controllerDir . '/*'
            );
        } catch (FileLocatorFileNotFoundException $e) {
            // fall through