Skip to content

Commit

Permalink
#4 Fix redirect in different languages
Browse files Browse the repository at this point in the history
  • Loading branch information
iMiMWeis committed Nov 23, 2023
1 parent 0a11ced commit 8aca0ab
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 58 deletions.
70 changes: 70 additions & 0 deletions src/Service/PasswordPathService.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
<?php

namespace iMidiPasswordSite\Service;

use iMidiPasswordSite\Storefront\Controller\PasswordPageController;
use Shopware\Core\Content\Category\CategoryEntity;
use Shopware\Core\Framework\Adapter\Cache\Event\HttpCacheHitEvent;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Storefront\Page\PageLoadedEvent;

class PasswordPathService
{

const AUTH_SESSION_PREFIX = 'auth_';

public function __construct(
private PasswordPageController $passwordPageController,
private EntityRepository $categoryRepository,
)
{
}

public function checkPasswordInPath(CategoryEntity $category, PageLoadedEvent|HttpCacheHitEvent $event)
{
$context = Context::createDefaultContext();

$path = $category->getPath();
if (!$path) {
if ($category->getCustomFields() !== null && array_key_exists('password_site_password', $category->getCustomFields())) {
$this->checkAuthenticated($event, $category->getId());
}
return;
}

$path .= $category->getId();
$parents = array_reverse(array_slice(explode('|', $path), 1));


foreach ($parents as $parentId) {

$parent = $this->categoryRepository
->search(new Criteria([$parentId]), $context)->first();

if ($parent->getCustomFields() !== null
&& array_key_exists('password_site_password', $parent->getCustomFields())) {

$this->checkAuthenticated($event, $parent->getId());
break;
}
}
}

private function checkAuthenticated($event, string $navigationId)
{
$session = $event->getRequest()->getSession();
$session->set('redirect', $event->getRequest()->server->get('REQUEST_URI'));

if (!$session->has(self::AUTH_SESSION_PREFIX . $navigationId)) {
$this->passwordPageController->redirectToLogin($navigationId);
}
}

public function findNavigation(mixed $navigationId, HttpCacheHitEvent $event)
{
$category = $this->categoryRepository->search(new Criteria([$navigationId]), Context::createDefaultContext())->first();
$this->checkPasswordInPath($category, $event);
}
}
68 changes: 11 additions & 57 deletions src/Subscriber/CheckPasswordSubscriber.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,21 @@

namespace iMidiPasswordSite\Subscriber;

use iMidiPasswordSite\Storefront\Controller\PasswordPageController;
use Shopware\Core\Content\Category\CategoryEntity;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Storefront\Framework\Cache\Event\HttpCacheHitEvent;
use iMidiPasswordSite\Service\PasswordPathService;
use Shopware\Core\Framework\Adapter\Cache\Event\HttpCacheHitEvent;
use Shopware\Storefront\Framework\Routing\Router;
use Shopware\Storefront\Page\GenericPageLoadedEvent;
use Shopware\Storefront\Page\PageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class CheckPasswordSubscriber implements EventSubscriberInterface
{
const AUTH_SESSION_PREFIX = 'auth_';

private $router;
private $categoryRepository;
private $passwordPageController;

public function __construct(
Router $router,
EntityRepository $categoryRepository,
PasswordPageController $passwordPageController)
private Router $router,
private PasswordPathService $passwordPathService,
)
{
$this->router = $router;
$this->categoryRepository = $categoryRepository;
$this->passwordPageController = $passwordPageController;
}

public static function getSubscribedEvents(): array
Expand All @@ -42,21 +30,25 @@ public static function getSubscribedEvents(): array
public function onPageLoaded(PageLoadedEvent $event)
{
$request = $event->getRequest();

//early return for login page being loaded
if ($request->attributes->get('_route') === 'frontend.password.restricted') {
return;
}

//????
$page = $event->getPage();
if (!$page->getHeader()) {
return;
}

$activeNavigation = $page->getHeader()->getNavigation()->getActive();
$this->checkPasswordInPath($activeNavigation, $event);
$this->passwordPathService->checkPasswordInPath($activeNavigation, $event);
}

public function onCachedPageLoaded(HttpCacheHitEvent $event)
{

$requestUri = $event->getRequest()->attributes->get('resolved-uri');

if ($this->router instanceof RequestMatcherInterface) {
Expand All @@ -67,47 +59,9 @@ public function onCachedPageLoaded(HttpCacheHitEvent $event)

if ($parameters['_route'] === 'frontend.navigation.page') {
$navigationId = $parameters['navigationId'];
$category = $this->categoryRepository->search(new Criteria([$navigationId]), Context::createDefaultContext())->first();
$this->checkPasswordInPath($category, $event);
}
}

private function checkAuthenticated($event, string $navigationId)
{
$session = $event->getRequest()->getSession();
$session->set('redirect', $event->getRequest()->server->get('REQUEST_URI'));

if (!$session->has(self::AUTH_SESSION_PREFIX . $navigationId)) {
$this->passwordPageController->redirectToLogin($navigationId);
$this->passwordPathService->findNavigation($navigationId, $event);
}
}

private function checkPasswordInPath(CategoryEntity $category, $event)
{
//include router
$context = Context::createDefaultContext();
if ($event instanceof PageLoadedEvent) {
$context = $event->getContext();
}

$path = $category->getPath();
if (!$path) {
if ($category->getCustomFields() !== null && array_key_exists('password_site_password', $category->getCustomFields())) {
$this->checkAuthenticated($event, $category->getId());
}
return;
}

$path .= $category->getId();
$parents = array_reverse(array_slice(explode('|', $path), 1));
foreach ($parents as $parentId) {
$parent = $this->categoryRepository
->search(new Criteria([$parentId]), $context)->first();
if ($parent->getCustomFields() !== null && array_key_exists('password_site_password', $parent->getCustomFields())) {
$this->checkAuthenticated($event, $parent->getId());
break;
}
}
}

}
7 changes: 6 additions & 1 deletion src/iMidiPasswordSite.php
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ private function createCustomFields(InstallContext $installContext)
]
];

$customFieldSetRepository = $this->container->get('custom_field_set.repository');
$customFieldSetRepository = $this->getCustomFieldRepository();

if (!$this->customFieldsExist($customFieldSetRepository, $installContext->getContext())) {
foreach ($customFields as $customFieldSet) {
Expand Down Expand Up @@ -94,4 +94,9 @@ private function customFieldsExist(EntityRepository $customFieldSetRepository, C
return $ids->getTotal() > 0 ? $ids : null;
}

private function getCustomFieldRepository()
{
return $this->container->get('custom_field_set.repository');
}

}

0 comments on commit 8aca0ab

Please sign in to comment.