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">