Passed
Push — master ( 7a2782...032b3c )
by Christian
11:03
created

customerCredentialsChanged()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php declare(strict_types=1);
2
3
namespace Shopware\Core\Checkout\Customer\Subscriber;
4
5
use Shopware\Core\Checkout\Customer\CustomerEvents;
6
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityDeletedEvent;
7
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
8
use Shopware\Core\Framework\Feature;
9
use Shopware\Core\PlatformRequest;
10
use Shopware\Core\System\SalesChannel\Context\SalesChannelContextPersister;
11
use Shopware\Core\System\SalesChannel\SalesChannelContext;
12
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
13
use Symfony\Component\HttpFoundation\RequestStack;
14
15
class CustomerTokenSubscriber implements EventSubscriberInterface
16
{
17
    /**
18
     * @var SalesChannelContextPersister
19
     */
20
    private $contextPersister;
21
22
    /**
23
     * @var RequestStack
24
     */
25
    private $requestStack;
26
27
    public function __construct(
28
        SalesChannelContextPersister $contextPersister,
29
        RequestStack $requestStack
30
    ) {
31
        $this->contextPersister = $contextPersister;
32
        $this->requestStack = $requestStack;
33
    }
34
35
    public static function getSubscribedEvents()
36
    {
37
        return [
38
            CustomerEvents::CUSTOMER_WRITTEN_EVENT => 'onCustomerWritten',
39
            CustomerEvents::CUSTOMER_DELETED_EVENT => 'onCustomerDeleted',
40
        ];
41
    }
42
43
    public function onCustomerWritten(EntityWrittenEvent $event): void
44
    {
45
        $master = $this->requestStack->getMasterRequest();
46
47
        if (!$master) {
48
            return;
49
        }
50
51
        if (!$master->attributes->has(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT)) {
52
            return;
53
        }
54
55
        /** @var SalesChannelContext $context */
56
        $context = $master->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);
57
        $token = $context->getToken();
58
59
        $payloads = $event->getPayloads();
60
61
        foreach ($payloads as $payload) {
62
            if ($this->customerCredentialsChanged($payload)) {
63
                if (Feature::isActive('FEATURE_NEXT_10058')) {
64
                    $newToken = $this->contextPersister->replace($token, $context);
65
66
                    $context->assign([
67
                        'token' => $newToken,
68
                    ]);
69
70
                    if (!$master->hasSession()) {
71
                        return;
72
                    }
73
74
                    $session = $master->getSession();
75
                    $session->migrate();
76
                    $session->set('sessionId', $session->getId());
77
78
                    $session->set(PlatformRequest::HEADER_CONTEXT_TOKEN, $newToken);
79
                    $master->headers->set(PlatformRequest::HEADER_CONTEXT_TOKEN, $newToken);
80
81
                    return;
82
                }
83
84
                $this->contextPersister->revokeAllCustomerTokens($payload['id'], $token);
85
            }
86
        }
87
    }
88
89
    public function onCustomerDeleted(EntityDeletedEvent $event): void
90
    {
91
        $master = $this->requestStack->getMasterRequest();
92
93
        if (!$master) {
94
            return;
95
        }
96
97
        $customerIds = $event->getIds();
98
99
        foreach ($customerIds as $customerId) {
100
            $this->contextPersister->revokeAllCustomerTokens($customerId);
101
        }
102
    }
103
104
    private function customerCredentialsChanged(array $payload): bool
105
    {
106
        return isset($payload['password']);
107
    }
108
}
109