src/EventSubscriber/RemoteAuthSubscriber.php line 62

Open in your IDE?
  1. <?php
  2. /**
  3.  * User: Quentin
  4.  * Date: 06/07/2020
  5.  * Time: 22:57
  6.  */
  7. namespace App\EventSubscriber;
  8. use App\Entity\User;
  9. use App\Event\RemoteAuthFailureEvent;
  10. use App\Event\RemoteAuthSuccessEvent;
  11. use App\Services\RemoteAuthService;
  12. use App\Services\RemoteUserData;
  13. use App\Services\RemoteUserDataService;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. use Symfony\Component\HttpFoundation\Cookie;
  17. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  18. use Symfony\Component\HttpKernel\KernelEvents;
  19. use Symfony\Component\HttpKernel\KernelInterface;
  20. class RemoteAuthSubscriber implements EventSubscriberInterface {
  21.     /**
  22.      * @var EntityManagerInterface
  23.      */
  24.     private $manager;
  25.     /**
  26.      * @var KernelInterface
  27.      */
  28.     private $kernel;
  29.     
  30.     protected $tgt;
  31.     
  32.     /**
  33.      * @var RemoteAuthService
  34.      */
  35.     private $authService;
  36.     
  37.     /**
  38.      * @var RemoteUserDataService
  39.      */
  40.     private $userDataService;
  41.     public function __construct(EntityManagerInterface $managerKernelInterface $kernelRemoteAuthService $authServiceRemoteUserDataService $userDataService) {
  42.         $this->manager $manager;
  43.         $this->kernel $kernel;
  44.         $this->authService $authService;
  45.         $this->userDataService $userDataService;
  46.     }
  47.     public static function getSubscribedEvents() {
  48.         return [
  49.             RemoteAuthSuccessEvent::NAME => 'onAuthSuccess',
  50.             RemoteAuthFailureEvent::NAME => 'onAuthFailure',
  51.             KernelEvents::RESPONSE => 'onKernelResponse',
  52.         ];
  53.     }
  54.     public function onAuthSuccess(RemoteAuthSuccessEvent $event) {
  55.         $userData $event->getUserData();
  56.         $remoteId $userData->remoteId;
  57.         $this->tgt $userData->tgt;
  58.         /** @var User|null $user */
  59.         $user $this->manager->getRepository(User::class)->findOneByRemoteId($remoteId);
  60.         if (is_null($user)) {
  61.             $user $this->createUser($userData);
  62.         } else {
  63.             $this->userDataService->updateFromData($user$userData'Synchro SQL (connexion)'$user->hasPendingRemoteSubscriptionRequest());
  64.         }
  65.         $this->manager->flush();
  66.         $lines = [
  67.             " ### " date('r') . " / Success\n",
  68.             "User data: " var_export($userDatatrue),
  69.             "User: " $user->getId()
  70.         ];
  71.         file_put_contents(
  72.             $this->getCurrentLogFilePath(),
  73.             "\n\n" implode("\n"$lines),
  74.             FILE_APPEND
  75.         );
  76.     }
  77.     protected function createUser(RemoteUserData $userData): User {
  78.         $user = new User();
  79.         $this->userDataService->updateFromData($user$userData'Synchro SQL (connexion)');
  80.         $this->manager->persist($user);
  81.         return $user;
  82.     }
  83.     protected function getCurrentLogFilePath(): string {
  84.         $directory $this->kernel->getLogDir() . "/" $this->kernel->getEnvironment() . "/" date('Y') . "-" date('m') . "/";
  85.         if (!is_dir($directory)) {
  86.             mkdir($directory0777true);
  87.         }
  88.         return $directory date('d') . "-cas.log";
  89.     }
  90.     public function onAuthFailure(RemoteAuthFailureEvent $event) {
  91.         $eventData $event->getData();
  92.         unset($eventData['postFields']['password']);
  93.         
  94.         $lines = [
  95.             " ### " date('r') . " / Failure (" $event->getReason() . ")\n",
  96.             "Debug data: " var_export($eventDatatrue)
  97.         ];
  98.         file_put_contents(
  99.             $this->getCurrentLogFilePath(),
  100.             "\n\n" implode("\n"$lines),
  101.             FILE_APPEND
  102.         );
  103.     }
  104.     
  105.     public function onKernelResponse(ResponseEvent $event) {
  106.         if (is_null($this->tgt)) {
  107.             return;
  108.         }
  109.         $this->authService->setCookie($event->getResponse(), $this->tgt);
  110.     }
  111. }