first commi
This commit is contained in:
@@ -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;
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user