getContainer(); /************************ * LOAD & UPDATE PLUGINS * ************************/ $plugins = new Typemill\Plugins(); $pluginNames = $plugins->load(); $pluginSettings = $routes = $middleware = array(); foreach($pluginNames as $pluginName) { $className = $pluginName['className']; $name = $pluginName['name']; # check if plugin is in the settings already if(isset($settings['settings']['plugins'][$name])) { # if so, add the settings to temporary plugin settings $pluginSettings[$name] = $settings['settings']['plugins'][$name]; # and delete them from original settings unset($settings['settings']['plugins'][$name]); } else { # if not, it is a new plugin. Add it and set active to false $pluginSettings[$name] = ['active' => false]; # and set flag to refresh the settings $refreshSettings = true; } # if the plugin is activated, add routes/middleware and add plugin as event subscriber if($pluginSettings[$name]['active']) { $routes = $plugins->getNewRoutes($className, $routes); $middleware = $plugins->getNewMiddleware($className, $middleware); $dispatcher->addSubscriber(new $className($container)); } } # if plugins in original settings are not empty now, then a plugin has been removed if(!empty($settings['settings']['plugins'])){ $refreshSettings = true; } # update the settings in all cases $settings['settings']['plugins'] = $pluginSettings; # if plugins have been added or removed if(isset($refreshSettings)) { # update the settings in the container $container->get('settings')->replace($settings['settings']); # update stored settings file $refreshSettings = Typemill\settings::updateSettings($settings['settings']); } # dispatch the event onPluginsLoaded $dispatcher->dispatch('onPluginsLoaded', new OnPluginsLoaded($pluginNames)); # dispatch settings event and get all setting-updates from plugins $dispatcher->dispatch('onSettingsLoaded', new OnSettingsLoaded($settings))->getData(); /********************************** * LOAD ROLES AND PERMISSIONS * **********************************/ # load roles and permissions $rolesAndPermissions = Typemill\Settings::loadRolesAndPermissions(); # dispatch roles so plugins can enhance them $rolesAndPermissions = $dispatcher->dispatch('onRolesPermissionsLoaded', new OnRolesPermissionsLoaded($rolesAndPermissions))->getData(); # load resources $resources = Typemill\Settings::loadResources(); # dispatch roles so plugins can enhance them $resources = $dispatcher->dispatch('onResourcesLoaded', new OnResourcesLoaded($resources))->getData(); # create acl-object $acl = Typemill\Settings::createAcl($rolesAndPermissions, $resources); # add acl to container $container['acl'] = function($c) use ($acl) { return $acl; }; /****************************** * ADD DISPATCHER TO CONTAINER * ******************************/ $container['dispatcher'] = function($container) use ($dispatcher) { return $dispatcher; }; /******************************** * ADD ASSET-FUNCTION FOR TWIG * ********************************/ $container['assets'] = function($c) { return new \Typemill\Assets($c['request']->getUri()->getBaseUrl()); }; /************************ * DECIDE FOR SESSION * ************************/ $session_segments = array('setup', 'tm/', 'api/', '/setup', '/tm/', '/api/'); # let plugins add own segments for session, eg. to enable csrf for forms $client_segments = $dispatcher->dispatch('onSessionSegmentsLoaded', new OnSessionSegmentsLoaded([]))->getData(); $session_segments = array_merge($session_segments, $client_segments); $path = $container['request']->getUri()->getPath(); $container['flash'] = false; $container['csrf'] = false; foreach($session_segments as $segment) { if(substr( $path, 0, strlen($segment) ) === $segment) { // configure session ini_set('session.cookie_httponly', 1 ); ini_set('session.use_strict_mode', 1); if($container['request']->getUri()->getScheme() == 'https') { ini_set('session.cookie_secure', 1); session_name('__Secure-typemill-session'); } else { session_name('typemill-session'); } // add csrf-protection $container['csrf'] = function ($c) { $guard = new \Slim\Csrf\Guard(); $guard->setPersistentTokenMode(true); return $guard; }; // add flash to container $container['flash'] = function () { return new \Slim\Flash\Messages(); }; // start session session_start(); } } /************************ * LOAD TWIG VIEW * ************************/ $container['view'] = function ($container) { $path = array($container->get('settings')['themePath'], $container->get('settings')['authorPath']); $view = new \Slim\Views\Twig( $path, [ 'cache' => false, 'autoescape' => false, 'debug' => true ]); // Instantiate and add Slim specific extension $basePath = rtrim(str_ireplace('index.php', '', $container['request']->getUri()->getBasePath()), '/'); $view->addExtension(new Slim\Views\TwigExtension($container['router'], $basePath)); $view->addExtension(new Twig_Extension_Debug()); $view->addExtension(new Typemill\Extensions\TwigUserExtension()); $view->addExtension(new Typemill\Extensions\TwigMarkdownExtension()); $view->addExtension(new Typemill\Extensions\TwigMetaExtension()); $view->addExtension(new Typemill\Extensions\TwigPagelistExtension()); /* use {{ base_url() }} in twig templates */ $view['base_url'] = $container['request']->getUri()->getBaseUrl(); $view['current_url'] = $container['request']->getUri()->getPath(); /* if session route, add flash messages and csrf-protection */ if($container['flash']) { $view->getEnvironment()->addGlobal('flash', $container->flash); $view->addExtension(new Typemill\Extensions\TwigCsrfExtension($container['csrf'])); } /* add asset-function to all views */ $view->getEnvironment()->addGlobal('assets', $container->assets); /****************************** * LOAD TRANSLATIONS * ******************************/ $uri = $_SERVER['REQUEST_URI']; $base_path = $container['request']->getUri()->getBasePath(); $uri = str_replace($base_path,'',$uri); $pieces = explode('/',$uri); if(isset($uri) && ($pieces[1] === 'tm' OR $pieces[1] === 'setup') ) { // Admin environment labels $labels = Typemill\Translations::loadTranslations('admin'); } else { // User environment labels // For now it is useless, but it will prove useful in the future $labels = Typemill\Translations::loadTranslations('user'); } $view['translations'] = $labels; $view->addExtension(new Typemill\Extensions\TwigLanguageExtension( $labels )); return $view; }; $container->dispatcher->dispatch('onTwigLoaded'); /*************************** * ADD NOT FOUND HANDLER * ***************************/ $container['notFoundHandler'] = function($c) { return new \Typemill\Handlers\NotFoundHandler($c['view']); }; /************************ * ADD MIDDLEWARE * ************************/ foreach($middleware as $pluginMiddleware) { $middlewareClass = $pluginMiddleware['classname']; $middlewareParams = $pluginMiddleware['params']; if(class_exists($middlewareClass)) { $app->add(new $middlewareClass($middlewareParams)); } } if($container['flash']) { $app->add(new \Typemill\Middleware\ValidationErrorsMiddleware($container['view'])); $app->add(new \Typemill\Middleware\OldInputMiddleware($container['view'])); $app->add($container->get('csrf')); } /************************ * ADD ROUTES * ************************/ require __DIR__ . '/Routes/Api.php'; require __DIR__ . '/Routes/Web.php';