<?php
/******************************************************************************
* Copyright (c) Echo-numeric 2020-2023. *
******************************************************************************/
namespace App\Listener;
use App\Entity\User;
use App\Services\DTV\YamlConfig\YamlReader;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class CheckCguListener
{
private TokenStorageInterface $token;
private RouterInterface $router;
private EntityManagerInterface $em;
private YamlReader $yamlReader;
public function __construct(
TokenStorageInterface $token,
RouterInterface $router,
EntityManagerInterface $em,
YamlReader $yamlReader
) {
$this->token = $token;
$this->router = $router;
$this->em = $em;
$this->yamlReader = $yamlReader;
}
/**
* @param ResponseEvent $event
*
* @return void
*/
public function onKernelResponse( ResponseEvent $event )
{
$request = $event->getRequest();
// Dans Symfony, le type de requête "1" signifie généralement une requête principale
if ( $event->getRequestType() !== 1 ) {
return;
}
if ( $request->isXmlHttpRequest() ) {
return;
}
if ( !in_array(
$request->get( '_route' ),
[
'static_file_folder',
'static_project_file',
'front_common_css_custom',
'front_user_accept_cgu_first',
'front_user_accept_cgu_only',
],
) ) {
if ( NULL !== $this->token->getToken() ) {
$token = $this->token->getToken();
/** @var User $user */
$user = $this->token->getToken()->getUser();
if ($user->isDeveloper()){
return;
}
if ( $user instanceof User ) {
$this->updateUserLastActivity( $user );
// L'utilisateur est de type developer ou super-admin, on passe directement en actif
if ( $user->isDeveloper() ) {
if ( $user->getStatus() == 'cgu_pending' || $user->getCguAt() === NULL ) {
$user->setStatus( 'enabled' )
->setCguAt( new DateTime() )
;
$this->em->flush();
}
} // Sinon, on passe par la validation des CGU
elseif ( NULL === $user->getCguAt() || $user->getStatus() === 'cgu_pending' ) {
$event->setResponse(
new RedirectResponse(
$this->router->generate( 'front_user_accept_cgu_only' ),
),
);
}
// Code commenté suite demande daikin
/*
// L'utilisateur est en train d'impersonner un autre utilisateur, donc on ne fait rien
if ( $token && in_array( 'ROLE_PREVIOUS_ADMIN', $token->getRoleNames() ) ) {
return;
}
// Si le password de l'utilisateur est expiré, on le redirige vers la page de changement de mot de passe, sauf si on est déjà sur cette page
if ( $request->get( '_route' ) !== 'front_user_password' ) {
$now = new DateTime();
$passwordUpdatedAt = $user->getPasswordUpdatedAt()
?? ( new DateTime() )->modify( '-370 days' );
$date = $now->diff( $passwordUpdatedAt );
$global = $this->yamlReader->getGlobal();
$remainingPasswordValidityDays = $global[ 'login_security' ][ 'password_validity_days' ]
?? 365;
$rest = $remainingPasswordValidityDays - $date->days;
if ( $rest < 0 ) {
$event->setResponse(
new RedirectResponse(
$this->router->generate( 'front_user_password' ),
),
);
}
}
*/
// fin de code commenté suite demande daikin
}
}
}
}
/**
* Met à jour la date de dernière activité de l'utilisateur
*
* @param User $user Utilisateur
*
* @return void
*/
private function updateUserLastActivity( User $user ): void
{
// Si la dernière activité de l'utilisateur date de moins de 1H, on ne fait rien
$now = new DateTime();
$timestampDebut = $user->getLastActivity() ? $user->getLastActivity()->getTimestamp() : 0;
$timestampFin = $now->getTimestamp();
$diff = $timestampFin - $timestampDebut;
if ( $diff >= 3600 ) {
$user->setLastActivity( new DateTime() );
$this->em->flush();
}
}
}