From 580351f518b7807523eb3a1be4bea7784e22b802 Mon Sep 17 00:00:00 2001 From: Svyatoslav Varpikhovsky Date: Thu, 8 Aug 2024 18:27:46 +0300 Subject: [PATCH] FRW-7668 Fixed agent validation during refresh user action. (#2484) FRW-7668 Fixed agent user validation during refresh user action. --- composer.json | 2 +- .../AgentPage/Controller/AgentController.php | 22 ++++++- .../Client/AgentPageToAgentClientBridge.php | 8 +++ .../AgentPageToAgentClientInterface.php | 5 ++ .../Plugin/Provider/AgentUserProvider.php | 24 +++++--- .../Subscriber/SwitchUserEventSubscriber.php | 58 +++++++++++++++++++ .../views/login/redirect-to-login.twig | 16 +++++ 7 files changed, 123 insertions(+), 12 deletions(-) create mode 100644 src/SprykerShop/Yves/AgentPage/Theme/default/views/login/redirect-to-login.twig diff --git a/composer.json b/composer.json index 0697893..b1509bd 100644 --- a/composer.json +++ b/composer.json @@ -10,7 +10,7 @@ "spryker-shop/customer-page-extension": "^1.2.0", "spryker-shop/shop-application": "^1.1.0", "spryker-shop/shop-ui": "^1.3.0", - "spryker/agent": "^1.4.0", + "spryker/agent": "^1.7.0", "spryker/application": "^3.9.0", "spryker/customer": "^7.10.0", "spryker/kernel": "^3.52.0", diff --git a/src/SprykerShop/Yves/AgentPage/Controller/AgentController.php b/src/SprykerShop/Yves/AgentPage/Controller/AgentController.php index 2b7cebe..cf78955 100644 --- a/src/SprykerShop/Yves/AgentPage/Controller/AgentController.php +++ b/src/SprykerShop/Yves/AgentPage/Controller/AgentController.php @@ -15,6 +15,11 @@ */ class AgentController extends AbstractController { + /** + * @var string + */ + protected const LOGIN_REDIRECT_URL = '/agent/login'; + /** * @return \Spryker\Yves\Kernel\View\View */ @@ -22,7 +27,7 @@ public function indexAction(): View { $viewData = $this->executeIndexAction(); - return $this->view($viewData, [], '@AgentPage/views/overview/overview.twig'); + return $this->view($viewData, [], $this->getTemplatePath()); } /** @@ -31,7 +36,20 @@ public function indexAction(): View protected function executeIndexAction(): array { return [ - 'agent' => $this->getFactory()->getAgentClient()->getAgent(), + 'agent' => $this->getFactory()->getAgentClient()->isLoggedIn() ? $this->getFactory()->getAgentClient()->getAgent() : null, + 'loginRedirectUrl' => static::LOGIN_REDIRECT_URL, ]; } + + /** + * @return string + */ + protected function getTemplatePath(): string + { + if ($this->getFactory()->getAgentClient()->isLoggedIn() === false) { + return '@AgentPage/views/login/redirect-to-login.twig'; + } + + return '@AgentPage/views/overview/overview.twig'; + } } diff --git a/src/SprykerShop/Yves/AgentPage/Dependency/Client/AgentPageToAgentClientBridge.php b/src/SprykerShop/Yves/AgentPage/Dependency/Client/AgentPageToAgentClientBridge.php index 41cfa7f..8af74c9 100644 --- a/src/SprykerShop/Yves/AgentPage/Dependency/Client/AgentPageToAgentClientBridge.php +++ b/src/SprykerShop/Yves/AgentPage/Dependency/Client/AgentPageToAgentClientBridge.php @@ -60,6 +60,14 @@ public function setAgent(UserTransfer $userTransfer): void $this->agentClient->setAgent($userTransfer); } + /** + * @return void + */ + public function invalidateAgentSession(): void + { + $this->agentClient->invalidateAgentSession(); + } + /** * @return void */ diff --git a/src/SprykerShop/Yves/AgentPage/Dependency/Client/AgentPageToAgentClientInterface.php b/src/SprykerShop/Yves/AgentPage/Dependency/Client/AgentPageToAgentClientInterface.php index efab069..c348334 100644 --- a/src/SprykerShop/Yves/AgentPage/Dependency/Client/AgentPageToAgentClientInterface.php +++ b/src/SprykerShop/Yves/AgentPage/Dependency/Client/AgentPageToAgentClientInterface.php @@ -35,6 +35,11 @@ public function getAgent(): UserTransfer; */ public function setAgent(UserTransfer $userTransfer): void; + /** + * @return void + */ + public function invalidateAgentSession(): void; + /** * @return void */ diff --git a/src/SprykerShop/Yves/AgentPage/Plugin/Provider/AgentUserProvider.php b/src/SprykerShop/Yves/AgentPage/Plugin/Provider/AgentUserProvider.php index c1eb2e9..a8c3b57 100644 --- a/src/SprykerShop/Yves/AgentPage/Plugin/Provider/AgentUserProvider.php +++ b/src/SprykerShop/Yves/AgentPage/Plugin/Provider/AgentUserProvider.php @@ -66,9 +66,13 @@ public function refreshUser(UserInterface $user) return $user; } - $userTransfer = $this->getUserTransfer($user); + $agentUserTransfer = $this->getUserTransfer($user); - return $this->getFactory()->createSecurityUser($userTransfer); + if ($agentUserTransfer === null) { + return $user; + } + + return $this->getFactory()->createSecurityUser($agentUserTransfer); } /** @@ -109,15 +113,17 @@ protected function findUserByUsername(string $username): ?UserTransfer */ protected function getUserTransfer(UserInterface $user): ?UserTransfer { - if ($this->getFactory()->getAgentClient()->isLoggedIn() === false) { - return $this->findUserByUsername( - $this->getUserIdentifier($user), - ); + $userTransfer = $this->findUserByUsername( + $this->getUserIdentifier($user), + ); + + if ($userTransfer === null) { + $this->getFactory() + ->getAgentClient() + ->invalidateAgentSession(); } - return $this->getFactory() - ->getAgentClient() - ->getAgent(); + return $userTransfer; } /** diff --git a/src/SprykerShop/Yves/AgentPage/Plugin/Subscriber/SwitchUserEventSubscriber.php b/src/SprykerShop/Yves/AgentPage/Plugin/Subscriber/SwitchUserEventSubscriber.php index 75afcb6..077a535 100644 --- a/src/SprykerShop/Yves/AgentPage/Plugin/Subscriber/SwitchUserEventSubscriber.php +++ b/src/SprykerShop/Yves/AgentPage/Plugin/Subscriber/SwitchUserEventSubscriber.php @@ -8,10 +8,12 @@ namespace SprykerShop\Yves\AgentPage\Plugin\Subscriber; use Generated\Shared\Transfer\QuoteTransfer; +use Generated\Shared\Transfer\UserTransfer; use Spryker\Yves\Kernel\AbstractPlugin; use SprykerShop\Yves\AgentPage\Security\Agent; use SprykerShop\Yves\CustomerPage\Security\Customer; use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken; use Symfony\Component\Security\Http\Event\SwitchUserEvent; use Symfony\Component\Security\Http\SecurityEvents; @@ -20,6 +22,13 @@ */ class SwitchUserEventSubscriber extends AbstractPlugin implements EventSubscriberInterface { + /** + * @uses \Orm\Zed\User\Persistence\Map\SpyUserTableMap::COL_STATUS_ACTIVE + * + * @var string + */ + protected const COL_STATUS_ACTIVE = 'active'; + /** * @return array */ @@ -39,6 +48,14 @@ public function switchUser(SwitchUserEvent $switchUserEvent) { $targetUser = $switchUserEvent->getTargetUser(); + $agentUserTransfer = $this->findAgentUserByUsername($this->findAgentUsername($switchUserEvent)); + + if ($agentUserTransfer === null) { + $this->onImpersonationEnd(); + + return; + } + if ($targetUser instanceof Customer) { $this->onImpersonationStart($targetUser); @@ -82,4 +99,45 @@ protected function clearAgentsQuote(): void ->getQuoteClient() ->setQuote(new QuoteTransfer()); } + + /** + * @param \Symfony\Component\Security\Http\Event\SwitchUserEvent $switchUserEvent + * + * @return string|null + */ + protected function findAgentUsername(SwitchUserEvent $switchUserEvent): ?string + { + $token = $switchUserEvent->getToken(); + if (!$token instanceof SwitchUserToken) { + return null; + } + + $originalUser = $token->getOriginalToken()->getUser(); + if (!$originalUser instanceof Agent) { + return null; + } + + return $originalUser->getUsername(); + } + + /** + * @param string $username + * + * @return \Generated\Shared\Transfer\UserTransfer|null + */ + protected function findAgentUserByUsername(string $username): ?UserTransfer + { + $userTransfer = new UserTransfer(); + $userTransfer->setUsername($username); + + $userTransfer = $this->getFactory() + ->getAgentClient() + ->findAgentByUsername($userTransfer); + + if ($userTransfer && $userTransfer->getStatus() === static::COL_STATUS_ACTIVE) { + return $userTransfer; + } + + return null; + } } diff --git a/src/SprykerShop/Yves/AgentPage/Theme/default/views/login/redirect-to-login.twig b/src/SprykerShop/Yves/AgentPage/Theme/default/views/login/redirect-to-login.twig new file mode 100644 index 0000000..4dea251 --- /dev/null +++ b/src/SprykerShop/Yves/AgentPage/Theme/default/views/login/redirect-to-login.twig @@ -0,0 +1,16 @@ +{% extends template('page-layout-main') %} + +{% define data = { + loginRedirectUrl: _view.loginRedirectUrl +} %} + +{% block content %} +
+
+
+
{{ 'agent.account.redirect-to-login' | trans }}
+ +
+
+
+{% endblock %}