From 1b81973358a73e74e01ecf882106d16d55442052 Mon Sep 17 00:00:00 2001 From: Max Date: Tue, 19 Mar 2024 20:31:08 +0100 Subject: [PATCH] outposts/proxy: Fix invalid redirect on external hosts containing path components (#8915) * outposts/proxy: Fix invalid redirect on external hosts containing path components Signed-off-by: Max * outposts/proxy: Fix test for changed redirect logic Signed-off-by: Max --------- Signed-off-by: Max --- .../proxyv2/application/mode_proxy_test.go | 2 +- internal/outpost/proxyv2/application/utils.go | 17 +++-------------- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/internal/outpost/proxyv2/application/mode_proxy_test.go b/internal/outpost/proxyv2/application/mode_proxy_test.go index a33f7cb96a..7534350db8 100644 --- a/internal/outpost/proxyv2/application/mode_proxy_test.go +++ b/internal/outpost/proxyv2/application/mode_proxy_test.go @@ -56,7 +56,7 @@ func TestProxy_Redirect_Subdirectory(t *testing.T) { loc, _ := rr.Result().Location() assert.Equal( t, - "https://ext.t.goauthentik.io/subdir/outpost.goauthentik.io/start?rd=https%3A%2F%2Fext.t.goauthentik.io%2Ffoo", + "https://ext.t.goauthentik.io/subdir/outpost.goauthentik.io/start?rd=https%3A%2F%2Fext.t.goauthentik.io%2Fsubdir%2Ffoo", loc.String(), ) } diff --git a/internal/outpost/proxyv2/application/utils.go b/internal/outpost/proxyv2/application/utils.go index d895fa0be9..f8a2d6575f 100644 --- a/internal/outpost/proxyv2/application/utils.go +++ b/internal/outpost/proxyv2/application/utils.go @@ -3,7 +3,6 @@ package application import ( "net/http" "net/url" - "path" "strconv" "strings" @@ -11,22 +10,12 @@ import ( "goauthentik.io/internal/outpost/proxyv2/constants" ) -func urlPathSet(originalUrl string, newPath string) string { - u, err := url.Parse(originalUrl) - if err != nil { - return originalUrl - } - u.Path = newPath - return u.String() -} - func urlJoin(originalUrl string, newPath string) string { - u, err := url.Parse(originalUrl) + u, err := url.JoinPath(originalUrl, newPath) if err != nil { return originalUrl } - u.Path = path.Join(u.Path, newPath) - return u.String() + return u } func (a *Application) redirectToStart(rw http.ResponseWriter, r *http.Request) { @@ -46,7 +35,7 @@ func (a *Application) redirectToStart(rw http.ResponseWriter, r *http.Request) { } } - redirectUrl := urlPathSet(a.proxyConfig.ExternalHost, r.URL.Path) + redirectUrl := urlJoin(a.proxyConfig.ExternalHost, r.URL.Path) if a.Mode() == api.PROXYMODE_FORWARD_DOMAIN { dom := strings.TrimPrefix(*a.proxyConfig.CookieDomain, ".")