From 4ec7d1411bbbd3ce99bc0d87cde4f37f7b20532f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20St=C3=BCckler?= Date: Fri, 17 Apr 2026 11:05:26 +0200 Subject: [PATCH] fix: path segments and query params combined MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also fix missing pass and user parts in url. Signed-off-by: Moritz Stückler --- lib/Controller/SiteController.php | 32 ++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/lib/Controller/SiteController.php b/lib/Controller/SiteController.php index 64a5228e..120ab1cf 100644 --- a/lib/Controller/SiteController.php +++ b/lib/Controller/SiteController.php @@ -89,12 +89,38 @@ protected function createResponse(int $id, array $site, string $path = ''): Temp $this->navigationManager->setActiveEntry('external_index' . $id); if ($path !== '') { - // Check whether we need to suffix the site URL with a slash, or not. - $path = $site['url'][-1] == '/' ? $path : '/' . $path; + // Parse the URL to properly insert the path before any query parameters + $parts = parse_url($site['url']); + + if ($parts === false || !isset($parts['scheme'], $parts['host'])) { + throw new \RuntimeException('Invalid site URL: ' . $site['url']); + } + + $url = $parts['scheme'] . '://'; + if (isset($parts['user'])) { + $url .= rawurlencode($parts['user']); + if (isset($parts['pass'])) { + $url .= ':' . rawurlencode($parts['pass']); + } + $url .= '@'; + } + $url .= $parts['host']; + if (isset($parts['port'])) { + $url .= ':' . $parts['port']; + } + $url .= rtrim($parts['path'] ?? '', '/') . '/' . $path; + if (isset($parts['query'])) { + $url .= '?' . $parts['query']; + } + if (isset($parts['fragment'])) { + $url .= '#' . $parts['fragment']; + } + } else { + $url = $site['url']; } $response = new TemplateResponse('external', 'frame', [ - 'url' => $site['url'] . $path, + 'url' => $url, 'name' => $site['name'], ], 'user');