. */ namespace vierbergenlars\AuthserverExternalAccountBundle\EventListener; use Registration\Event\RegistrationHandleEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Registration\RegistrationEvents; use Registration\Event\RegistrationFormEvent; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; use vierbergenlars\AuthserverExternalAccountBundle\Entity\TemporaryUser; use Doctrine\ORM\EntityManagerInterface; class RegistrationHandlerListener implements EventSubscriberInterface { /** * * @var TokenStorageInterface */ private $tokenStorage; /** * * @var EntityManagerInterface */ private $em; public static function getSubscribedEvents() { return [ RegistrationEvents::BUILD_FORM => [ [ 'onBuildFormSetPasswordEnabled', 10 ], [ 'onBuildFormRemovePasswordField', -20 ] ], RegistrationEvents::HANDLE_FORM => [ [ 'onHandleFormConnectExternal', 0 ], [ 'onHandleFormLogoutExternal', -250 ] ] ]; } public function __construct(EntityManagerInterface $em, TokenStorageInterface $tokenStorage) { $this->em = $em; $this->tokenStorage = $tokenStorage; } private function getTemporaryUser() { $token = $this->tokenStorage->getToken(); if (!$token) return null; $user = $token->getUser(); if ($user instanceof TemporaryUser) return $user; return null; } public function onBuildFormSetPasswordEnabled(RegistrationFormEvent $event) { if ($user = $this->getTemporaryUser()) { $event->getFormBuilder() ->getData() ->setDisplayName($user->getDisplayName()) ->setPasswordEnabled(2); } } public function onBuildFormRemovePasswordField(RegistrationFormEvent $event) { if ($this->getTemporaryUser()) { switch ($event->getFormBuilder() ->getData() ->getPasswordEnabled()) { case 0: case 2: $event->getFormBuilder()->remove('password'); break; case 1: break; } } } public function onHandleFormConnectExternal(RegistrationHandleEvent $event) { if ($event->isFailed()) return; $user = $event->getForm()->getData(); if (!$user) return; /* @var $user User */ if ($temporaryUser = $this->getTemporaryUser()) { $temporaryUser->getExternalUser()->setUser($user); $this->em->persist($temporaryUser->getExternalUser()); } } public function onHandleFormLogoutExternal(RegistrationHandleEvent $event) { if ($event->isFailed()) return; if ($this->getTemporaryUser()) $this->tokenStorage->setToken(null); } }