From 6062d5f71647aa9386e5d819e8528545db8ce748 Mon Sep 17 00:00:00 2001 From: Matthias Jentsch Date: Sun, 20 Oct 2013 16:28:53 +0200 Subject: [PATCH] Add the html-anchor from the url to the login redirection Change the Url class to support html anchors and add JavaScript to fetch the anchor from the URL, as it is regularly not send to the server. refs #4833 --- .../controllers/AuthenticationController.php | 4 +- .../views/scripts/authentication/login.phtml | 14 ++++- .../Web/Controller/ActionController.php | 16 ++--- library/Icinga/Web/Url.php | 62 ++++++++++++++++++- 4 files changed, 80 insertions(+), 16 deletions(-) diff --git a/application/controllers/AuthenticationController.php b/application/controllers/AuthenticationController.php index e47b9f1f2..9a5979019 100644 --- a/application/controllers/AuthenticationController.php +++ b/application/controllers/AuthenticationController.php @@ -58,8 +58,8 @@ class AuthenticationController extends ActionController */ public function loginAction() { - $this->replaceLayout = true; $credentials = new Credential(); + $this->_helper->layout->setLayout('inline'); $this->view->form = new LoginForm(); $this->view->form->setRequest($this->_request); $this->view->title = "Icinga Web Login"; @@ -98,10 +98,10 @@ class AuthenticationController extends ActionController */ public function logoutAction() { + $this->_helper->layout->setLayout('inline'); $auth = AuthManager::getInstance(null, array( 'writeSession' => $this->modifiesSession )); - $this->replaceLayout = true; $auth->removeAuthorization(); $this->redirectToLogin(); } diff --git a/application/views/scripts/authentication/login.phtml b/application/views/scripts/authentication/login.phtml index 45ec5603d..9b56c817c 100644 --- a/application/views/scripts/authentication/login.phtml +++ b/application/views/scripts/authentication/login.phtml @@ -1,4 +1,3 @@ -

Login

@@ -10,3 +9,16 @@
+ + \ No newline at end of file diff --git a/library/Icinga/Web/Controller/ActionController.php b/library/Icinga/Web/Controller/ActionController.php index e5ee5a5b3..d5f71e908 100755 --- a/library/Icinga/Web/Controller/ActionController.php +++ b/library/Icinga/Web/Controller/ActionController.php @@ -50,13 +50,6 @@ use \Icinga\Web\Request; */ class ActionController extends Zend_Controller_Action { - /** - * True to mark this layout to not render the full layout - * - * @var bool - */ - protected $replaceLayout = false; - /** * Whether the controller requires the user to be authenticated * @@ -171,13 +164,14 @@ class ActionController extends Zend_Controller_Action /** * Return the URI that can be used to request the current action * - * @return string return the path to this action: // + * @return string return the path to this action: //? */ public function getRequestUrl() { - return $this->_request->getModuleName() . '/' . - $this->_request->getControllerName() . '/' . - $this->_request->getActionName(); + $base = $this->_request->getModuleName() . '/' . + $this->_request->getControllerName() . '/' . + $this->_request->getActionName(); + return $_SERVER['QUERY_STRING'] !== '' ? $base . '?' . $_SERVER['QUERY_STRING'] : $base; } /** diff --git a/library/Icinga/Web/Url.php b/library/Icinga/Web/Url.php index fe58df966..ba1eeb920 100644 --- a/library/Icinga/Web/Url.php +++ b/library/Icinga/Web/Url.php @@ -31,6 +31,13 @@ class Url */ private $params = array(); + /** + * The site anchor after the '#' + * + * @var string + */ + private $anchor = ''; + /** * The relative path of this Url, without query parameters * @@ -108,7 +115,16 @@ class Url } $urlObject->setBaseUrl($request->getBaseUrl()); + /* + * Fetch fragment manually and remove it from the url, to 'help' the parse_url() function + * parsing the url properly. Otherwise calling the function with a fragment, but without a + * query will cause unpredictable behaviour. + */ + $fragment = self::getUrlFragment($url); + $url = self::stripUrlFragment($url); + $urlParts = parse_url($url); + if (isset($urlParts["path"])) { $urlObject->setPath($urlParts["path"]); } @@ -117,11 +133,43 @@ class Url parse_str($urlParts["query"], $urlParams); $params = array_merge($urlParams, $params); } + if ($fragment !== '') { + $urlObject->setAnchor($fragment); + } $urlObject->setParams($params); return $urlObject; } + /** + * Get the fragment of a given url + * + * @param $url The url containing the fragment. + * + * @return string The fragment without the '#' + */ + private static function getUrlFragment($url) + { + $url = parse_url($url); + if (isset($url['fragment'])) { + return $url['fragment']; + } else { + return ''; + } + } + + /** + * Remove the fragment-part of a given url + * + * @param $url string The url to strip from its fragment + * + * @return string The url without the fragment. + */ + private static function stripUrlFragment($url) + { + return preg_replace('/#.*$/', '', $url); + } + /** * Overwrite the baseUrl. * @@ -179,9 +227,9 @@ class Url public function getRelativeUrl() { if (empty($this->params)) { - return ltrim($this->path, '/'); + return ltrim($this->path, '/') . $this->anchor; } - return ltrim($this->path, '/').'?'.http_build_query($this->params); + return ltrim($this->path, '/') . '?' . http_build_query($this->params) . $this->anchor; } /** @@ -280,6 +328,16 @@ class Url return $this; } + /** + * Set the url anchor-part + * + * @param $anchor The site's anchor string without the '#' + */ + public function setAnchor($anchor) + { + $this->anchor = '#' . $anchor; + } + /** * Remove provided key (if string) or keys (if array of string) from the query parameter array *