first commi

This commit is contained in:
2021-03-05 09:30:59 +01:00
commit bfa5e61d5e
853 changed files with 120974 additions and 0 deletions
@@ -0,0 +1,157 @@
<?php
/**
* @package Grav\Common\Service
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Service;
use Grav\Common\Config\Config;
use Grav\Common\Grav;
use Grav\Common\Page\Header;
use Grav\Common\Page\Interfaces\PageInterface;
use Grav\Common\User\DataUser;
use Grav\Common\User\User;
use Grav\Events\PermissionsRegisterEvent;
use Grav\Framework\Acl\Permissions;
use Grav\Framework\Acl\PermissionsReader;
use Grav\Framework\Flex\Flex;
use Grav\Framework\Flex\Interfaces\FlexIndexInterface;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
use RocketTheme\Toolbox\Event\Event;
use SplFileInfo;
use Symfony\Component\EventDispatcher\EventDispatcher;
use function define;
use function defined;
use function is_array;
/**
* Class AccountsServiceProvider
* @package Grav\Common\Service
*/
class AccountsServiceProvider implements ServiceProviderInterface
{
/**
* @param Container $container
* @return void
*/
public function register(Container $container)
{
$container['permissions'] = static function (Grav $container) {
/** @var Config $config */
$config = $container['config'];
$permissions = new Permissions();
$permissions->addTypes($config->get('permissions.types', []));
$array = $config->get('permissions.actions');
if (is_array($array)) {
$actions = PermissionsReader::fromArray($array, $permissions->getTypes());
$permissions->addActions($actions);
}
$event = new PermissionsRegisterEvent($permissions);
$container->dispatchEvent($event);
return $permissions;
};
$container['accounts'] = function (Container $container) {
$type = $this->initialize($container);
return $type === 'flex' ? $this->flexAccounts($container) : $this->regularAccounts($container);
};
$container['user_groups'] = static function (Container $container) {
/** @var Flex $flex */
$flex = $container['flex'];
$directory = $flex->getDirectory('user-groups');
return $directory ? $directory->getIndex() : null;
};
$container['users'] = $container->factory(static function (Container $container) {
user_error('Grav::instance()[\'users\'] is deprecated since Grav 1.6, use Grav::instance()[\'accounts\'] instead', E_USER_DEPRECATED);
return $container['accounts'];
});
}
/**
* @param Container $container
* @return string
*/
protected function initialize(Container $container): string
{
$isDefined = defined('GRAV_USER_INSTANCE');
$type = strtolower($isDefined ? GRAV_USER_INSTANCE : $container['config']->get('system.accounts.type', 'regular'));
if ($type === 'flex') {
if (!$isDefined) {
define('GRAV_USER_INSTANCE', 'FLEX');
}
/** @var EventDispatcher $dispatcher */
$dispatcher = $container['events'];
// Stop /admin/user from working, display error instead.
$dispatcher->addListener(
'onAdminPage',
static function (Event $event) {
$grav = Grav::instance();
$admin = $grav['admin'];
[$base,$location,] = $admin->getRouteDetails();
if ($location !== 'user' || isset($grav['flex_objects'])) {
return;
}
/** @var PageInterface $page */
$page = $event['page'];
$page->init(new SplFileInfo('plugin://admin/pages/admin/error.md'));
$page->routable(true);
$header = $page->header();
$header->title = 'Please install missing plugin';
$page->content("## Please install and enable **[Flex Objects]({$base}/plugins/flex-objects)** plugin. It is required to edit **Flex User Accounts**.");
/** @var Header $header */
$header = $page->header();
$directory = $grav['accounts']->getFlexDirectory();
$menu = $directory->getConfig('admin.menu.list');
$header->access = $menu['authorize'] ?? ['admin.super'];
},
100000
);
} elseif (!$isDefined) {
define('GRAV_USER_INSTANCE', 'REGULAR');
}
return $type;
}
/**
* @param Container $container
* @return DataUser\UserCollection
*/
protected function regularAccounts(Container $container)
{
// Use User class for backwards compatibility.
return new DataUser\UserCollection(User::class);
}
/**
* @param Container $container
* @return FlexIndexInterface|null
*/
protected function flexAccounts(Container $container)
{
/** @var Flex $flex */
$flex = $container['flex'];
$directory = $flex->getDirectory('user-accounts');
return $directory ? $directory->getIndex() : null;
}
}
@@ -0,0 +1,32 @@
<?php
/**
* @package Grav\Common\Service
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Service;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
use Grav\Common\Assets;
/**
* Class AssetsServiceProvider
* @package Grav\Common\Service
*/
class AssetsServiceProvider implements ServiceProviderInterface
{
/**
* @param Container $container
* @return void
*/
public function register(Container $container)
{
$container['assets'] = function () {
return new Assets();
};
}
}
@@ -0,0 +1,35 @@
<?php
/**
* @package Grav\Common\Service
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Service;
use Grav\Common\Backup\Backups;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
/**
* Class BackupsServiceProvider
* @package Grav\Common\Service
*/
class BackupsServiceProvider implements ServiceProviderInterface
{
/**
* @param Container $container
* @return void
*/
public function register(Container $container)
{
$container['backups'] = function () {
$backups = new Backups();
$backups->setup();
return $backups;
};
}
}
@@ -0,0 +1,192 @@
<?php
/**
* @package Grav\Common\Service
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Service;
use DirectoryIterator;
use Grav\Common\Config\CompiledBlueprints;
use Grav\Common\Config\CompiledConfig;
use Grav\Common\Config\CompiledLanguages;
use Grav\Common\Config\Config;
use Grav\Common\Config\ConfigFileFinder;
use Grav\Common\Config\Setup;
use Grav\Common\Language\Language;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
use RocketTheme\Toolbox\File\YamlFile;
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
/**
* Class ConfigServiceProvider
* @package Grav\Common\Service
*/
class ConfigServiceProvider implements ServiceProviderInterface
{
/**
* @param Container $container
* @return void
*/
public function register(Container $container)
{
$container['setup'] = function ($c) {
$setup = new Setup($c);
$setup->init();
return $setup;
};
$container['blueprints'] = function ($c) {
return static::blueprints($c);
};
$container['config'] = function ($c) {
$config = static::load($c);
// After configuration has been loaded, we can disable YAML compatibility if strict mode has been enabled.
if (!$config->get('system.strict_mode.yaml_compat', true)) {
YamlFile::globalSettings(['compat' => false, 'native' => true]);
}
return $config;
};
$container['languages'] = function ($c) {
return static::languages($c);
};
$container['language'] = function ($c) {
return new Language($c);
};
}
/**
* @param Container $container
* @return mixed
*/
public static function blueprints(Container $container)
{
/** Setup $setup */
$setup = $container['setup'];
/** @var UniformResourceLocator $locator */
$locator = $container['locator'];
$cache = $locator->findResource('cache://compiled/blueprints', true, true);
$files = [];
$paths = $locator->findResources('blueprints://config');
$files += (new ConfigFileFinder)->locateFiles($paths);
$paths = $locator->findResources('plugins://');
$files += (new ConfigFileFinder)->setBase('plugins')->locateInFolders($paths, 'blueprints');
$paths = $locator->findResources('themes://');
$files += (new ConfigFileFinder)->setBase('themes')->locateInFolders($paths, 'blueprints');
$blueprints = new CompiledBlueprints($cache, $files, GRAV_ROOT);
return $blueprints->name("master-{$setup->environment}")->load();
}
/**
* @param Container $container
* @return Config
*/
public static function load(Container $container)
{
/** Setup $setup */
$setup = $container['setup'];
/** @var UniformResourceLocator $locator */
$locator = $container['locator'];
$cache = $locator->findResource('cache://compiled/config', true, true);
$files = [];
$paths = $locator->findResources('config://');
$files += (new ConfigFileFinder)->locateFiles($paths);
$paths = $locator->findResources('plugins://');
$files += (new ConfigFileFinder)->setBase('plugins')->locateInFolders($paths);
$paths = $locator->findResources('themes://');
$files += (new ConfigFileFinder)->setBase('themes')->locateInFolders($paths);
$compiled = new CompiledConfig($cache, $files, GRAV_ROOT);
$compiled->setBlueprints(function () use ($container) {
return $container['blueprints'];
});
$config = $compiled->name("master-{$setup->environment}")->load();
$config->environment = $setup->environment;
return $config;
}
/**
* @param Container $container
* @return mixed
*/
public static function languages(Container $container)
{
/** @var Setup $setup */
$setup = $container['setup'];
/** @var Config $config */
$config = $container['config'];
/** @var UniformResourceLocator $locator */
$locator = $container['locator'];
$cache = $locator->findResource('cache://compiled/languages', true, true);
$files = [];
// Process languages only if enabled in configuration.
if ($config->get('system.languages.translations', true)) {
$paths = $locator->findResources('languages://');
$files += (new ConfigFileFinder)->locateFiles($paths);
$paths = $locator->findResources('plugins://');
$files += (new ConfigFileFinder)->setBase('plugins')->locateInFolders($paths, 'languages');
$paths = static::pluginFolderPaths($paths, 'languages');
$files += (new ConfigFileFinder)->locateFiles($paths);
}
$languages = new CompiledLanguages($cache, $files, GRAV_ROOT);
return $languages->name("master-{$setup->environment}")->load();
}
/**
* Find specific paths in plugins
*
* @param array $plugins
* @param string $folder_path
* @return array
*/
private static function pluginFolderPaths($plugins, $folder_path)
{
$paths = [];
foreach ($plugins as $path) {
$iterator = new DirectoryIterator($path);
/** @var DirectoryIterator $directory */
foreach ($iterator as $directory) {
if (!$directory->isDir() || $directory->isDot()) {
continue;
}
// Path to the languages folder
$lang_path = $directory->getPathName() . '/' . $folder_path;
// If this folder exists, add it to the list of paths
if (file_exists($lang_path)) {
$paths []= $lang_path;
}
}
}
return $paths;
}
}
@@ -0,0 +1,30 @@
<?php
/**
* @package Grav\Common\Service
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Service;
use Grav\Common\Errors\Errors;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
/**
* Class ErrorServiceProvider
* @package Grav\Common\Service
*/
class ErrorServiceProvider implements ServiceProviderInterface
{
/**
* @param Container $container
* @return void
*/
public function register(Container $container)
{
$container['errors'] = new Errors;
}
}
@@ -0,0 +1,32 @@
<?php
/**
* @package Grav\Common\Service
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Service;
use Grav\Framework\Filesystem\Filesystem;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
/**
* Class FilesystemServiceProvider
* @package Grav\Common\Service
*/
class FilesystemServiceProvider implements ServiceProviderInterface
{
/**
* @param Container $container
* @return void
*/
public function register(Container $container)
{
$container['filesystem'] = function () {
return Filesystem::getInstance();
};
}
}
@@ -0,0 +1,117 @@
<?php
/**
* @package Grav\Common\Service
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Service;
use Grav\Common\Config\Config;
use Grav\Common\Flex\Types\Users\Storage\UserFileStorage;
use Grav\Common\Flex\Types\Users\Storage\UserFolderStorage;
use Grav\Common\Grav;
use Grav\Events\FlexRegisterEvent;
use Grav\Framework\Flex\Flex;
use Grav\Framework\Flex\FlexFormFlash;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
use function is_array;
/**
* Class FlexServiceProvider
* @package Grav\Common\Service
*/
class FlexServiceProvider implements ServiceProviderInterface
{
/**
* @param Container $container
* @return void
*/
public function register(Container $container)
{
$container['flex'] = function (Grav $container) {
/** @var Config $config */
$config = $container['config'];
$flex = new Flex([], ['object' => $config->get('system.flex', [])]);
FlexFormFlash::setFlex($flex);
$accountsEnabled = $config->get('system.accounts.type', 'regular') === 'flex';
$pagesEnabled = $config->get('system.pages.type', 'regular') === 'flex';
// Add built-in types from Grav.
if ($pagesEnabled) {
$flex->addDirectoryType(
'pages',
'blueprints://flex/pages.yaml',
[
'enabled' => $pagesEnabled
]
);
}
if ($accountsEnabled) {
$flex->addDirectoryType(
'user-accounts',
'blueprints://flex/user-accounts.yaml',
[
'enabled' => $accountsEnabled,
'data' => [
'storage' => $this->getFlexAccountsStorage($config),
]
]
);
$flex->addDirectoryType(
'user-groups',
'blueprints://flex/user-groups.yaml',
[
'enabled' => $accountsEnabled
]
);
}
// Call event to register Flex Directories.
$event = new FlexRegisterEvent($flex);
$container->dispatchEvent($event);
return $flex;
};
}
/**
* @param Config $config
* @return array
*/
private function getFlexAccountsStorage(Config $config): array
{
$value = $config->get('system.accounts.storage', 'file');
if (is_array($value)) {
return $value;
}
if ($value === 'folder') {
return [
'class' => UserFolderStorage::class,
'options' => [
'file' => 'user',
'pattern' => '{FOLDER}/{KEY:2}/{KEY}/{FILE}{EXT}',
'key' => 'storage_key'
],
];
}
if ($value === 'file') {
return [
'class' => UserFileStorage::class,
'options' => [
'pattern' => '{FOLDER}/{KEY}{EXT}',
'key' => 'username'
],
];
}
return [];
}
}
@@ -0,0 +1,32 @@
<?php
/**
* @package Grav\Common\Service
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Service;
use Grav\Common\Inflector;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
/**
* Class InflectorServiceProvider
* @package Grav\Common\Service
*/
class InflectorServiceProvider implements ServiceProviderInterface
{
/**
* @param Container $container
* @return void
*/
public function register(Container $container)
{
$container['inflector'] = function () {
return new Inflector();
};
}
}
@@ -0,0 +1,42 @@
<?php
/**
* @package Grav\Common\Service
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Service;
use Monolog\Handler\StreamHandler;
use Monolog\Logger;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
/**
* Class LoggerServiceProvider
* @package Grav\Common\Service
*/
class LoggerServiceProvider implements ServiceProviderInterface
{
/**
* @param Container $container
* @return void
*/
public function register(Container $container)
{
$container['log'] = function ($c) {
$log = new Logger('grav');
/** @var UniformResourceLocator $locator */
$locator = $c['locator'];
$log_file = $locator->findResource('log://grav.log', true, true);
$log->pushHandler(new StreamHandler($log_file, Logger::DEBUG));
return $log;
};
}
}
@@ -0,0 +1,39 @@
<?php
/**
* @package Grav\Common\Service
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Service;
use Grav\Common\Page\Interfaces\PageInterface;
use Grav\Common\Twig\Twig;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
/**
* Class OutputServiceProvider
* @package Grav\Common\Service
*/
class OutputServiceProvider implements ServiceProviderInterface
{
/**
* @param Container $container
* @return void
*/
public function register(Container $container)
{
$container['output'] = function ($c) {
/** @var Twig $twig */
$twig = $c['twig'];
/** @var PageInterface $page */
$page = $c['page'];
return $twig->processSite($page->templateFormat());
};
}
}
@@ -0,0 +1,125 @@
<?php
/**
* @package Grav\Common\Service
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Service;
use Grav\Common\Config\Config;
use Grav\Common\Grav;
use Grav\Common\Language\Language;
use Grav\Common\Page\Page;
use Grav\Common\Page\Pages;
use Grav\Common\Uri;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
use SplFileInfo;
use function defined;
/**
* Class PagesServiceProvider
* @package Grav\Common\Service
*/
class PagesServiceProvider implements ServiceProviderInterface
{
/**
* @param Container $container
* @return void
*/
public function register(Container $container)
{
$container['pages'] = function (Grav $grav) {
return new Pages($grav);
};
if (defined('GRAV_CLI')) {
$container['page'] = static function (Grav $grav) {
$path = $grav['locator']->findResource('system://pages/notfound.md');
$page = new Page();
$page->init(new SplFileInfo($path));
$page->routable(false);
return $page;
};
return;
}
$container['page'] = static function (Grav $grav) {
/** @var Pages $pages */
$pages = $grav['pages'];
/** @var Config $config */
$config = $grav['config'];
/** @var Uri $uri */
$uri = $grav['uri'];
$path = $uri->path() ?: '/'; // Don't trim to support trailing slash default routes
$page = $pages->dispatch($path);
// Redirection tests
if ($page) {
// some debugger override logic
if ($page->debugger() === false) {
$grav['debugger']->enabled(false);
}
if ($config->get('system.force_ssl')) {
$scheme = $uri->scheme(true);
if ($scheme !== 'https') {
$url = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$grav->redirect($url);
}
}
$url = $pages->route($page->route());
if ($uri->params()) {
if ($url === '/') { //Avoid double slash
$url = $uri->params();
} else {
$url .= $uri->params();
}
}
if ($uri->query()) {
$url .= '?' . $uri->query();
}
if ($uri->fragment()) {
$url .= '#' . $uri->fragment();
}
/** @var Language $language */
$language = $grav['language'];
// Language-specific redirection scenarios
if ($language->enabled() && ($language->isLanguageInUrl() xor $language->isIncludeDefaultLanguage())) {
$grav->redirect($url);
}
// Default route test and redirect
if ($config->get('system.pages.redirect_default_route') && $page->route() !== $path) {
$grav->redirect($url);
}
}
// if page is not found, try some fallback stuff
if (!$page || !$page->routable()) {
// Try fallback URL stuff...
$page = $grav->fallbackUrl($path);
if (!$page) {
$path = $grav['locator']->findResource('system://pages/notfound.md');
$page = new Page();
$page->init(new SplFileInfo($path));
$page->routable(false);
}
}
return $page;
};
}
}
@@ -0,0 +1,46 @@
<?php
/**
* @package Grav\Common\Service
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Service;
use Grav\Common\Uri;
use Nyholm\Psr7\Factory\Psr17Factory;
use Nyholm\Psr7Server\ServerRequestCreator;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
/**
* Class RequestServiceProvider
* @package Grav\Common\Service
*/
class RequestServiceProvider implements ServiceProviderInterface
{
/**
* @param Container $container
* @return void
*/
public function register(Container $container)
{
$container['request'] = function () {
$psr17Factory = new Psr17Factory();
$creator = new ServerRequestCreator(
$psr17Factory, // ServerRequestFactory
$psr17Factory, // UriFactory
$psr17Factory, // UploadedFileFactory
$psr17Factory // StreamFactory
);
return $creator->fromGlobals();
};
$container['route'] = $container->factory(function () {
return clone Uri::getCurrentRoute();
});
}
}
@@ -0,0 +1,32 @@
<?php
/**
* @package Grav\Common\Service
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Service;
use Grav\Common\Scheduler\Scheduler;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
/**
* Class SchedulerServiceProvider
* @package Grav\Common\Service
*/
class SchedulerServiceProvider implements ServiceProviderInterface
{
/**
* @param Container $container
* @return void
*/
public function register(Container $container)
{
$container['scheduler'] = function () {
return new Scheduler();
};
}
}
@@ -0,0 +1,133 @@
<?php
/**
* @package Grav\Common\Service
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Service;
use Grav\Common\Config\Config;
use Grav\Common\Debugger;
use Grav\Common\Session;
use Grav\Common\Uri;
use Grav\Common\Utils;
use Grav\Framework\Session\Messages;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
/**
* Class SessionServiceProvider
* @package Grav\Common\Service
*/
class SessionServiceProvider implements ServiceProviderInterface
{
/**
* @param Container $container
* @return void
*/
public function register(Container $container)
{
// Define session service.
$container['session'] = static function ($c) {
/** @var Config $config */
$config = $c['config'];
/** @var Uri $uri */
$uri = $c['uri'];
// Get session options.
$enabled = (bool)$config->get('system.session.enabled', false);
$cookie_secure = (bool)$config->get('system.session.secure', false);
$cookie_httponly = (bool)$config->get('system.session.httponly', true);
$cookie_lifetime = (int)$config->get('system.session.timeout', 1800);
$cookie_domain = $config->get('system.session.domain');
$cookie_path = $config->get('system.session.path');
$cookie_samesite = $config->get('system.session.samesite', 'Lax');
if (null === $cookie_domain) {
$cookie_domain = $uri->host();
if ($cookie_domain === 'localhost') {
$cookie_domain = '';
}
}
if (null === $cookie_path) {
$cookie_path = '/' . trim(Uri::filterPath($uri->rootUrl(false)), '/');
}
// Session cookie path requires trailing slash.
$cookie_path = rtrim($cookie_path, '/') . '/';
// Activate admin if we're inside the admin path.
$is_admin = false;
if ($config->get('plugins.admin.enabled')) {
$admin_base = '/' . trim($config->get('plugins.admin.route'), '/');
// Uri::route() is not processed yet, let's quickly get what we need.
$current_route = str_replace(Uri::filterPath($uri->rootUrl(false)), '', parse_url($uri->url(true), PHP_URL_PATH));
// Test to see if path starts with a supported language + admin base
$lang = Utils::pathPrefixedByLangCode($current_route);
$lang_admin_base = '/' . $lang . $admin_base;
// Check no language, simple language prefix (en) and region specific language prefix (en-US).
if (Utils::startsWith($current_route, $admin_base) || Utils::startsWith($current_route, $lang_admin_base)) {
$cookie_lifetime = $config->get('plugins.admin.session.timeout', 1800);
$enabled = $is_admin = true;
}
}
// Fix for HUGE session timeouts.
if ($cookie_lifetime > 99999999999) {
$cookie_lifetime = 9999999999;
}
$session_prefix = $c['inflector']->hyphenize($config->get('system.session.name', 'grav-site'));
$session_uniqueness = $config->get('system.session.uniqueness', 'path') === 'path' ? substr(md5(GRAV_ROOT), 0, 7) : md5($config->get('security.salt'));
$session_name = $session_prefix . '-' . $session_uniqueness;
if ($is_admin && $config->get('system.session.split', true)) {
$session_name .= '-admin';
}
// Define session service.
$options = [
'name' => $session_name,
'cookie_lifetime' => $cookie_lifetime,
'cookie_path' => $cookie_path,
'cookie_domain' => $cookie_domain,
'cookie_secure' => $cookie_secure,
'cookie_httponly' => $cookie_httponly,
'cookie_samesite' => $cookie_samesite
] + (array) $config->get('system.session.options');
$session = new Session($options);
$session->setAutoStart($enabled);
return $session;
};
// Define session message service.
$container['messages'] = function ($c) {
if (!isset($c['session']) || !$c['session']->isStarted()) {
/** @var Debugger $debugger */
$debugger = $c['debugger'];
$debugger->addMessage('Inactive session: session messages may disappear', 'warming');
return new Messages();
}
/** @var Session $session */
$session = $c['session'];
if (!$session->messages instanceof Messages) {
$session->messages = new Messages();
}
return $session->messages;
};
}
}
@@ -0,0 +1,56 @@
<?php
/**
* @package Grav\Common\Service
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Service;
use Grav\Common\Config\Setup;
use Pimple\Container;
use RocketTheme\Toolbox\DI\ServiceProviderInterface;
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
use RocketTheme\Toolbox\StreamWrapper\ReadOnlyStream;
use RocketTheme\Toolbox\StreamWrapper\Stream;
use RocketTheme\Toolbox\StreamWrapper\StreamBuilder;
/**
* Class StreamsServiceProvider
* @package Grav\Common\Service
*/
class StreamsServiceProvider implements ServiceProviderInterface
{
/**
* @param Container $container
* @return void
*/
public function register(Container $container)
{
$container['locator'] = function (Container $container) {
$locator = new UniformResourceLocator(GRAV_ROOT);
/** @var Setup $setup */
$setup = $container['setup'];
$setup->initializeLocator($locator);
return $locator;
};
$container['streams'] = function (Container $container) {
/** @var Setup $setup */
$setup = $container['setup'];
/** @var UniformResourceLocator $locator */
$locator = $container['locator'];
// Set locator to both streams.
Stream::setLocator($locator);
ReadOnlyStream::setLocator($locator);
return new StreamBuilder($setup->getStreams());
};
}
}
@@ -0,0 +1,46 @@
<?php
/**
* @package Grav\Common\Service
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Service;
use Grav\Common\Grav;
use Pimple\Container;
use Pimple\ServiceProviderInterface;
/**
* Class TaskServiceProvider
* @package Grav\Common\Service
*/
class TaskServiceProvider implements ServiceProviderInterface
{
/**
* @param Container $container
* @return void
*/
public function register(Container $container)
{
$container['task'] = function (Grav $c) {
$task = $_POST['task'] ?? $c['uri']->param('task');
if (null !== $task) {
$task = filter_var($task, FILTER_SANITIZE_STRING);
}
return $task ?: null;
};
$container['action'] = function (Grav $c) {
$action = $_POST['action'] ?? $c['uri']->param('action');
if (null !== $action) {
$action = filter_var($action, FILTER_SANITIZE_STRING);
}
return $action ?: null;
};
}
}