vendor/sonata-project/user-bundle/src/Command/TwoStepVerificationCommand.php line 28

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4.  * This file is part of the Sonata Project package.
  5.  *
  6.  * (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
  7.  *
  8.  * For the full copyright and license information, please view the LICENSE
  9.  * file that was distributed with this source code.
  10.  */
  11. namespace Sonata\UserBundle\Command;
  12. use FOS\UserBundle\Model\UserManagerInterface;
  13. use Sonata\UserBundle\GoogleAuthenticator\Helper;
  14. use Sonata\UserBundle\Model\UserInterface;
  15. use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
  16. use Symfony\Component\Console\Input\InputArgument;
  17. use Symfony\Component\Console\Input\InputInterface;
  18. use Symfony\Component\Console\Input\InputOption;
  19. use Symfony\Component\Console\Output\OutputInterface;
  20. /**
  21.  * NEXT_MAJOR: stop extending ContainerAwareCommand.
  22.  */
  23. class TwoStepVerificationCommand extends ContainerAwareCommand
  24. {
  25.     /**
  26.      * @var ?Helper
  27.      */
  28.     private $helper;
  29.     /**
  30.      * @var ?UserManagerInterface
  31.      */
  32.     private $userManager;
  33.     /**
  34.      * NEXT_MAJOR: make $helper and $userManager mandatory (but still nullable).
  35.      */
  36.     public function __construct(
  37.         ?string $name,
  38.         ?Helper $helper null,
  39.         ?UserManagerInterface $userManager null
  40.     ) {
  41.         parent::__construct($name);
  42.         $this->helper $helper;
  43.         $this->userManager $userManager;
  44.     }
  45.     /**
  46.      * {@inheritdoc}
  47.      */
  48.     public function configure(): void
  49.     {
  50.         $this->setName('sonata:user:two-step-verification');
  51.         $this->addArgument(
  52.             'username',
  53.             InputArgument::REQUIRED,
  54.             'The username to protect with a two step verification process'
  55.         );
  56.         $this->addOption('reset'nullInputOption::VALUE_NONE'Reset the current two step verification token');
  57.         $this->setDescription(
  58.             'Generate a two step verification process to secure an access (Ideal for super admin protection)'
  59.         );
  60.     }
  61.     /**
  62.      * {@inheritdoc}
  63.      */
  64.     public function execute(InputInterface $inputOutputInterface $output): void
  65.     {
  66.         if (null === $this->helper && !$this->getContainer()->has('sonata.user.google.authenticator.provider')) {
  67.             throw new \RuntimeException('Two Step Verification process is not enabled');
  68.         }
  69.         if (null === $this->helper) {
  70.             @trigger_error(sprintf(
  71.                 'Not providing the $helper argument of "%s::__construct()" is deprecated since 4.3.0 and will no longer be possible in 5.0',
  72.                 __CLASS__
  73.             ), E_USER_DEPRECATED);
  74.             $helper $this->getContainer()->get('sonata.user.google.authenticator.provider');
  75.             \assert($helper instanceof Helper);
  76.             $this->helper $helper;
  77.         }
  78.         if (null === $this->userManager) {
  79.             @trigger_error(sprintf(
  80.                 'Not providing the $userManager argument of "%s::__construct()" is deprecated since 4.3.0 and will no longer be possible in 5.0',
  81.                 __CLASS__
  82.             ), E_USER_DEPRECATED);
  83.             $manager $this->getContainer()->get('fos_user.user_manager');
  84.             \assert($manager instanceof UserManagerInterface);
  85.             $this->userManager $manager;
  86.         }
  87.         $user $this->userManager->findUserByUsernameOrEmail($input->getArgument('username'));
  88.         \assert($user instanceof UserInterface);
  89.         if (!$user) {
  90.             throw new \RuntimeException(sprintf('Unable to find the username : %s'$input->getArgument('username')));
  91.         }
  92.         if (!$user->getTwoStepVerificationCode() || $input->getOption('reset')) {
  93.             $user->setTwoStepVerificationCode($this->helper->generateSecret());
  94.             $this->userManager->updateUser($user);
  95.         }
  96.         $output->writeln([
  97.             sprintf('<info>Username</info> : %s'$input->getArgument('username')),
  98.             sprintf('<info>Secret</info> : %s'$user->getTwoStepVerificationCode()),
  99.             sprintf('<info>Url</info> : %s'$this->helper->getUrl($user)),
  100.         ]);
  101.     }
  102. }