From: Philipp Date: Sat, 23 Oct 2021 09:39:29 +0000 (+0200) Subject: Restructure Session to follow new paradigm X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=57b4c008cb0796fe4add72bc94746d0bba64355f;p=friendica.git Restructure Session to follow new paradigm --- diff --git a/src/Core/Session/AbstractSession.php b/src/Core/Session/AbstractSession.php deleted file mode 100644 index c185f1bbfa..0000000000 --- a/src/Core/Session/AbstractSession.php +++ /dev/null @@ -1,84 +0,0 @@ -. - * - */ - -namespace Friendica\Core\Session; - -/** - * Contains the base methods for $_SESSION interaction - */ -class AbstractSession -{ - /** - * {@inheritDoc} - */ - public function start() - { - return $this; - } - - /** - * {@inheritDoc}} - */ - public function exists(string $name) - { - return isset($_SESSION[$name]); - } - - /** - * {@inheritDoc} - */ - public function get(string $name, $defaults = null) - { - return $_SESSION[$name] ?? $defaults; - } - - /** - * {@inheritDoc} - */ - public function set(string $name, $value) - { - $_SESSION[$name] = $value; - } - - /** - * {@inheritDoc} - */ - public function setMultiple(array $values) - { - $_SESSION = $values + $_SESSION; - } - - /** - * {@inheritDoc} - */ - public function remove(string $name) - { - unset($_SESSION[$name]); - } - - /** - * {@inheritDoc} - */ - public function clear() - { - $_SESSION = []; - } -} diff --git a/src/Core/Session/Factory/SessionFactory.php b/src/Core/Session/Factory/SessionFactory.php new file mode 100644 index 0000000000..510ff08c75 --- /dev/null +++ b/src/Core/Session/Factory/SessionFactory.php @@ -0,0 +1,91 @@ +. + * + */ + +namespace Friendica\Core\Session\Factory; + +use Friendica\App; +use Friendica\Core\Cache\ICache; +use Friendica\Core\Cache\Enum\Type; +use Friendica\Core\Config\IConfig; +use Friendica\Core\Session; +use Friendica\Database\Database; +use Friendica\Util\Profiler; +use Psr\Log\LoggerInterface; + +/** + * Factory for creating a valid Session for this run + */ +class SessionFactory +{ + /** @var string The plain, PHP internal session management */ + const HANDLER_NATIVE = 'native'; + /** @var string Using the database for session management */ + const HANDLER_DATABASE = 'database'; + /** @var string Using the cache for session management */ + const HANDLER_CACHE = 'cache'; + + const HANDLER_DEFAULT = self::HANDLER_DATABASE; + + /** + * @param App\Mode $mode + * @param App\BaseURL $baseURL + * @param IConfig $config + * @param Database $dba + * @param ICache $cache + * @param LoggerInterface $logger + * @param array $server + * + * @return Session\ISession + */ + public function createSession(App\Mode $mode, App\BaseURL $baseURL, IConfig $config, Database $dba, ICache $cache, LoggerInterface $logger, Profiler $profiler, array $server = []) + { + $profiler->startRecording('session'); + $session = null; + + try { + if ($mode->isInstall() || $mode->isBackend()) { + $session = new Session\Type\Memory(); + } else { + $session_handler = $config->get('system', 'session_handler', self::HANDLER_DEFAULT); + $handler = null; + + switch ($session_handler) { + case self::HANDLER_DATABASE: + $handler = new Session\Handler\Database($dba, $logger, $server); + break; + case self::HANDLER_CACHE: + // In case we're using the db as cache driver, use the native db session, not the cache + if ($config->get('system', 'cache_driver') === Type::DATABASE) { + $handler = new Session\Handler\Database($dba, $logger, $server); + } else { + $handler = new Session\Handler\Cache($cache); + } + break; + } + + $session = new Session\Type\Native($baseURL, $handler); + } + } finally { + $profiler->stopRecording(); + return $session; + } + } +} diff --git a/src/Core/Session/Memory.php b/src/Core/Session/Memory.php deleted file mode 100644 index 7cf9fd6aef..0000000000 --- a/src/Core/Session/Memory.php +++ /dev/null @@ -1,37 +0,0 @@ -. - * - */ - -namespace Friendica\Core\Session; - -/** - * Usable for backend processes (daemon/worker) and testing - * - * @todo after replacing the last direct $_SESSION call, use a internal array instead of the global variable - */ -class Memory extends AbstractSession implements ISession -{ - public function __construct() - { - // Backward compatibility until all Session variables are replaced - // with the Session class - $_SESSION = []; - } -} diff --git a/src/Core/Session/Native.php b/src/Core/Session/Native.php deleted file mode 100644 index 23d02af921..0000000000 --- a/src/Core/Session/Native.php +++ /dev/null @@ -1,56 +0,0 @@ -. - * - */ - -namespace Friendica\Core\Session; - -use Friendica\App; -use Friendica\Model\User\Cookie; -use SessionHandlerInterface; - -/** - * The native Session class which uses the PHP internal Session functions - */ -class Native extends AbstractSession implements ISession -{ - public function __construct(App\BaseURL $baseURL, SessionHandlerInterface $handler = null) - { - ini_set('session.gc_probability', 50); - ini_set('session.use_only_cookies', 1); - ini_set('session.cookie_httponly', (int)Cookie::HTTPONLY); - - if ($baseURL->getSSLPolicy() == App\BaseURL::SSL_POLICY_FULL) { - ini_set('session.cookie_secure', 1); - } - - if (isset($handler)) { - session_set_save_handler($handler); - } - } - - /** - * {@inheritDoc} - */ - public function start() - { - session_start(); - return $this; - } -} diff --git a/src/Core/Session/Type/AbstractSession.php b/src/Core/Session/Type/AbstractSession.php new file mode 100644 index 0000000000..8126804dba --- /dev/null +++ b/src/Core/Session/Type/AbstractSession.php @@ -0,0 +1,84 @@ +. + * + */ + +namespace Friendica\Core\Session\Type; + +/** + * Contains the base methods for $_SESSION interaction + */ +class AbstractSession +{ + /** + * {@inheritDoc} + */ + public function start() + { + return $this; + } + + /** + * {@inheritDoc}} + */ + public function exists(string $name) + { + return isset($_SESSION[$name]); + } + + /** + * {@inheritDoc} + */ + public function get(string $name, $defaults = null) + { + return $_SESSION[$name] ?? $defaults; + } + + /** + * {@inheritDoc} + */ + public function set(string $name, $value) + { + $_SESSION[$name] = $value; + } + + /** + * {@inheritDoc} + */ + public function setMultiple(array $values) + { + $_SESSION = $values + $_SESSION; + } + + /** + * {@inheritDoc} + */ + public function remove(string $name) + { + unset($_SESSION[$name]); + } + + /** + * {@inheritDoc} + */ + public function clear() + { + $_SESSION = []; + } +} diff --git a/src/Core/Session/Type/Memory.php b/src/Core/Session/Type/Memory.php new file mode 100644 index 0000000000..635d880e7a --- /dev/null +++ b/src/Core/Session/Type/Memory.php @@ -0,0 +1,39 @@ +. + * + */ + +namespace Friendica\Core\Session\Type; + +use Friendica\Core\Session\ISession; + +/** + * Usable for backend processes (daemon/worker) and testing + * + * @todo after replacing the last direct $_SESSION call, use a internal array instead of the global variable + */ +class Memory extends AbstractSession implements ISession +{ + public function __construct() + { + // Backward compatibility until all Session variables are replaced + // with the Session class + $_SESSION = []; + } +} diff --git a/src/Core/Session/Type/Native.php b/src/Core/Session/Type/Native.php new file mode 100644 index 0000000000..4edd9a962e --- /dev/null +++ b/src/Core/Session/Type/Native.php @@ -0,0 +1,57 @@ +. + * + */ + +namespace Friendica\Core\Session\Type; + +use Friendica\App; +use Friendica\Core\Session\ISession; +use Friendica\Model\User\Cookie; +use SessionHandlerInterface; + +/** + * The native Session class which uses the PHP internal Session functions + */ +class Native extends AbstractSession implements ISession +{ + public function __construct(App\BaseURL $baseURL, SessionHandlerInterface $handler = null) + { + ini_set('session.gc_probability', 50); + ini_set('session.use_only_cookies', 1); + ini_set('session.cookie_httponly', (int)Cookie::HTTPONLY); + + if ($baseURL->getSSLPolicy() == App\BaseURL::SSL_POLICY_FULL) { + ini_set('session.cookie_secure', 1); + } + + if (isset($handler)) { + session_set_save_handler($handler); + } + } + + /** + * {@inheritDoc} + */ + public function start() + { + session_start(); + return $this; + } +} diff --git a/src/Factory/SessionFactory.php b/src/Factory/SessionFactory.php deleted file mode 100644 index 82161fb554..0000000000 --- a/src/Factory/SessionFactory.php +++ /dev/null @@ -1,92 +0,0 @@ -. - * - */ - -namespace Friendica\Factory; - -use Friendica\App; -use Friendica\Core\Cache\ICache; -use Friendica\Core\Cache\Enum\Type; -use Friendica\Core\Config\IConfig; -use Friendica\Core\Session; -use Friendica\Core\System; -use Friendica\Database\Database; -use Friendica\Util\Profiler; -use Psr\Log\LoggerInterface; - -/** - * Factory for creating a valid Session for this run - */ -class SessionFactory -{ - /** @var string The plain, PHP internal session management */ - const HANDLER_NATIVE = 'native'; - /** @var string Using the database for session management */ - const HANDLER_DATABASE = 'database'; - /** @var string Using the cache for session management */ - const HANDLER_CACHE = 'cache'; - - const HANDLER_DEFAULT = self::HANDLER_DATABASE; - - /** - * @param App\Mode $mode - * @param App\BaseURL $baseURL - * @param IConfig $config - * @param Database $dba - * @param ICache $cache - * @param LoggerInterface $logger - * @param array $server - * - * @return Session\ISession - */ - public function createSession(App\Mode $mode, App\BaseURL $baseURL, IConfig $config, Database $dba, ICache $cache, LoggerInterface $logger, Profiler $profiler, array $server = []) - { - $profiler->startRecording('session'); - $session = null; - - try { - if ($mode->isInstall() || $mode->isBackend()) { - $session = new Session\Memory(); - } else { - $session_handler = $config->get('system', 'session_handler', self::HANDLER_DEFAULT); - $handler = null; - - switch ($session_handler) { - case self::HANDLER_DATABASE: - $handler = new Session\Handler\Database($dba, $logger, $server); - break; - case self::HANDLER_CACHE: - // In case we're using the db as cache driver, use the native db session, not the cache - if ($config->get('system', 'cache_driver') === Type::DATABASE) { - $handler = new Session\Handler\Database($dba, $logger, $server); - } else { - $handler = new Session\Handler\Cache($cache); - } - break; - } - - $session = new Session\Native($baseURL, $handler); - } - } finally { - $profiler->stopRecording(); - return $session; - } - } -} diff --git a/static/dependencies.config.php b/static/dependencies.config.php index 48ed997f33..4591f4761c 100644 --- a/static/dependencies.config.php +++ b/static/dependencies.config.php @@ -207,7 +207,7 @@ return [ ], ], ISession::class => [ - 'instanceOf' => Factory\SessionFactory::class, + 'instanceOf' => \Friendica\Core\Session\Factory\SessionFactory::class, 'call' => [ ['createSession', [$_SERVER], Dice::CHAIN_CALL], ['start', [], Dice::CHAIN_CALL], diff --git a/tests/FixtureTest.php b/tests/FixtureTest.php index fdeda1febc..c09f874fa0 100644 --- a/tests/FixtureTest.php +++ b/tests/FixtureTest.php @@ -33,7 +33,7 @@ abstract class FixtureTest extends DatabaseTest $this->dice = (new Dice()) ->addRules(include __DIR__ . '/../static/dependencies.config.php') ->addRule(Database::class, ['instanceOf' => StaticDatabase::class, 'shared' => true]) - ->addRule(ISession::class, ['instanceOf' => Session\Memory::class, 'shared' => true, 'call' => null]); + ->addRule(ISession::class, ['instanceOf' => Session\Type\Memory::class, 'shared' => true, 'call' => null]); DI::init($this->dice); /** @var IConfig $config */ diff --git a/tests/src/Core/StorageManagerTest.php b/tests/src/Core/StorageManagerTest.php index acab50ce42..b7e5715edc 100644 --- a/tests/src/Core/StorageManagerTest.php +++ b/tests/src/Core/StorageManagerTest.php @@ -253,7 +253,7 @@ class StorageManagerTest extends DatabaseTest $dice = (new Dice()) ->addRules(include __DIR__ . '/../../../static/dependencies.config.php') ->addRule(Database::class, ['instanceOf' => StaticDatabase::class, 'shared' => true]) - ->addRule(ISession::class, ['instanceOf' => Session\Memory::class, 'shared' => true, 'call' => null]); + ->addRule(ISession::class, ['instanceOf' => Session\Type\Memory::class, 'shared' => true, 'call' => null]); DI::init($dice); $storageManager = new StorageManager($this->dba, $this->config, $this->logger, $this->l10n); @@ -281,7 +281,7 @@ class StorageManagerTest extends DatabaseTest $dice = (new Dice()) ->addRules(include __DIR__ . '/../../../static/dependencies.config.php') ->addRule(Database::class, ['instanceOf' => StaticDatabase::class, 'shared' => true]) - ->addRule(ISession::class, ['instanceOf' => Session\Memory::class, 'shared' => true, 'call' => null]); + ->addRule(ISession::class, ['instanceOf' => Session\Type\Memory::class, 'shared' => true, 'call' => null]); DI::init($dice); $storageManager = new StorageManager($this->dba, $this->config, $this->logger, $this->l10n);