From 778d1bc6b012c1a821066f8d1ee806d99237c39c Mon Sep 17 00:00:00 2001 From: Jonas Raoni Soares da Silva Date: Sat, 18 Jan 2025 00:13:46 +0300 Subject: [PATCH 1/5] pkp/pkp-lib#10818 Simplified if clause --- classes/core/PKPPageRouter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/core/PKPPageRouter.php b/classes/core/PKPPageRouter.php index 91a05b6c0a5..be50c4a83f4 100644 --- a/classes/core/PKPPageRouter.php +++ b/classes/core/PKPPageRouter.php @@ -504,7 +504,7 @@ private function _setLocale(PKPRequest $request, ?string $setLocale): void $urlLocale = $this->_getRequestedUrlParts(['Core', 'getLocalization'], $request); $multiLingual = count($this->_getContextAndLocales($request, $contextPath)[1]) > 1; - if (!$multiLingual && !$urlLocale && !$setLocale || $multiLingual && !$setLocale && $urlLocale === Locale::getLocale()) { + if (!$setLocale && ($multiLingual ? $urlLocale === Locale::getLocale() : !$urlLocale)) { return; } From 005f9dda6d1787e2dea912db2f4f99c0eaf347ee Mon Sep 17 00:00:00 2001 From: Jonas Raoni Soares da Silva Date: Sat, 18 Jan 2025 00:58:06 +0300 Subject: [PATCH 2/5] pkp/pkp-lib#10818 Updated syntax --- classes/core/PKPPageRouter.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/classes/core/PKPPageRouter.php b/classes/core/PKPPageRouter.php index be50c4a83f4..e4a2a148522 100644 --- a/classes/core/PKPPageRouter.php +++ b/classes/core/PKPPageRouter.php @@ -500,10 +500,9 @@ private function _getLocaleForUrl(PKPRequest $request, ?Context $context, array */ private function _setLocale(PKPRequest $request, ?string $setLocale): void { - $contextPath = $this->_getRequestedUrlParts(['Core', 'getContextPath'], $request); - $urlLocale = $this->_getRequestedUrlParts(['Core', 'getLocalization'], $request); + $contextPath = $this->_getRequestedUrlParts(Core::getContextPath(...), $request); + $urlLocale = $this->_getRequestedUrlParts(Core::getLocalization(...), $request); $multiLingual = count($this->_getContextAndLocales($request, $contextPath)[1]) > 1; - if (!$setLocale && ($multiLingual ? $urlLocale === Locale::getLocale() : !$urlLocale)) { return; } From 5e6eb808bb204071d0e5aaf4284106480eb9df98 Mon Sep 17 00:00:00 2001 From: Jonas Raoni Soares da Silva Date: Sat, 18 Jan 2025 00:58:22 +0300 Subject: [PATCH 3/5] pkp/pkp-lib#10818 Simplified code --- classes/core/PKPPageRouter.php | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/classes/core/PKPPageRouter.php b/classes/core/PKPPageRouter.php index e4a2a148522..3edc22889cf 100644 --- a/classes/core/PKPPageRouter.php +++ b/classes/core/PKPPageRouter.php @@ -507,28 +507,31 @@ private function _setLocale(PKPRequest $request, ?string $setLocale): void return; } - $sessionLocale = (function (string $l) use ($request): string { - $session = $request->getSession(); - if (Locale::isSupported($l) && $l !== $session->get('currentLocale')) { - $session->put('currentLocale', $l); - $request->setCookieVar('currentLocale', $l); - } - // In case session current locale has been set to non-supported locale, or is null, somewhere else - if (!Locale::isSupported($session->get('currentLocale') ?? '')) { - $session->put('currentLocale', Locale::getLocale()); - $request->setCookieVar('currentLocale', Locale::getLocale()); - } - return $session->get('currentLocale'); - })($setLocale ?? $urlLocale); + $session = $request->getSession(); + $currentLocale = $session->get('currentLocale') ?? ''; + if (!Locale::isSupported($currentLocale ?? '')) { + $currentLocale = null; + } + + $newLocale = $setLocale ?? $urlLocale; + if (!Locale::isSupported($newLocale)) { + $newLocale = $currentLocale ?? Locale::getLocale(); + } + + if ($newLocale !== $currentLocale) { + $session->put('currentLocale', $newLocale); + $request->setCookieVar('currentLocale', $newLocale); + } + // Do not permit basic auth strings in source parameter for redirects if (preg_match('#^/\w#', $source = str_replace('@', '', $request->getUserVar('source') ?? ''))) { $request->redirectUrl($source); } $indexUrl = $this->getIndexUrl($request); $uri = preg_replace("#^{$indexUrl}#", '', $setLocale ? ($_SERVER['HTTP_REFERER'] ?? '') : $request->getCompleteUrl(), 1); - $newUrlLocale = $multiLingual ? "/{$sessionLocale}" : ''; - $pathInfo = ($uri) + $newUrlLocale = $multiLingual ? "/{$newLocale}" : ''; + $pathInfo = $uri ? preg_replace("#^/{$contextPath}" . ($urlLocale ? "/{$urlLocale}" : '') . '(?=[/?\\#]|$)#', "/{$contextPath}{$newUrlLocale}", $uri, 1) : "/index{$newUrlLocale}"; From 28159e4c8ffc9f23009548a0e4065385fd8ef014 Mon Sep 17 00:00:00 2001 From: Jonas Raoni Soares da Silva Date: Sat, 18 Jan 2025 02:03:47 +0300 Subject: [PATCH 4/5] pkp/pkp-lib#10818 Quoted regexp --- classes/core/PKPPageRouter.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/classes/core/PKPPageRouter.php b/classes/core/PKPPageRouter.php index 3edc22889cf..75bb605b3c6 100644 --- a/classes/core/PKPPageRouter.php +++ b/classes/core/PKPPageRouter.php @@ -529,10 +529,10 @@ private function _setLocale(PKPRequest $request, ?string $setLocale): void } $indexUrl = $this->getIndexUrl($request); - $uri = preg_replace("#^{$indexUrl}#", '', $setLocale ? ($_SERVER['HTTP_REFERER'] ?? '') : $request->getCompleteUrl(), 1); + $uri = preg_replace('/^' . preg_quote($indexUrl, '/') . '/', '', $setLocale ? ($_SERVER['HTTP_REFERER'] ?? '') : $request->getCompleteUrl(), 1); $newUrlLocale = $multiLingual ? "/{$newLocale}" : ''; $pathInfo = $uri - ? preg_replace("#^/{$contextPath}" . ($urlLocale ? "/{$urlLocale}" : '') . '(?=[/?\\#]|$)#', "/{$contextPath}{$newUrlLocale}", $uri, 1) + ? preg_replace('/^' . preg_quote("/{$contextPath}" . ($urlLocale ? "/{$urlLocale}" : ''), '/') . '(?=[/?\\#]|$)#', "/{$contextPath}{$newUrlLocale}", $uri, 1) : "/index{$newUrlLocale}"; $request->redirectUrl($indexUrl . $pathInfo); From f338b88afa7d50682fc94e0c94c546a23e510046 Mon Sep 17 00:00:00 2001 From: Jonas Raoni Soares da Silva Date: Sat, 18 Jan 2025 02:05:41 +0300 Subject: [PATCH 5/5] pkp/pkp-lib#10818 Updated the code to use the default URL when the replace fail --- classes/core/PKPPageRouter.php | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/classes/core/PKPPageRouter.php b/classes/core/PKPPageRouter.php index 75bb605b3c6..fa78fc1c3f9 100644 --- a/classes/core/PKPPageRouter.php +++ b/classes/core/PKPPageRouter.php @@ -503,6 +503,7 @@ private function _setLocale(PKPRequest $request, ?string $setLocale): void $contextPath = $this->_getRequestedUrlParts(Core::getContextPath(...), $request); $urlLocale = $this->_getRequestedUrlParts(Core::getLocalization(...), $request); $multiLingual = count($this->_getContextAndLocales($request, $contextPath)[1]) > 1; + // Quit if there's no new locale to be set and the request URL is already well-formed if (!$setLocale && ($multiLingual ? $urlLocale === Locale::getLocale() : !$urlLocale)) { return; } @@ -523,19 +524,20 @@ private function _setLocale(PKPRequest $request, ?string $setLocale): void $request->setCookieVar('currentLocale', $newLocale); } - // Do not permit basic auth strings in source parameter for redirects + // Do not permit basic auth strings (user:password@url) in source parameter for redirects if (preg_match('#^/\w#', $source = str_replace('@', '', $request->getUserVar('source') ?? ''))) { $request->redirectUrl($source); } - $indexUrl = $this->getIndexUrl($request); - $uri = preg_replace('/^' . preg_quote($indexUrl, '/') . '/', '', $setLocale ? ($_SERVER['HTTP_REFERER'] ?? '') : $request->getCompleteUrl(), 1); $newUrlLocale = $multiLingual ? "/{$newLocale}" : ''; - $pathInfo = $uri - ? preg_replace('/^' . preg_quote("/{$contextPath}" . ($urlLocale ? "/{$urlLocale}" : ''), '/') . '(?=[/?\\#]|$)#', "/{$contextPath}{$newUrlLocale}", $uri, 1) - : "/index{$newUrlLocale}"; - - $request->redirectUrl($indexUrl . $pathInfo); + $indexUrl = $this->getIndexUrl($request); + $pathInfo = preg_replace('/^' . preg_quote($indexUrl, '/') . '/', '', $setLocale ? ($_SERVER['HTTP_REFERER'] ?? '') : $request->getCompleteUrl(), 1); + $newPathInfo = preg_replace('/^' . preg_quote("/{$contextPath}" . ($urlLocale ? "/{$urlLocale}" : ''), '/') . '(?=[\\/?#])\b/', "/{$contextPath}{$newUrlLocale}", $pathInfo, 1, $replaceCount); + // Failed to setup the new URL, fallback to the default initial URL + if (!$replaceCount) { + $newPathInfo = "/index{$newUrlLocale}"; + } + $request->redirectUrl($indexUrl . $newPathInfo); } }