From 21c0ee9134bb735d60ea27e4ab342ae11d6001ea Mon Sep 17 00:00:00 2001 From: Dmitriy Simushev Date: Fri, 22 Aug 2014 13:11:17 +0000 Subject: [PATCH] Move secure URL generation to the Router --- src/mibew/libs/classes/Mibew/Application.php | 2 +- .../Mibew/Controller/AbstractController.php | 21 +++---- .../Mibew/Controller/ButtonCodeController.php | 2 +- .../Mibew/Controller/ControllerResolver.php | 2 +- .../Generator/SecureUrlGeneratorInterface.php | 48 +++++++++++++++ .../Mibew/Routing/Generator/UrlGenerator.php | 59 +++++++++++++++++++ .../libs/classes/Mibew/Routing/Router.php | 11 +++- .../Mibew/Routing/RouterAwareInterface.php | 2 - .../classes/Mibew/Routing/RouterInterface.php | 30 ++++++++++ 9 files changed, 157 insertions(+), 20 deletions(-) create mode 100644 src/mibew/libs/classes/Mibew/Routing/Generator/SecureUrlGeneratorInterface.php create mode 100644 src/mibew/libs/classes/Mibew/Routing/Generator/UrlGenerator.php create mode 100644 src/mibew/libs/classes/Mibew/Routing/RouterInterface.php diff --git a/src/mibew/libs/classes/Mibew/Application.php b/src/mibew/libs/classes/Mibew/Application.php index 12f196f1..e498c680 100644 --- a/src/mibew/libs/classes/Mibew/Application.php +++ b/src/mibew/libs/classes/Mibew/Application.php @@ -32,12 +32,12 @@ use Mibew\Http\Exception\HttpException; use Mibew\Http\Exception\MethodNotAllowedException as MethodNotAllowedHttpException; use Mibew\Http\Exception\NotFoundException as NotFoundHttpException; use Mibew\Routing\RouterAwareInterface; +use Mibew\Routing\RouterInterface; use Mibew\Routing\Exception\AccessDeniedException as AccessDeniedRoutingException; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\Routing\RequestContext; -use Symfony\Component\Routing\RouterInterface; use Symfony\Component\Routing\Exception\MethodNotAllowedException as MethodNotAllowedRoutingException; use Symfony\Component\Routing\Exception\ResourceNotFoundException as ResourceNotFoundRoutingException; diff --git a/src/mibew/libs/classes/Mibew/Controller/AbstractController.php b/src/mibew/libs/classes/Mibew/Controller/AbstractController.php index 42395a36..0dfc1f27 100644 --- a/src/mibew/libs/classes/Mibew/Controller/AbstractController.php +++ b/src/mibew/libs/classes/Mibew/Controller/AbstractController.php @@ -24,10 +24,10 @@ use Mibew\Asset\AssetUrlGeneratorInterface; use Mibew\Authentication\AuthenticationManagerAwareInterface; use Mibew\Authentication\AuthenticationManagerInterface; use Mibew\Routing\RouterAwareInterface; +use Mibew\Routing\RouterInterface; use Mibew\Style\StyleInterface; use Mibew\Style\PageStyle; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; -use Symfony\Component\Routing\RouterInterface; use Symfony\Component\HttpFoundation\RedirectResponse; /** @@ -111,16 +111,16 @@ abstract class AbstractController implements * * @param string $route The name of the route. * @param mixed $parameters An array of parameters. - * @param bool|string $referenceType The type of reference (one of the + * @param bool|string $reference_type The type of reference (one of the * constants in UrlGeneratorInterface). * * @return string The generated URL. * * @see UrlGeneratorInterface */ - public function generateUrl($route, $parameters = array(), $referenceType = UrlGeneratorInterface::ABSOLUTE_PATH) + public function generateUrl($route, $parameters = array(), $reference_type = UrlGeneratorInterface::ABSOLUTE_PATH) { - return $this->getRouter()->generate($route, $parameters, $referenceType); + return $this->getRouter()->generate($route, $parameters, $reference_type); } /** @@ -128,19 +128,14 @@ abstract class AbstractController implements * * @param string $route The name of the route. * @param mixed $parameters An array of parameters. + * @param bool|string $reference_type The type of reference (one of the + * constants in UrlGeneratorInterface). * * @return string The generated URL. */ - public function generateSecureUrl($route, $parameters = array()) + public function generateSecureUrl($route, $parameters = array(), $reference_type = UrlGeneratorInterface::ABSOLUTE_PATH) { - $context = $this->getRouter()->getContext(); - - return 'https://' . $context->getHost() - . $this->getRouter()->generate( - $route, - $parameters, - UrlGeneratorInterface::ABSOLUTE_PATH - ); + return $this->getRouter()->generateSecure($route, $parameters, $reference_type); } /** diff --git a/src/mibew/libs/classes/Mibew/Controller/ButtonCodeController.php b/src/mibew/libs/classes/Mibew/Controller/ButtonCodeController.php index 23146cef..2f901193 100644 --- a/src/mibew/libs/classes/Mibew/Controller/ButtonCodeController.php +++ b/src/mibew/libs/classes/Mibew/Controller/ButtonCodeController.php @@ -237,7 +237,7 @@ class ButtonCodeController extends AbstractController $link_params['group'] = $group; } $link = ($show_host && $force_secure) - ? $this->generateSecureUrl('chat_user_start', $link_params) + ? $this->generateSecureUrl('chat_user_start', $link_params, $url_type) : $this->generateUrl('chat_user_start', $link_params, $url_type); $modsecfix = $mod_security ? ".replace('http://','').replace('https://','')" : ""; diff --git a/src/mibew/libs/classes/Mibew/Controller/ControllerResolver.php b/src/mibew/libs/classes/Mibew/Controller/ControllerResolver.php index 56f61e6b..5dddf05b 100644 --- a/src/mibew/libs/classes/Mibew/Controller/ControllerResolver.php +++ b/src/mibew/libs/classes/Mibew/Controller/ControllerResolver.php @@ -24,7 +24,7 @@ use Mibew\Asset\AssetUrlGeneratorInterface; use Mibew\Authentication\AuthenticationManagerAwareInterface; use Mibew\Authentication\AuthenticationManagerInterface; use Mibew\Routing\RouterAwareInterface; -use Symfony\Component\Routing\RouterInterface; +use Mibew\Routing\RouterInterface; use Symfony\Component\HttpFoundation\Request; class ControllerResolver implements diff --git a/src/mibew/libs/classes/Mibew/Routing/Generator/SecureUrlGeneratorInterface.php b/src/mibew/libs/classes/Mibew/Routing/Generator/SecureUrlGeneratorInterface.php new file mode 100644 index 00000000..a73ec77a --- /dev/null +++ b/src/mibew/libs/classes/Mibew/Routing/Generator/SecureUrlGeneratorInterface.php @@ -0,0 +1,48 @@ +routes->get($name)) { + throw new RouteNotFoundException(sprintf('Unable to generate a URL for the named route "%s" as such route does not exist.', $name)); + } + + // The Route has a cache of its own and is not recompiled as long as it + // does not get modified. + $compiled_route = $route->compile(); + + // Force a route to use HTTPS for this time. + $requirements = $route->getRequirements(); + $requirements['_scheme'] = 'https'; + + return $this->doGenerate( + $compiled_route->getVariables(), + $route->getDefaults(), + $requirements, + $compiled_route->getTokens(), + $parameters, + $name, + $reference_type, + $compiled_route->getHostTokens() + ); + } +} diff --git a/src/mibew/libs/classes/Mibew/Routing/Router.php b/src/mibew/libs/classes/Mibew/Routing/Router.php index bdc48c77..c56c243a 100644 --- a/src/mibew/libs/classes/Mibew/Routing/Router.php +++ b/src/mibew/libs/classes/Mibew/Routing/Router.php @@ -21,11 +21,10 @@ namespace Mibew\Routing; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\RequestContext; -use Symfony\Component\Routing\RouterInterface; use Symfony\Component\Routing\RouteCollection; -use Symfony\Component\Routing\Generator\UrlGenerator; use Symfony\Component\Routing\Matcher\RequestMatcherInterface; use Symfony\Component\Routing\Matcher\UrlMatcher; +use Mibew\Routing\Generator\UrlGenerator; use Mibew\Routing\RouteCollectionLoader; class Router implements RouterInterface, RequestMatcherInterface @@ -93,6 +92,14 @@ class Router implements RouterInterface, RequestMatcherInterface return $this->getGenerator()->generate($name, $parameters, $referenceType); } + /** + * {@inheritdoc} + */ + public function generateSecure($name, $parameters = array(), $referenceType = self::ABSOLUTE_PATH) + { + return $this->getGenerator()->generateSecure($name, $parameters, $referenceType); + } + /** * {@inheritdoc} */ diff --git a/src/mibew/libs/classes/Mibew/Routing/RouterAwareInterface.php b/src/mibew/libs/classes/Mibew/Routing/RouterAwareInterface.php index 1856ef4b..09e5a650 100644 --- a/src/mibew/libs/classes/Mibew/Routing/RouterAwareInterface.php +++ b/src/mibew/libs/classes/Mibew/Routing/RouterAwareInterface.php @@ -19,8 +19,6 @@ namespace Mibew\Routing; -use Symfony\Component\Routing\RouterInterface; - /** * An interface for all router aware objects. */ diff --git a/src/mibew/libs/classes/Mibew/Routing/RouterInterface.php b/src/mibew/libs/classes/Mibew/Routing/RouterInterface.php new file mode 100644 index 00000000..a82f7fbd --- /dev/null +++ b/src/mibew/libs/classes/Mibew/Routing/RouterInterface.php @@ -0,0 +1,30 @@ +