vendor/shopware/storefront/Framework/Routing/StorefrontSubscriber.php line 424

  1.             ],
  2.         ];
  3.     }
  4.     public function startSession(): void
  5.     {
  6.         $master $this->requestStack->getMainRequest();
  7.         if (!$master) {
  8.             return;
  9.         }
  10.         if (!$master->attributes->get(SalesChannelRequest::ATTRIBUTE_IS_SALES_CHANNEL_REQUEST)) {
  11.             return;
  12.         }
  13.         if (!$master->hasSession()) {
  14.             return;
  15.         }
  16.         $session $master->getSession();
  17.         if (!$session->isStarted()) {
  18.             $session->setName('session-');
  19.             $session->start();
  20.             $session->set('sessionId'$session->getId());
  21.         }
  22.         $salesChannelId $master->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_ID);
  23.         if ($salesChannelId === null) {
  24.             /** @var SalesChannelContext|null $salesChannelContext */
  25.             $salesChannelContext $master->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);
  26.             if ($salesChannelContext !== null) {
  27.                 $salesChannelId $salesChannelContext->getSalesChannel()->getId();
  28.             }
  29.         }
  30.         if ($this->shouldRenewToken($session$salesChannelId)) {
  31.             $token Random::getAlphanumericString(32);
  32.             $session->set(PlatformRequest::HEADER_CONTEXT_TOKEN$token);
  33.             $session->set(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_ID$salesChannelId);
  34.         }
  35.         $master->headers->set(
  36.             PlatformRequest::HEADER_CONTEXT_TOKEN,
  37.             $session->get(PlatformRequest::HEADER_CONTEXT_TOKEN)
  38.         );
  39.     }
  40.     public function updateSessionAfterLogin(CustomerLoginEvent $event): void
  41.     {
  42.         $token $event->getContextToken();
  43.         $this->updateSession($token);
  44.     }
  45.     public function updateSessionAfterLogout(): void
  46.     {
  47.         $newToken Random::getAlphanumericString(32);
  48.         $this->updateSession($newTokentrue);
  49.     }
  50.     public function updateSession(string $tokenbool $destroyOldSession false): void
  51.     {
  52.         $master $this->requestStack->getMainRequest();
  53.         if (!$master) {
  54.             return;
  55.         }
  56.         if (!$master->attributes->get(SalesChannelRequest::ATTRIBUTE_IS_SALES_CHANNEL_REQUEST)) {
  57.             return;
  58.         }
  59.         if (!$master->hasSession()) {
  60.             return;
  61.         }
  62.         $session $master->getSession();
  63.         $session->migrate($destroyOldSession);
  64.         $session->set('sessionId'$session->getId());
  65.         $session->set(PlatformRequest::HEADER_CONTEXT_TOKEN$token);
  66.         $master->headers->set(PlatformRequest::HEADER_CONTEXT_TOKEN$token);
  67.     }
  68.     public function customerNotLoggedInHandler(ExceptionEvent $event): void
  69.     {
  70.         if (!$event->getRequest()->attributes->has(SalesChannelRequest::ATTRIBUTE_IS_SALES_CHANNEL_REQUEST)) {
  71.             return;
  72.         }
  73.         if (!$event->getThrowable() instanceof CustomerNotLoggedInException) {
  74.             return;
  75.         }
  76.         $request $event->getRequest();
  77.         $parameters = [
  78.             'redirectTo' => $request->attributes->get('_route'),
  79.             'redirectParameters' => json_encode($request->attributes->get('_route_params'), \JSON_THROW_ON_ERROR),
  80.         ];
  81.         $redirectResponse = new RedirectResponse($this->router->generate('frontend.account.login.page'$parameters));
  82.         $event->setResponse($redirectResponse);
  83.     }
  84.     public function maintenanceResolver(RequestEvent $event): void
  85.     {
  86.         if ($this->maintenanceModeResolver->shouldRedirect($event->getRequest())) {
  87.             $event->setResponse(
  88.                 new RedirectResponse(
  89.                     $this->router->generate('frontend.maintenance.page'),
  90.                     RedirectResponse::HTTP_TEMPORARY_REDIRECT
  91.                 )
  92.             );
  93.         }
  94.     }
  95.     public function preventPageLoadingFromXmlHttpRequest(ControllerEvent $event): void
  96.     {
  97.         if (!$event->getRequest()->isXmlHttpRequest()) {
  98.             return;
  99.         }
  100.         /** @var list<string> $scope */
  101.         $scope $event->getRequest()->attributes->get(PlatformRequest::ATTRIBUTE_ROUTE_SCOPE, []);
  102.         if (!\in_array(StorefrontRouteScope::ID$scopetrue)) {
  103.             return;
  104.         }
  105.         /** @var callable(): Response $controller */
  106.         $controller $event->getController();
  107.         // happens if Controller is a closure
  108.         if (!\is_array($controller)) {
  109.             return;
  110.         }
  111.         $isAllowed $event->getRequest()->attributes->getBoolean('XmlHttpRequest');
  112.         if ($isAllowed) {
  113.             return;
  114.         }
  115.         throw new AccessDeniedHttpException('PageController can\'t be requested via XmlHttpRequest.');
  116.     }
  117.     // used to switch session token - when the context token expired
  118.     public function replaceContextToken(SalesChannelContextResolvedEvent $event): void
  119.     {
  120.         $context $event->getSalesChannelContext();
  121.         // only update session if token expired and switched
  122.         if ($event->getUsedToken() === $context->getToken()) {
  123.             return;
  124.         }
  125.         $this->updateSession($context->getToken());
  126.     }
  127.     public function setCanonicalUrl(BeforeSendResponseEvent $event): void
  128.     {
  129.         if (!$event->getResponse()->isSuccessful()) {
  130.             return;
  131.         }
  132.         if ($canonical $event->getRequest()->attributes->get(SalesChannelRequest::ATTRIBUTE_CANONICAL_LINK)) {
  133.             \assert(\is_string($canonical));
  134.             $canonical sprintf('<%s>; rel="canonical"'$canonical);
  135.             $event->getResponse()->headers->set('Link'$canonical);
  136.         }
  137.     }
  138.     public function addHreflang(StorefrontRenderEvent $event): void
  139.     {
  140.         $request $event->getRequest();
  141.         $route $request->attributes->get('_route');
  142.         if ($route === null) {
  143.             return;
  144.         }
  145.         $routeParams $request->attributes->get('_route_params', []);
  146.         $salesChannelContext $request->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);
  147.         $parameter = new HreflangLoaderParameter($route$routeParams$salesChannelContext);
  148.         $event->setParameter('hrefLang'$this->hreflangLoader->load($parameter));
  149.     }
  150.     public function addShopIdParameter(StorefrontRenderEvent $event): void
  151.     {
  152.         if (!$this->activeAppsLoader->getActiveApps()) {
  153.             return;
  154.         }
  155.         try {
  156.             $shopId $this->shopIdProvider->getShopId();
  157.         } catch (AppUrlChangeDetectedException) {
  158.             return;
  159.         }
  160.         $event->setParameter('appShopId'$shopId);
  161.     }
  162.     public function addIconSetConfig(StorefrontRenderEvent $event): void
  163.     {
  164.         $request $event->getRequest();
  165.         // get name if theme is not inherited
  166.         $theme $request->attributes->get(SalesChannelRequest::ATTRIBUTE_THEME_NAME);
  167.         if (!$theme) {
  168.             // get theme name from base theme because for inherited themes the name is always null
  169.             $theme $request->attributes->get(SalesChannelRequest::ATTRIBUTE_THEME_BASE_NAME);
  170.         }
  171.         if (!$theme) {
  172.             return;
  173.         }
  174.         $themeConfig $this->themeRegistry->getConfigurations()->getByTechnicalName($theme);
  175.         if (!$themeConfig) {
  176.             return;
  177.         }
  178.         $iconConfig = [];
  179.         foreach ($themeConfig->getIconSets() as $pack => $path) {
  180.             $iconConfig[$pack] = [
  181.                 'path' => $path,
  182.                 'namespace' => $theme,
  183.             ];
  184.         }
  185.         $event->setParameter('themeIconConfig'$iconConfig);
  186.     }
  187.     private function shouldRenewToken(SessionInterface $session, ?string $salesChannelId null): bool
  188.     {
  189.         if (!$session->has(PlatformRequest::HEADER_CONTEXT_TOKEN) || $salesChannelId === null) {
  190.             return true;
  191.         }
  192.         if ($this->systemConfigService->get('core.systemWideLoginRegistration.isCustomerBoundToSalesChannel')) {
  193.             return $session->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_ID) !== $salesChannelId;
  194.         }
  195.         return false;
  196.     }
  197. }