diff --git a/Controller/TosController.php b/Controller/TosController.php new file mode 100644 index 0000000..f98227f --- /dev/null +++ b/Controller/TosController.php @@ -0,0 +1,55 @@ +getUser(); + $em = $this->getDoctrine()->getManagerForClass(UserTos::class); + + $userTos = $em->find(UserTos::class, $user); + if (!$userTos) { + $userTos = new UserTos($user); + $em->persist($userTos); + } + + $tosUrl = $this->container->getParameter('vierbergenlars_tos.tos_url'); + + $formBuilder = $this->createFormBuilder(); + $formBuilder->add('vl_tos', AcceptTosType::class, [ + 'url' => $tosUrl + ]); + + $formBuilder->add('submit', SubmitType::class, [ + 'label' => 'Submit' + ]); + + $form = $formBuilder->getForm(); + + $form->handleRequest($request); + + if ($form->isValid()) { + $userTos->setAcceptedVersion($this->container->getParameter('vierbergenlars_tos.tos_version')); + $em->flush(); + return $this->redirectToRoute('user_profile'); + } + + return [ + 'form' => $form, + 'tos_url' => $tosUrl + ]; + } +} \ No newline at end of file diff --git a/EventListener/RegistrationListener.php b/EventListener/RegistrationListener.php deleted file mode 100644 index b0cf69d..0000000 --- a/EventListener/RegistrationListener.php +++ /dev/null @@ -1,75 +0,0 @@ - [ - 'onBuildForm', - -200 - ], - RegistrationEvents::HANDLE_FORM => [ - 'onHandleForm', - -20 // After persisting user - ] - ]; - } - - public function __construct($tosUrl, $tosVersion, EntityManagerInterface $em) - { - $this->tosUrl = $tosUrl; - $this->tosVersion = $tosVersion; - $this->em = $em; - } - - public function onBuildForm(RegistrationFormEvent $event) - { - $event->getFormBuilder()->add('vl_tos_accept', CheckboxType::class, [ - 'label' => 'I accept the terms of service', - 'mapped' => false, - 'attr' => [ - 'align_with_widget' => true - ], - 'constraints' => [ - new IsTrue([ - 'message' => 'You must accept the terms of service.' - ]) - ] - ]); - } - - public function onHandleForm(RegistrationHandleEvent $event) - { - if ($event->getForm() - ->get('vl_tos_accept') - ->getData()) { - $user = $event->getForm()->getData(); - /* @var $user \App\Entity\User */ - $tosUser = new UserTos($user); - $tosUser->setAcceptedVersion($this->tosVersion); - $this->em->persist($tosUser); - } - } -} \ No newline at end of file diff --git a/EventListener/TosListener.php b/EventListener/TosListener.php new file mode 100644 index 0000000..2914feb --- /dev/null +++ b/EventListener/TosListener.php @@ -0,0 +1,122 @@ + [ + 'onBuildForm', + -200 + ], + RegistrationEvents::HANDLE_FORM => [ + 'onHandleForm', + -20 // After persisting user + ], + KernelEvents::REQUEST => 'onKernelRequest' + ]; + } + + public function __construct($tosUrl, $tosVersion, EntityManagerInterface $em, TokenStorageInterface $tokenStorage, UrlGeneratorInterface $urlGenerator) + { + $this->tosUrl = $tosUrl; + $this->tosVersion = $tosVersion; + $this->em = $em; + $this->tokenStorage = $tokenStorage; + $this->urlGenerator = $urlGenerator; + } + + public function onBuildForm(RegistrationFormEvent $event) + { + $event->getFormBuilder()->add('vl_tos', AcceptTosType::class, [ + 'url' => $this->tosUrl, + 'mapped' => false + ]); + } + + public function onHandleForm(RegistrationHandleEvent $event) + { + if ($event->getForm() + ->get('vl_tos') + ->getData()['accept']) { + $user = $event->getForm()->getData(); + /* @var $user \App\Entity\User */ + $tosUser = new UserTos($user); + $tosUser->setAcceptedVersion($this->tosVersion); + $this->em->persist($tosUser); + } + } + + public function onKernelRequest(GetResponseEvent $event) + { + if (!$event->isMasterRequest()) + return; + if (!($token = $this->tokenStorage->getToken())) + return; + if (!($user = $token->getUser())) + return; + if (!($user instanceof User)) + return; + if ($token->hasAttribute('vl_tos_accept_ok')) + return; + $userTos = $this->em->find(UserTos::class, $user); + + if ($userTos && $userTos->getAcceptedVersion() >= $this->tosVersion) { + $token->setAttribute('vl_tos_accept_ok', true); + return; + } + + if ($event->getRequest()->getRequestFormat() !== 'html') { + throw new AccessDeniedHttpException('You need to accept the latest version of the terms of service.'); + } + + switch ($event->getRequest()->attributes->get('_route')) { + case 'vl_tos_accept': + break; + default: + $response = RedirectResponse::create($this->urlGenerator->generate('vl_tos_accept')); + $event->setResponse($response); + } + } +} \ No newline at end of file diff --git a/Form/AcceptTosType.php b/Form/AcceptTosType.php new file mode 100644 index 0000000..cd5c2fa --- /dev/null +++ b/Form/AcceptTosType.php @@ -0,0 +1,39 @@ +add('accept', CheckboxType::class, [ + 'label' => 'I accept the terms of service', + 'attr' => [ + 'align_with_widget' => true + ], + 'constraints' => [ + new IsTrue([ + 'message' => 'You must accept the terms of service.' + ]) + ] + ]); + } + + /** + * + * {@inheritdoc} + * @see \Symfony\Component\Form\AbstractType::configureOptions() + */ + public function configureOptions(\Symfony\Component\OptionsResolver\OptionsResolver $resolver) + { + $resolver->setDefined('url') + ->setRequired('url') + ->addAllowedTypes('url', 'string') + ->setDefault('label', false); + } +} \ No newline at end of file diff --git a/Resources/config/routing.yml b/Resources/config/routing.yml new file mode 100644 index 0000000..656e162 --- /dev/null +++ b/Resources/config/routing.yml @@ -0,0 +1,4 @@ +vl_tos_accept: + path: /usr/tos/accept + defaults: + _controller: AuthserverTosBundle:Tos:accept \ No newline at end of file diff --git a/Resources/config/services.xml b/Resources/config/services.xml index 47071bd..0a6aa70 100644 --- a/Resources/config/services.xml +++ b/Resources/config/services.xml @@ -19,10 +19,12 @@ 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"> - + %vierbergenlars_tos.tos_url% %vierbergenlars_tos.tos_version% + + diff --git a/Resources/views/Tos/accept.html.twig b/Resources/views/Tos/accept.html.twig new file mode 100644 index 0000000..a5549a0 --- /dev/null +++ b/Resources/views/Tos/accept.html.twig @@ -0,0 +1,16 @@ +{% extends '::base.html.twig' %} +{% block body %} +
+
+
+
Our terms of service have been updated.
You must accept these terms to be able to continue using the application.
+
+
+ +
+
+ {{ form(form, {'style': 'horizontal'}) }} +
+
+
+{% endblock %} \ No newline at end of file