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

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.         $ids array_filter(array_map(fn($payload) => ($payload['id'] ?? ''), $payloads));
  37.         if ($ids) {
  38.             foreach ($this->userRepository->search(
  39.                 (new Criteria())->addFilter(new EqualsAnyFilter('id'$ids)),
  40.                 $event->getContext()
  41.             ) as $userDB) {
  42.                 $customFields = (array) $userDB->getCustomFields();
  43.                 if (array_key_exists('iwvTwoFactor'$customFields)) {
  44.                     if (empty($customFields['iwvTwoFactor'])) {
  45.                         unset($customFields['iwvTwoFactor']);
  46.                         unset($customFields['iwvTwoFactorCookie']);
  47.                         $updateUsers[] = [
  48.                             'id' => $userDB->getId(),
  49.                             'customFields' => $customFields
  50.                         ];
  51.                     } elseif (!array_key_exists('iwvTwoFactorCookie'$customFields)) {
  52.                         $customFields['iwvTwoFactorCookie'] = bin2hex(random_bytes(25));
  53.                         $updateUsers[] = [
  54.                             'id' => $userDB->getId(),
  55.                             'customFields' => $customFields
  56.                         ];
  57.                     }
  58.                 }
  59.             }
  60.             if ($updateUsers) {
  61.                 $this->userRepository->update($updateUsers$event->getContext());
  62.             }
  63.         }
  64.     }
  65.     public function onCustomerWrittenEvent(EntityWrittenEvent $event): void
  66.     {
  67.         $payloads $event->getPayloads();
  68.         /** @var \Shopware\Core\Checkout\Customer\CustomerEntity $userDB */
  69.         $updateCustomers = [];
  70.         $ids array_map(fn($payload) => $payload['id'] ?? null$payloads);
  71.         $ids array_filter($ids, fn($id) => $id !== null);
  72.         if (!empty($ids)) {
  73.             $criteria = new Criteria();
  74.             $criteria->addFilter(new EqualsAnyFilter('id'$ids));
  75.             foreach ($this->customerRepository->search($criteria$event->getContext()) as $userDB) {
  76.                 $customFields = (array) $userDB->getCustomFields();
  77.                 if (array_key_exists('iwvTwoFactor'$customFields)) {
  78.                     if (empty($customFields['iwvTwoFactor'])) {
  79.                         unset($customFields['iwvTwoFactor']);
  80.                         unset($customFields['iwvTwoFactorCookie']);
  81.                         $updateCustomers[] = [
  82.                             'id' => $userDB->getId(),
  83.                             'customFields' => $customFields
  84.                         ];
  85.                     } elseif (!array_key_exists('iwvTwoFactorCookie'$customFields)) {
  86.                         $customFields['iwvTwoFactorCookie'] = bin2hex(random_bytes(25));
  87.                         $updateCustomers[] = [
  88.                             'id' => $userDB->getId(),
  89.                             'customFields' => $customFields
  90.                         ];
  91.                     }
  92.                 }
  93.             }
  94.         }
  95.         if ($updateCustomers) {
  96.             $this->customerRepository->update($updateCustomers$event->getContext());
  97.         }
  98.     }
  99. }