<?php
/**
* User: Quentin
* Date: 06/07/2020
* Time: 22:57
*/
namespace App\EventSubscriber;
use App\Entity\User;
use App\Event\RemoteAuthFailureEvent;
use App\Event\RemoteAuthSuccessEvent;
use App\Services\RemoteAuthService;
use App\Services\RemoteUserData;
use App\Services\RemoteUserDataService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\KernelInterface;
class RemoteAuthSubscriber implements EventSubscriberInterface {
/**
* @var EntityManagerInterface
*/
private $manager;
/**
* @var KernelInterface
*/
private $kernel;
protected $tgt;
/**
* @var RemoteAuthService
*/
private $authService;
/**
* @var RemoteUserDataService
*/
private $userDataService;
public function __construct(EntityManagerInterface $manager, KernelInterface $kernel, RemoteAuthService $authService, RemoteUserDataService $userDataService) {
$this->manager = $manager;
$this->kernel = $kernel;
$this->authService = $authService;
$this->userDataService = $userDataService;
}
public static function getSubscribedEvents() {
return [
RemoteAuthSuccessEvent::NAME => 'onAuthSuccess',
RemoteAuthFailureEvent::NAME => 'onAuthFailure',
KernelEvents::RESPONSE => 'onKernelResponse',
];
}
public function onAuthSuccess(RemoteAuthSuccessEvent $event) {
$userData = $event->getUserData();
$remoteId = $userData->remoteId;
$this->tgt = $userData->tgt;
/** @var User|null $user */
$user = $this->manager->getRepository(User::class)->findOneByRemoteId($remoteId);
if (is_null($user)) {
$user = $this->createUser($userData);
} else {
$this->userDataService->updateFromData($user, $userData, 'Synchro SQL (connexion)', $user->hasPendingRemoteSubscriptionRequest());
}
$this->manager->flush();
$lines = [
" ### " . date('r') . " / Success\n",
"User data: " . var_export($userData, true),
"User: " . $user->getId()
];
file_put_contents(
$this->getCurrentLogFilePath(),
"\n\n" . implode("\n", $lines),
FILE_APPEND
);
}
protected function createUser(RemoteUserData $userData): User {
$user = new User();
$this->userDataService->updateFromData($user, $userData, 'Synchro SQL (connexion)');
$this->manager->persist($user);
return $user;
}
protected function getCurrentLogFilePath(): string {
$directory = $this->kernel->getLogDir() . "/" . $this->kernel->getEnvironment() . "/" . date('Y') . "-" . date('m') . "/";
if (!is_dir($directory)) {
mkdir($directory, 0777, true);
}
return $directory . date('d') . "-cas.log";
}
public function onAuthFailure(RemoteAuthFailureEvent $event) {
$eventData = $event->getData();
unset($eventData['postFields']['password']);
$lines = [
" ### " . date('r') . " / Failure (" . $event->getReason() . ")\n",
"Debug data: " . var_export($eventData, true)
];
file_put_contents(
$this->getCurrentLogFilePath(),
"\n\n" . implode("\n", $lines),
FILE_APPEND
);
}
public function onKernelResponse(ResponseEvent $event) {
if (is_null($this->tgt)) {
return;
}
$this->authService->setCookie($event->getResponse(), $this->tgt);
}
}