1
0
mirror of https://github.com/typemill/typemill.git synced 2025-02-19 22:44:51 +01:00
php-typemill/system/system.php

329 lines
9.9 KiB
PHP
Raw Normal View History

2019-10-20 12:09:45 +02:00
<?php
use Typemill\Events\OnSettingsLoaded;
use Typemill\Events\OnPluginsLoaded;
use Typemill\Events\OnSessionSegmentsLoaded;
2020-07-04 08:06:18 +02:00
use Typemill\Events\OnRolesPermissionsLoaded;
use Typemill\Events\OnResourcesLoaded;
2019-10-20 12:09:45 +02:00
/****************************
* HIDE ERRORS BY DEFAULT *
****************************/
ini_set('display_errors', 0);
ini_set('display_startup_errors', 0);
error_reporting(E_ALL);
/****************************
* CREATE EVENT DISPATCHER *
****************************/
$dispatcher = new \Symfony\Component\EventDispatcher\EventDispatcher();
/************************
* LOAD SETTINGS *
************************/
$settings = Typemill\Settings::loadSettings();
/****************************
* HANDLE DISPLAY ERRORS *
****************************/
if(isset($settings['settings']['displayErrorDetails']) && $settings['settings']['displayErrorDetails'])
2019-10-20 12:09:45 +02:00
{
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
}
/************************
* INITIATE SLIM *
************************/
$app = new \Slim\App($settings);
2020-10-14 07:51:24 +02:00
/************************
* GET SLIM CONTAINER *
2020-10-14 07:51:24 +02:00
************************/
$container = $app->getContainer();
2020-10-14 07:51:24 +02:00
2019-10-20 12:09:45 +02:00
/************************
* Create URI *
2019-10-20 12:09:45 +02:00
************************/
# get uri and delete username and password from uri
$uri = \Slim\Http\Uri::createFromEnvironment(new \Slim\Http\Environment($_SERVER))->withUserInfo('');
2019-10-20 12:09:45 +02:00
/************************
* LOAD & UPDATE PLUGINS *
************************/
$plugins = new Typemill\Plugins();
$pluginNames = $plugins->load();
2019-10-20 12:09:45 +02:00
$pluginSettings = $routes = $middleware = array();
foreach($pluginNames as $pluginName)
{
$className = $pluginName['className'];
$name = $pluginName['name'];
2019-10-20 12:09:45 +02:00
# 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);
2019-10-20 12:09:45 +02:00
$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();
2020-07-04 08:06:18 +02:00
/**********************************
* 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;
};
2019-10-20 12:09:45 +02:00
/******************************
* ADD DISPATCHER TO CONTAINER *
******************************/
$container['dispatcher'] = function($container) use ($dispatcher)
{
return $dispatcher;
};
/************************
* 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);
$container['flash'] = false;
$container['csrf'] = false;
/************************************
* ADD ASSET-FUNCTION FOR PLUGINS *
************************************/
$container['assets'] = function($c) use ($uri)
{
return new \Typemill\Assets($uri->getBaseUrl());
};
/********************************
* MOVE TO MIDDLEWARE NEXT TIME *
********************************/
2020-07-15 10:53:27 +02:00
# if website is restricted to registered user
if( ( isset($settings['settings']['access']) && $settings['settings']['access'] ) || ( isset($settings['settings']['pageaccess']) && $settings['settings']['pageaccess'] ) )
2020-07-15 10:53:27 +02:00
{
# activate session for all routes
$session_segments = [$uri->getPath()];
2020-07-15 10:53:27 +02:00
}
2019-10-20 12:09:45 +02:00
foreach($session_segments as $segment)
{
if(substr( $uri->getPath(), 0, strlen($segment) ) === $segment)
2019-10-20 12:09:45 +02:00
{
// configure session
ini_set('session.cookie_httponly', 1 );
ini_set('session.use_strict_mode', 1);
ini_set('session.cookie_samesite', 'lax');
if($uri->getScheme() == 'https')
2019-10-20 12:09:45 +02:00
{
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);
$guard->setfailurecallable(function ($request, $response, $next)
{
$request = $request->withattribute("csrf_result", false);
return $next($request, $response);
});
2019-10-20 12:09:45 +02:00
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) use ($uri)
2019-10-20 12:09:45 +02:00
{
$path = array($container->get('settings')['themePath'], $container->get('settings')['authorPath']);
2020-10-03 21:28:20 +02:00
$cache = ( isset($container->get('settings')['twigcache']) && $container->get('settings')['twigcache'] ) ? $container->get('settings')['rootPath'] . '/cache/twig' : false;
2019-10-20 12:09:45 +02:00
$view = new \Slim\Views\Twig( $path, [
2020-10-03 21:28:20 +02:00
'cache' => $cache,
2019-10-20 12:09:45 +02:00
'autoescape' => false,
'debug' => true
]);
# Instantiate and add Slim specific extension
$router = $container->get('router');
$view->addExtension(new Slim\Views\TwigExtension($router, $uri));
2019-10-20 12:09:45 +02:00
$view->addExtension(new Twig_Extension_Debug());
$view->addExtension(new Typemill\Extensions\TwigUserExtension());
2020-04-05 19:13:10 +02:00
$view->addExtension(new Typemill\Extensions\TwigMarkdownExtension());
2019-12-31 15:57:45 +01:00
$view->addExtension(new Typemill\Extensions\TwigMetaExtension());
2020-04-05 19:13:10 +02:00
$view->addExtension(new Typemill\Extensions\TwigPagelistExtension());
2020-10-07 11:37:22 +02:00
# if session route, add flash messages and csrf-protection
2019-10-20 12:09:45 +02:00
if($container['flash'])
{
$view->getEnvironment()->addGlobal('flash', $container->flash);
$view->addExtension(new Typemill\Extensions\TwigCsrfExtension($container['csrf']));
$view->addExtension(new Typemill\Extensions\TwigCaptchaExtension());
2019-10-20 12:09:45 +02:00
}
/******************************
* LOAD TRANSLATIONS *
******************************/
2021-03-01 11:08:37 +01:00
$pieces = explode('/',trim($uri->getPath(),'/'));
if( ($pieces[0] === 'tm' OR $pieces[0] === '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 ));
2020-05-27 11:49:38 +02:00
2019-10-20 12:09:45 +02:00
return $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\SecurityMiddleware($container['router'], $container['settings'], $container['flash']));
2019-10-20 12:09:45 +02:00
$app->add(new \Typemill\Middleware\OldInputMiddleware($container['view']));
$app->add($container->get('csrf'));
}
/********************************
* ASSET MIDDLEWARE FOR TWIG *
********************************/
$app->add(new \Typemill\Middleware\assetMiddleware($container));
/********************************
* PROXY DETECTION FOR REQUEST *
********************************/
if(isset($settings['settings']['proxy']) && $settings['settings']['proxy'])
{
$trustedProxies = ( isset($settings['settings']['trustedproxies']) && !empty($settings['settings']['trustedproxies']) ) ? explode(",", $settings['settings']['trustedproxies']) : [];
$app->add(new RKA\Middleware\ProxyDetection($trustedProxies));
}
2019-10-20 12:09:45 +02:00
/************************
* ADD ROUTES *
************************/
require __DIR__ . '/Routes/Api.php';
require __DIR__ . '/Routes/Web.php';