router: fix /accounts collision again, gracefully fail for others

all routes are registered on the root of the host, and the "reverse
proxy subfolder". When using Reverse proxy subfolder "/accounts", and
the default URL Path for the Admin page of "/" (a.k.a. ""), a route
collision occurs that for some reason wasn't dealt with before. This is
avoided by checking before registering the second route, and a panic
recovery handler has been added telling the user off for using bad
subpaths if any others occur.
This commit is contained in:
Harvey Tindall
2025-05-27 17:53:39 +01:00
parent 688e941d64
commit c02cfffc9b
2 changed files with 12 additions and 1 deletions

View File

@@ -212,6 +212,7 @@ const (
FailedInitProxy = "Failed to initialize proxy @ \"%s\": %v\nStartup will pause for a bit to grab your attention."
NoURLSuffix = `Warning: Given "jfa_url"/"External jfa-go URL" value does not include "url_base" value!`
BadURLBase = `Warning: Given reverse proxy subfolder "%s" may conflict with the applications subpaths.`
RouteCollision = `Route Collision! Given reverse proxy subfolder "%s" or "URL Paths" settings likely conflict with the applications subpaths. Culprit: %v`
NoExternalHost = `No "External jfa-go URL" provided, set one in Settings > General.`
LoginWontSave = ` Your login won't save until you do.`
SubpathBlockMessage = `URLs: Root subfolder = "%s", Admin = "%s", My Account = "%s", Invite forms = "%s"`

View File

@@ -114,6 +114,13 @@ func (app *appContext) loadRoutes(router *gin.Engine) {
userPageEnabled := app.config.Section("user_page").Key("enabled").MustBool(true) && app.config.Section("ui").Key("jellyfin_login").MustBool(true)
// Route collision may occur when reverse proxy subfolder is the same as a pseudo-path (e.g. /accounts, /activity...). For non-obvious ones, recover from the panic.
defer func() {
if r := recover(); r != nil {
app.err.Fatalf(lm.RouteCollision, PAGES.Base, r)
}
}()
for _, p := range routePrefixes {
router.GET(p+"/lang/:page", app.GetLanguages)
router.Use(serveTaggedStatic(p+"/", app.webFS))
@@ -126,7 +133,10 @@ func (app *appContext) loadRoutes(router *gin.Engine) {
}
}
router.GET(p+PAGES.Admin+"/accounts", app.AdminPage)
// Handle the obvious collision of /accounts
if p != "" || PAGES.Admin != "" {
router.GET(p+PAGES.Admin+"/accounts", app.AdminPage)
}
router.GET(p+PAGES.Admin+"/settings", app.AdminPage)
router.GET(p+PAGES.Admin+"/activity", app.AdminPage)
router.GET(p+PAGES.Admin+"/accounts/user/:userID", app.AdminPage)