From 8add8c919dd0609df0f530a2ad2296ce654c1682 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Thu, 26 Dec 2019 12:46:44 +0100 Subject: [PATCH] Allow to disable the google authenticator 2fa. --- src/Controller/UserController.php | 31 ++++++---- src/Form/TFAGoogleSettingsType.php | 77 +++++++++++++++++++++++++ src/Form/TFASettingsType.php | 42 -------------- templates/Users/_2fa_settings.html.twig | 67 +++++++++++---------- 4 files changed, 133 insertions(+), 84 deletions(-) create mode 100644 src/Form/TFAGoogleSettingsType.php delete mode 100644 src/Form/TFASettingsType.php diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php index 8985e16d..4f346981 100644 --- a/src/Controller/UserController.php +++ b/src/Controller/UserController.php @@ -25,7 +25,7 @@ use App\Entity\Attachments\AttachmentType; use App\Entity\Attachments\UserAttachment; use App\Entity\UserSystem\User; use App\Form\Permissions\PermissionsType; -use App\Form\TFASettingsType; +use App\Form\TFAGoogleSettingsType; use App\Form\UserAdminForm; use App\Form\UserSettingsType; use App\Services\EntityExporter; @@ -240,18 +240,26 @@ class UserController extends AdminPages\BaseAdminController } //Handle 2FA things - $tfa_form = $this->createForm(TFASettingsType::class, $user); - $tfa_form->handleRequest($request); - if (!$user->getGoogleAuthenticatorSecret()) { + $google_form = $this->createForm(TFAGoogleSettingsType::class, $user); + $google_enabled = $user->isGoogleAuthenticatorEnabled(); + if (!$form->isSubmitted() && !$google_enabled) { $user->setGoogleAuthenticatorSecret($googleAuthenticator->generateSecret()); - $tfa_form->setData($user); + $google_form->get('googleAuthenticatorSecret')->setData($user->getGoogleAuthenticatorSecret()); } + $google_form->handleRequest($request); - if ($tfa_form->isSubmitted() && $tfa_form->isValid()) { - //Save 2FA settings (save secrets) - $user->setGoogleAuthenticatorSecret($tfa_form->get('googleAuthenticatorSecret')->getData()); - $em->flush(); - $this->addFlash('success', 'user.settings.2fa.google.activated'); + if($google_form->isSubmitted() && $google_form->isValid()) { + if (!$google_enabled) { + //Save 2FA settings (save secrets) + $user->setGoogleAuthenticatorSecret($google_form->get('googleAuthenticatorSecret')->getData()); + $em->flush(); + $this->addFlash('success', 'user.settings.2fa.google.activated'); + } elseif ($google_enabled) { + //Remove secret to disable google authenticator + $user->setGoogleAuthenticatorSecret(null); + $em->flush(); + $this->addFlash('success', 'user.settings.2fa.google.disabled'); + } } @@ -264,8 +272,9 @@ class UserController extends AdminPages\BaseAdminController 'pw_form' => $pw_form->createView(), 'page_need_reload' => $page_need_reload, - 'tfa_form' => $tfa_form->createView(), + 'google_form' => $google_form->createView(), 'tfa_google' => [ + 'enabled' => $google_enabled, 'qrContent' => $googleAuthenticator->getQRContent($user), 'secret' => $user->getGoogleAuthenticatorSecret(), 'username' => $user->getGoogleAuthenticatorUsername() diff --git a/src/Form/TFAGoogleSettingsType.php b/src/Form/TFAGoogleSettingsType.php new file mode 100644 index 00000000..3b5362bf --- /dev/null +++ b/src/Form/TFAGoogleSettingsType.php @@ -0,0 +1,77 @@ +translator = $translator; + } + + public function buildForm(FormBuilderInterface $builder, array $options) + { + $builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) { + $form = $event->getForm(); + /** @var User $user */ + $user = $event->getData(); + + //Only show setup fields, when google authenticator is not enabled + if(!$user->isGoogleAuthenticatorEnabled()) { + $form->add( + 'google_confirmation', + TextType::class, + [ + 'mapped' => false, + 'attr' => ['maxlength' => '6', 'minlength' => '6', 'pattern' => '\d*', 'autocomplete' => 'off'], + 'constraints' => [new ValidGoogleAuthCode()] + ] + ); + + $form->add( + 'googleAuthenticatorSecret', + HiddenType::class, + [ + 'disabled' => false, + ] + ); + + $form->add('submit', SubmitType::class, [ + 'label' => $this->translator->trans('tfa_google.enable') + ]); + } else { + $form->add('submit', SubmitType::class, [ + 'label' => $this->translator->trans('tfa_google.disable'), + 'attr' => ['class' => 'btn-danger'] + ]); + } + }); + + //$builder->add('cancel', ResetType::class); + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults([ + 'data_class' => User::class, + ]); + } +} \ No newline at end of file diff --git a/src/Form/TFASettingsType.php b/src/Form/TFASettingsType.php deleted file mode 100644 index fa9da818..00000000 --- a/src/Form/TFASettingsType.php +++ /dev/null @@ -1,42 +0,0 @@ -add('google_confirmation', TextType::class, [ - 'mapped' => false, - 'attr' => ['maxlength' => '6', 'minlength' => '6', 'pattern' => '\d*', 'autocomplete' => 'off'], - 'constraints' => [new ValidGoogleAuthCode()] - ]); - - $builder->add('googleAuthenticatorSecret', HiddenType::class,[ - 'disabled' => false, - ]); - - - $builder->add('submit', SubmitType::class); - $builder->add('cancel', ResetType::class); - } - - public function configureOptions(OptionsResolver $resolver) - { - $resolver->setDefaults([ - 'data_class' => User::class, - ]); - } -} \ No newline at end of file diff --git a/templates/Users/_2fa_settings.html.twig b/templates/Users/_2fa_settings.html.twig index f24ec557..0ac1c6cd 100644 --- a/templates/Users/_2fa_settings.html.twig +++ b/templates/Users/_2fa_settings.html.twig @@ -4,7 +4,7 @@ {% trans %}user.settings.2fa_settings{% endtrans %}
- {{ form_start(tfa_form) }} +