custom/plugins/IwvTwoFactorAuthentication/src/Subscriber/UserEntitySubscriber.php line 79

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Iwv\IwvTwoFactorAuthentication\Subscriber;
  4. use Shopware\Core\Checkout\Customer\CustomerEvents;
  5. use Shopware\Core\System\User\UserEvents;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
  8. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. class UserEntitySubscriber implements EventSubscriberInterface
  12. {
  13.     /** @var EntityRepositoryInterface */
  14.     private $userRepository;
  15.     /** @var EntityRepositoryInterface */
  16.     private $customerRepository;
  17.     public function __construct(
  18.         EntityRepositoryInterface $userRepository,
  19.         EntityRepositoryInterface $customerRepository
  20.     ) {
  21.         $this->userRepository $userRepository;
  22.         $this->customerRepository $customerRepository;
  23.     }
  24.     public static function getSubscribedEvents()
  25.     {
  26.         return [
  27.             UserEvents::USER_WRITTEN_EVENT => 'onUserWrittenEvent',
  28.             CustomerEvents::CUSTOMER_WRITTEN_EVENT => 'onCustomerWrittenEvent',
  29.         ];
  30.     }
  31.     public function onUserWrittenEvent(EntityWrittenEvent $event): void
  32.     {
  33.         $payloads $event->getPayloads();
  34.         /** @var \Shopware\Core\System\User\UserEntity $userDB */
  35.         $updateUsers = [];
  36.         $activations = [];
  37.         $ids array_filter(array_map(fn($payload) => ($payload['id'] ?? ''), $payloads));
  38.         if ($ids) {
  39.             foreach ($this->userRepository->search(
  40.                 (new Criteria())->addFilter(new EqualsAnyFilter('id'$ids)),
  41.                 $event->getContext()
  42.             ) as $userDB) {
  43.                 $customFields = (array) $userDB->getCustomFields();
  44.                 if (array_key_exists('iwvTwoFactor'$customFields)) {
  45.                     if (empty($customFields['iwvTwoFactor'])) {
  46.                         unset($customFields['iwvTwoFactor']);
  47.                         unset($customFields['iwvTwoFactorCookie']);
  48.                         unset($customFields['iwvTwoFactorSession']);
  49.                         $updateUsers[] = [
  50.                             'id' => $userDB->getId(),
  51.                             'customFields' => $customFields
  52.                         ];
  53.                     } elseif (!array_key_exists('iwvTwoFactorCookie'$customFields)) {
  54.                         $customFields['iwvTwoFactorCookie'] = bin2hex(random_bytes(25));
  55.                         $updateUsers[] = [
  56.                             'id' => $userDB->getId(),
  57.                             'customFields' => $customFields
  58.                         ];
  59.                     }
  60.                 }
  61.                 if (!array_key_exists('iwvTwoFactor'$customFields) || !$customFields) {
  62.                     $customFields['iwvTwoFactor']['emailAuth']['status'] = 'active';
  63.                    
  64.                     $activations[] = [
  65.                         'id' => $userDB->getId(),
  66.                         'customFields' => $customFields
  67.                     ];
  68.                 }
  69.             }
  70.             if ($activations) {
  71.                 $this->userRepository->update($activations$event->getContext());
  72.             }
  73.             if ($updateUsers) {
  74.                 $this->userRepository->update($updateUsers$event->getContext());
  75.             }
  76.         }
  77.     }
  78.     public function onCustomerWrittenEvent(EntityWrittenEvent $event): void
  79.     {
  80.         $payloads $event->getPayloads();
  81.         /** @var \Shopware\Core\Checkout\Customer\CustomerEntity $userDB */
  82.         $updateCustomers = [];
  83.         $ids array_map(fn($payload) => $payload['id'] ?? null$payloads);
  84.         $ids array_filter($ids, fn($id) => $id !== null);
  85.         if (!empty($ids)) {
  86.             $criteria = new Criteria();
  87.             $criteria->addFilter(new EqualsAnyFilter('id'$ids));
  88.             foreach ($this->customerRepository->search($criteria$event->getContext()) as $userDB) {
  89.                 $customFields = (array) $userDB->getCustomFields();
  90.                 if (array_key_exists('iwvTwoFactor'$customFields)) {
  91.                     if (empty($customFields['iwvTwoFactor'])) {
  92.                         unset($customFields['iwvTwoFactor']);
  93.                         unset($customFields['iwvTwoFactorCookie']);
  94.                         unset($customFields['iwvTwoFactorSession']);
  95.                         $updateCustomers[] = [
  96.                             'id' => $userDB->getId(),
  97.                             'customFields' => $customFields
  98.                         ];
  99.                     } elseif (!array_key_exists('iwvTwoFactorCookie'$customFields)) {
  100.                         $customFields['iwvTwoFactorCookie'] = bin2hex(random_bytes(25));
  101.                         $updateCustomers[] = [
  102.                             'id' => $userDB->getId(),
  103.                             'customFields' => $customFields
  104.                         ];
  105.                     }
  106.                 }
  107.             }
  108.         }
  109.         if ($updateCustomers) {
  110.             $this->customerRepository->update($updateCustomers$event->getContext());
  111.         }
  112.     }
  113. }