X-Git-Url: https://git.rapsys.eu/airbundle/blobdiff_plain/aef11da75cf6e45dc253f96324905536960fdcce..6e4e8924d57177e972d0534cd128135970d1905c:/Security/AccessDeniedHandler.php?ds=inline

diff --git a/Security/AccessDeniedHandler.php b/Security/AccessDeniedHandler.php
index 5494fb0..e4ca036 100644
--- a/Security/AccessDeniedHandler.php
+++ b/Security/AccessDeniedHandler.php
@@ -3,10 +3,13 @@
 namespace Rapsys\AirBundle\Security;
 
 use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\RequestStack;
 use Symfony\Component\HttpFoundation\Response;
 use Symfony\Component\Security\Core\Exception\AccessDeniedException;
 use Symfony\Component\Security\Http\Authorization\AccessDeniedHandlerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+use Symfony\Component\Routing\RouterInterface;
 use Symfony\Component\Translation\TranslatorInterface;
 use Twig\Environment;
 
@@ -14,32 +17,101 @@ class AccessDeniedHandler implements AccessDeniedHandlerInterface {
 	//Config array
 	protected $config;
 
-	//Translator instance
-	protected $translator;
+	//Context array
+	protected $context;
 
 	//Environment instance
 	protected $environment;
 
+	//Translator instance
+	protected $translator;
+
 	/**
 	 * {@inheritdoc}
 	 */
-	public function __construct(ContainerInterface $container, TranslatorInterface $translator, Environment $environment) {
+	#public function __construct(ContainerInterface $container, Environment $environment, RouterInterface $router, TranslatorInterface $translator, string $alias = 'rapsys_air') {
+	public function __construct(ContainerInterface $container, Environment $environment, RouterInterface $router, RequestStack $requestStack, TranslatorInterface $translator, string $alias = 'rapsys_air') {
 		//Retrieve config
-		$this->config = $container->getParameter($this->getAlias());
+		$this->config = $container->getParameter($alias);
 
 		//Set the translator
 		$this->translator = $translator;
 
 		//Set the environment
 		$this->environment = $environment;
+
+		//Set the context
+		$this->context = [
+			'copy' => [
+				'by' => $translator->trans($this->config['copy']['by']),
+				'link' => $this->config['copy']['link'],
+				'long' => $translator->trans($this->config['copy']['long']),
+				'short' => $translator->trans($this->config['copy']['short']),
+				'title' => $this->config['copy']['title']
+			],
+			'site' => [
+				'ico' => $this->config['site']['ico'],
+				'logo' => $this->config['site']['logo'],
+				'png' => $this->config['site']['png'],
+				'svg' => $this->config['site']['svg'],
+				'title' => $translator->trans($this->config['site']['title']),
+				'url' => $router->generate($this->config['site']['url']),
+			],
+			'canonical' => null,
+			'alternates' => []
+		];
+
+		//Get current locale
+		#$currentLocale = $router->getContext()->getParameters()['_locale'];
+		$currentLocale = $requestStack->getCurrentRequest()->getLocale();
+
+		//Set translator locale
+		//XXX: allow LocaleSubscriber on the fly locale change for first page
+		$this->translator->setLocale($currentLocale);
+
+		//Iterate on locales excluding current one
+		foreach($this->config['locales'] as $locale) {
+			//Set titles
+			$titles = [];
+
+			//Iterate on other locales
+			foreach(array_diff($this->config['locales'], [$locale]) as $other) {
+				$titles[$other] = $translator->trans($this->config['languages'][$locale], [], null, $other);
+			}
+
+			//Get context path
+			$path = $router->getContext()->getPathInfo();
+
+			//Retrieve route matching path
+			$route = $router->match($path);
+
+			//Get route name
+			$name = $route['_route'];
+
+			//Unset route name
+			unset($route['_route']);
+
+			//With current locale
+			if ($locale == $currentLocale) {
+				//Set locale locales context
+				$this->context['canonical'] = $router->generate($name, ['_locale' => $locale]+$route, UrlGeneratorInterface::ABSOLUTE_URL);
+			} else {
+				//Set locale locales context
+				$this->context['alternates'][] = [
+					'lang' => $locale,
+					'absolute' => $router->generate($name, ['_locale' => $locale]+$route, UrlGeneratorInterface::ABSOLUTE_URL),
+					'relative' => $router->generate($name, ['_locale' => $locale]+$route),
+					'title' => implode('/', $titles),
+					'translated' => $translator->trans($this->config['languages'][$locale], [], null, $locale)
+				];
+			}
+		}
 	}
 
 	/**
 	 * {@inheritdoc}
 	 */
-#use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
-	#public function login(Request $request, AuthenticationUtils $authenticationUtils) {
-	public function handle(Request $request, AccessDeniedException $accessDeniedException) {
+	public function handle(Request $request, AccessDeniedException $exception) {
 		//Set section
 		$section = $this->translator->trans('Access denied');
 
@@ -47,22 +119,20 @@ class AccessDeniedHandler implements AccessDeniedHandlerInterface {
 		$title = $section.' - '.$this->translator->trans($this->config['site']['title']);
 
 		//Set message
-		$message = $this->translator->trans($accessDeniedException->getMessage());
+		//XXX: we assume that it's already translated
+		$message = $exception->getMessage();
 
 		//Render template
 		return new Response(
 			$this->environment->render(
 				'@RapsysAir/security/denied.html.twig',
-				['title' => $title, 'section' => $section, 'message' => $message]
+				[
+					'title' => $title,
+					'section' => $section,
+					'message' => $message
+				]+$this->context
 			),
 			403
 		);
 	}
-
-	/**
-	 * {@inheritdoc}
-	 */
-	public function getAlias() {
-		return 'rapsys_air';
-	}
 }