Skip to content

Commit

Permalink
add last login refresh request event listener
Browse files Browse the repository at this point in the history
  • Loading branch information
alexander-schranz committed Mar 13, 2017
1 parent b459530 commit 2a4bb8a
Show file tree
Hide file tree
Showing 7 changed files with 139 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ class CommunityManagerCompilerPass implements CompilerPassInterface
*/
public function process(ContainerBuilder $container)
{
$config = $container->getParameter('sulu_community.config');
$webspacesConfig = $container->getParameter('sulu_community.webspaces');

foreach ($config[Configuration::WEBSPACES] as $webspaceKey => $webspaceConfig) {
foreach ($webspacesConfig as $webspaceKey => $webspaceConfig) {
// Set firewall by webspace key
if ($webspaceConfig[Configuration::FIREWALL] === null) {
$webspaceConfig[Configuration::FIREWALL] = $webspaceKey;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@ public function process(ContainerBuilder $container)
}

// Create Validator References
$config = $container->getParameter('sulu_community.config');
$webspacesConfig = $container->getParameter('sulu_community.webspaces');

foreach ($config[Configuration::WEBSPACES] as $webspaceKey => $webspaceConfig) {
foreach ($webspacesConfig as $webspaceKey => $webspaceConfig) {
// Get Completion Validator
$validatorId = $webspaceConfig[Configuration::TYPE_COMPLETION][Configuration::SERVICE];

Expand Down
10 changes: 10 additions & 0 deletions DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,10 @@ class Configuration implements ConfigurationInterface
const EMAIL_USER_TEMPLATE = 'user_template';
const DELETE_USER = 'delete_user';

// Other configurations
const LAST_LOGIN = 'last_login';
const REFRESH_INTERVAL = 'refresh_interval';

/**
* {@inheritdoc}
*/
Expand All @@ -79,6 +83,12 @@ public function getConfigTreeBuilder()

$rootNode
->children()
->arrayNode(self::LAST_LOGIN)
->addDefaultsIfNotSet()
->children()
->scalarNode(self::REFRESH_INTERVAL)->defaultValue(null)->end()
->end()
->end()
->arrayNode('webspaces')
->prototype('array')
->children()
Expand Down
12 changes: 11 additions & 1 deletion DependencyInjection/SuluCommunityExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,21 @@ public function load(array $configs, ContainerBuilder $container)
$configuration = new Configuration();
$config = $this->processConfiguration($configuration, $configs);

$container->setParameter('sulu_community.config', $config);
$container->setParameter('sulu_community.webspaces', $config[Configuration::WEBSPACES]);

$lastLoginRefreshInterval = $config[Configuration::LAST_LOGIN][Configuration::REFRESH_INTERVAL];
$container->setParameter(
'sulu_community.last_login.refresh_interval',
$lastLoginRefreshInterval
);

$loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
$loader->load('services.xml');
$loader->load('validator.xml');

if ($lastLoginRefreshInterval) {
$loader->load('last-login-refresh.xml');
}
}

/**
Expand Down
92 changes: 92 additions & 0 deletions EventListener/LastLoginListener.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
<?php

/*
* This file is part of Sulu.
*
* (c) MASSIVE ART WebServices GmbH
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/

namespace Sulu\Bundle\CommunityBundle\EventListener;

use Doctrine\ORM\EntityManager;
use Sulu\Bundle\SecurityBundle\Entity\BaseUser;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;

class LastLoginListener
{
/**
* @var TokenStorageInterface
*/
protected $tokenStorage;

/**
* @var EntityManager
*/
protected $entityManager;

/**
* @var int
*/
protected $interval;

/**
* LastLoginListener constructor.
*
* @param TokenStorageInterface $tokenStorage
* @param EntityManager $entityManager
* @param int $interval
*/
public function __construct(
TokenStorageInterface $tokenStorage,
EntityManager $entityManager,
$interval = null
) {
$this->tokenStorage = $tokenStorage;
$this->entityManager = $entityManager;
$this->interval = (int) $interval;
}

/**
* Update the last login in specific interval.
*
* @param FilterControllerEvent $event
*/
public function onCoreController(FilterControllerEvent $event)
{
if (!$event->isMasterRequest()) {
return;
}

if (!$this->interval) {
return;
}

// Check token authentication availability
if ($this->tokenStorage->getToken()) {
$user = $this->tokenStorage->getToken()->getUser();

if (($user instanceof BaseUser) && !($this->isActiveNow($user))) {
$user->setLastLogin(new \DateTime());
$this->entityManager->flush($user);
}
}
}

/**
* Check if user was active shortly.
*
* @param BaseUser $user
*
* @return bool
*/
public function isActiveNow(BaseUser $user)
{
$delay = new \DateTime($this->interval . ' minutes ago');

return $user->getLastLogin() > $delay;
}
}
15 changes: 15 additions & 0 deletions Resources/config/last-login-refresh.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<services>
<service id="sulu_community.event_listener.last_login" class="Sulu\Bundle\CommunityBundle\EventListener\LastLoginListener">
<argument type="service" id="security.token_storage" />
<argument type="service" id="doctrine.orm.entity_manager" />
<argument>%sulu_community.last_login.refresh_interval%</argument>

<tag name="kernel.event_listener" event="kernel.controller" method="onCoreController" />
<tag name="sulu.context" context="website" />
</service>
</services>
</container>
7 changes: 7 additions & 0 deletions UPGRADE.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# Upgrade

## 0.3.0

### Parameter `sulu_community.config` was removed

The whole config as parameter is not longer available the webspaces config
you can get over the `sulu_community.webspaces` parameter.

## 0.2.0

### Avatar title will use username instead of fullname
Expand Down

0 comments on commit 2a4bb8a

Please sign in to comment.