/**
* Registers the service provider with a DI container.
*
* @param Container $container The DI container.
*
* @return void
*
* @since 4.0.0
*/
public function register(Container $container)
{
$container->share('session.web.administrator', function (Container $container) {
/** @var Registry $config */
$config = $container->get('config');
$app = Factory::getApplication();
// Generate a session name.
$name = ApplicationHelper::getHash($config->get('session_name', AdministratorApplication::class));
// Calculate the session lifetime.
$lifetime = $config->get('lifetime') ? $config->get('lifetime') * 60 : 900;
// Initialize the options for the Session object.
$options = ['name' => $name, 'expire' => $lifetime];
if ($config->get('force_ssl') >= 1) {
$options['force_ssl'] = true;
}
$handler = $container->get('session.factory')->createSessionHandler($options);
if (!$container->has('session.handler')) {
$this->registerSessionHandlerAsService($container, $handler);
}
return $this->buildSession(new JoomlaStorage($app->input, $handler, $options), $app, $container->get(DispatcherInterface::class), $options);
}, true);
$container->share('session.web.installation', function (Container $container) {
/** @var Registry $config */
$config = $container->get('config');
$app = Factory::getApplication();
/**
* Session handler for the session is always filesystem so it doesn't flip to the database after
* configuration.php has been written to
*/
$config->set('session_handler', 'filesystem');
/**
* Generate a session name - unlike all the other apps we don't have either a secret or a session name
* (that's not the app name) until we complete installation which then leads to us dropping things like
* language preferences after installation as the app refreshes.
*/
$name = md5(serialize(JPATH_ROOT . InstallationApplication::class));
// Calculate the session lifetime.
$lifetime = $config->get('lifetime') ? $config->get('lifetime') * 60 : 900;
// Initialize the options for the Session object.
$options = ['name' => $name, 'expire' => $lifetime];
$handler = $container->get('session.factory')->createSessionHandler($options);
if (!$container->has('session.handler')) {
$this->registerSessionHandlerAsService($container, $handler);
}
return $this->buildSession(new JoomlaStorage($app->input, $handler), $app, $container->get(DispatcherInterface::class), $options);
}, true);
$container->share('session.web.site', function (Container $container) {
/** @var Registry $config */
$config = $container->get('config');
$app = Factory::getApplication();
// Generate a session name.
$name = ApplicationHelper::getHash($config->get('session_name', SiteApplication::class));
// Calculate the session lifetime.
$lifetime = $config->get('lifetime') ? $config->get('lifetime') * 60 : 900;
// Initialize the options for the Session object.
$options = ['name' => $name, 'expire' => $lifetime];
if ($config->get('force_ssl') == 2) {
$options['force_ssl'] = true;
}
$handler = $container->get('session.factory')->createSessionHandler($options);
if (!$container->has('session.handler')) {
$this->registerSessionHandlerAsService($container, $handler);
}
return $this->buildSession(new JoomlaStorage($app->input, $handler, $options), $app, $container->get(DispatcherInterface::class), $options);
}, true);
$container->share('session.cli', function (Container $container) {
/** @var Registry $config */
$config = $container->get('config');
$app = Factory::getApplication();
// Generate a session name.
$name = ApplicationHelper::getHash($config->get('session_name', ConsoleApplication::class));
// Calculate the session lifetime.
$lifetime = $config->get('lifetime') ? $config->get('lifetime') * 60 : 900;
// Initialize the options for the Session object.
$options = ['name' => $name, 'expire' => $lifetime];
// Unlike the web apps, we will only toggle the force SSL setting based on it being enabled and not based on client
if ($config->get('force_ssl') >= 1) {
$options['force_ssl'] = true;
}
$handler = $container->get('session.factory')->createSessionHandler($options);
if (!$container->has('session.handler')) {
$this->registerSessionHandlerAsService($container, $handler);
}
return $this->buildSession(new RuntimeStorage(), $app, $container->get(DispatcherInterface::class), $options);
}, true);
$container->alias(SessionFactory::class, 'session.factory')->share('session.factory', function (Container $container) {
$factory = new SessionFactory();
$factory->setContainer($container);
return $factory;
}, true);
$container->alias(SessionManager::class, 'session.manager')->share('session.manager', function (Container $container) {
if (!$container->has('session.handler')) {
throw new DependencyResolutionException('The "session.handler" service has not been created, make sure you have created the "session" service first.');
}
return new SessionManager($container->get('session.handler'));
}, true);
$container->alias(MetadataManager::class, 'session.metadata_manager')->share('session.metadata_manager', function (Container $container) {
/*
* Normally we should inject the application as a dependency via $container->get() however there is not
* a 'app' or CMSApplicationInterface::class key for the primary application of the request so we need to
* rely on the application having been injected to the global Factory otherwise we cannot build the service
*/
if (!Factory::$application) {
throw new DependencyResolutionException(sprintf('Creating the "session.metadata_manager" service requires %s::$application be initialised.', Factory::class));
}
return new MetadataManager(Factory::$application, $container->get(DatabaseInterface::class));
}, true);
$container->alias(MetadataManagerListener::class, 'session.event_listener.metadata_manager')->share('session.event_listener.metadata_manager', function (Container $container) {
return new MetadataManagerListener($container->get(MetadataManager::class), $container->get('config'));
}, true);
$listener = new LazyServiceEventListener($container, 'session.event_listener.metadata_manager', 'onAfterSessionStart');
/** @var DispatcherInterface $dispatcher */
$dispatcher = $container->get(DispatcherInterface::class);
$dispatcher->addListener(SessionEvents::START, $listener);
}