SessionServiceProvider.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <?php
  2. /**
  3. * @package Grav.Common.Service
  4. *
  5. * @copyright Copyright (C) 2015 - 2018 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\Inflector;
  12. use Grav\Common\Session;
  13. use Grav\Common\Uri;
  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. $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. // Check no language, simple language prefix (en) and region specific language prefix (en-US).
  49. $pos = strpos($current_route, $base);
  50. if ($pos === 0 || $pos === 3 || $pos === 6) {
  51. $cookie_lifetime = $config->get('plugins.admin.session.timeout', 1800);
  52. $enabled = $is_admin = true;
  53. }
  54. }
  55. // Fix for HUGE session timeouts.
  56. if ($cookie_lifetime > 99999999999) {
  57. $cookie_lifetime = 9999999999;
  58. }
  59. $inflector = new Inflector();
  60. $session_name = $inflector->hyphenize($config->get('system.session.name', 'grav_site')) . '-' . substr(md5(GRAV_ROOT), 0, 7);
  61. if ($is_admin && $config->get('system.session.split', true)) {
  62. $session_name .= '-admin';
  63. }
  64. // Define session service.
  65. $options = [
  66. 'name' => $session_name,
  67. 'cookie_lifetime' => $cookie_lifetime,
  68. 'cookie_path' => $cookie_path,
  69. 'cookie_domain' => $cookie_domain,
  70. 'cookie_secure' => $cookie_secure,
  71. 'cookie_httponly' => $cookie_httponly
  72. ] + (array) $config->get('system.session.options');
  73. $session = new Session($options);
  74. $session->setAutoStart($enabled);
  75. return $session;
  76. };
  77. // Define session message service.
  78. $container['messages'] = function ($c) {
  79. if (!isset($c['session']) || !$c['session']->isStarted()) {
  80. /** @var Debugger $debugger */
  81. $debugger = $c['debugger'];
  82. $debugger->addMessage('Inactive session: session messages may disappear', 'warming');
  83. return new Message;
  84. }
  85. /** @var Session $session */
  86. $session = $c['session'];
  87. if (!isset($session->messages)) {
  88. $session->messages = new Message;
  89. }
  90. return $session->messages;
  91. };
  92. }
  93. }