SessionServiceProvider.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <?php
  2. /**
  3. * @package Grav\Common\Service
  4. *
  5. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
  6. * @license MIT License; see LICENSE file for details.
  7. */
  8. namespace Grav\Common\Service;
  9. use Grav\Common\Config\Config;
  10. use Grav\Common\Debugger;
  11. use Grav\Common\Session;
  12. use Grav\Common\Uri;
  13. use Grav\Common\Utils;
  14. use Pimple\Container;
  15. use Pimple\ServiceProviderInterface;
  16. use RocketTheme\Toolbox\Session\Message;
  17. class SessionServiceProvider implements ServiceProviderInterface
  18. {
  19. public function register(Container $container)
  20. {
  21. // Define session service.
  22. $container['session'] = function ($c) {
  23. /** @var Config $config */
  24. $config = $c['config'];
  25. /** @var Uri $uri */
  26. $uri = $c['uri'];
  27. // Get session options.
  28. $enabled = (bool)$config->get('system.session.enabled', false);
  29. $cookie_secure = (bool)$config->get('system.session.secure', false);
  30. $cookie_httponly = (bool)$config->get('system.session.httponly', true);
  31. $cookie_lifetime = (int)$config->get('system.session.timeout', 1800);
  32. $cookie_path = $config->get('system.session.path');
  33. if (null === $cookie_path) {
  34. $cookie_path = '/' . trim(Uri::filterPath($uri->rootUrl(false)), '/');
  35. }
  36. // Session cookie path requires trailing slash.
  37. $cookie_path = rtrim($cookie_path, '/') . '/';
  38. $cookie_domain = $uri->host();
  39. if ($cookie_domain === 'localhost') {
  40. $cookie_domain = '';
  41. }
  42. // Activate admin if we're inside the admin path.
  43. $is_admin = false;
  44. if ($config->get('plugins.admin.enabled')) {
  45. $admin_base = '/' . trim($config->get('plugins.admin.route'), '/');
  46. // Uri::route() is not processed yet, let's quickly get what we need.
  47. $current_route = str_replace(Uri::filterPath($uri->rootUrl(false)), '', parse_url($uri->url(true), PHP_URL_PATH));
  48. // Test to see if path starts with a supported language + admin base
  49. $lang = Utils::pathPrefixedByLangCode($current_route);
  50. $lang_admin_base = '/' . $lang . $admin_base;
  51. // Check no language, simple language prefix (en) and region specific language prefix (en-US).
  52. if (Utils::startsWith($current_route, $admin_base) || Utils::startsWith($current_route, $lang_admin_base)) {
  53. $cookie_lifetime = $config->get('plugins.admin.session.timeout', 1800);
  54. $enabled = $is_admin = true;
  55. }
  56. }
  57. // Fix for HUGE session timeouts.
  58. if ($cookie_lifetime > 99999999999) {
  59. $cookie_lifetime = 9999999999;
  60. }
  61. $session_prefix = $c['inflector']->hyphenize($config->get('system.session.name', 'grav-site'));
  62. $session_uniqueness = $config->get('system.session.uniqueness', 'path') === 'path' ? substr(md5(GRAV_ROOT), 0, 7) : md5($config->get('security.salt'));
  63. $session_name = $session_prefix . '-' . $session_uniqueness;
  64. if ($is_admin && $config->get('system.session.split', true)) {
  65. $session_name .= '-admin';
  66. }
  67. // Define session service.
  68. $options = [
  69. 'name' => $session_name,
  70. 'cookie_lifetime' => $cookie_lifetime,
  71. 'cookie_path' => $cookie_path,
  72. 'cookie_domain' => $cookie_domain,
  73. 'cookie_secure' => $cookie_secure,
  74. 'cookie_httponly' => $cookie_httponly
  75. ] + (array) $config->get('system.session.options');
  76. $session = new Session($options);
  77. $session->setAutoStart($enabled);
  78. return $session;
  79. };
  80. // Define session message service.
  81. $container['messages'] = function ($c) {
  82. if (!isset($c['session']) || !$c['session']->isStarted()) {
  83. /** @var Debugger $debugger */
  84. $debugger = $c['debugger'];
  85. $debugger->addMessage('Inactive session: session messages may disappear', 'warming');
  86. return new Message;
  87. }
  88. /** @var Session $session */
  89. $session = $c['session'];
  90. if (!isset($session->messages)) {
  91. $session->messages = new Message;
  92. }
  93. return $session->messages;
  94. };
  95. }
  96. }