form: allow relative redirect_url

EvaluateRelativePath will un-relative-ize a path if it is relative (has
a preceding /) in the same way as app.ExternalURI() roughly. Should fix #414.
This commit is contained in:
Harvey Tindall
2025-07-16 18:47:32 +01:00
parent 7cb66e26e5
commit bcb6346f81
2 changed files with 23 additions and 4 deletions
+19
View File
@@ -47,6 +47,10 @@ func (app *appContext) MustSetURLPath(section, key, val string) {
} }
func FixFullURL(v string) string { func FixFullURL(v string) string {
// Keep relative paths relative
if strings.HasPrefix(v, "/") {
return v
}
if !strings.HasPrefix(v, "http://") && !strings.HasPrefix(v, "https://") { if !strings.HasPrefix(v, "http://") && !strings.HasPrefix(v, "https://") {
v = "http://" + v v = "http://" + v
} }
@@ -98,6 +102,21 @@ func (app *appContext) ExternalURI(gc *gin.Context) string {
return app.externalURI return app.externalURI
} }
func (app *appContext) EvaluateRelativePath(gc *gin.Context, path string) string {
if !strings.HasPrefix(path, "/") {
return path
}
var proto string
if gc.Request.TLS != nil || gc.Request.Header.Get("X-Forwarded-Proto") == "https" || gc.Request.Header.Get("X-Forwarded-Protocol") == "https" {
proto = "https://"
} else {
proto = "http://"
}
return proto + app.ExternalDomain(gc) + path
}
func (app *appContext) loadConfig() error { func (app *appContext) loadConfig() error {
var err error var err error
app.config, err = ini.ShadowLoad(app.configPath) app.config, err = ini.ShadowLoad(app.configPath)
+4 -4
View File
@@ -236,7 +236,7 @@ func (app *appContext) MyUserPage(gc *gin.Context) {
"validationStrings": app.storage.lang.User[lang].validationStringsJSON, "validationStrings": app.storage.lang.User[lang].validationStringsJSON,
"language": app.storage.lang.User[lang].JSON, "language": app.storage.lang.User[lang].JSON,
"langName": lang, "langName": lang,
"jfLink": app.config.Section("ui").Key("redirect_url").String(), "jfLink": app.EvaluateRelativePath(gc, app.config.Section("ui").Key("redirect_url").String()),
"requirements": app.validator.getCriteria(), "requirements": app.validator.getCriteria(),
} }
if telegramEnabled { if telegramEnabled {
@@ -305,7 +305,7 @@ func (app *appContext) ResetPassword(gc *gin.Context) {
if setPassword { if setPassword {
data["helpMessage"] = app.config.Section("ui").Key("help_message").String() data["helpMessage"] = app.config.Section("ui").Key("help_message").String()
data["successMessage"] = app.config.Section("ui").Key("success_message").String() data["successMessage"] = app.config.Section("ui").Key("success_message").String()
data["jfLink"] = app.config.Section("ui").Key("redirect_url").String() data["jfLink"] = app.EvaluateRelativePath(gc, app.config.Section("ui").Key("redirect_url").String())
data["redirectToJellyfin"] = app.config.Section("ui").Key("auto_redirect").MustBool(false) data["redirectToJellyfin"] = app.config.Section("ui").Key("auto_redirect").MustBool(false)
data["validate"] = app.config.Section("password_validation").Key("enabled").MustBool(false) data["validate"] = app.config.Section("password_validation").Key("enabled").MustBool(false)
data["requirements"] = app.validator.getCriteria() data["requirements"] = app.validator.getCriteria()
@@ -688,7 +688,7 @@ func (app *appContext) NewUserFromConfirmationKey(invite Invite, key string, lan
app.PostNewUserFromInvite(nu, req, profile, invite) app.PostNewUserFromInvite(nu, req, profile, invite)
jfLink := app.config.Section("ui").Key("redirect_url").String() jfLink := app.EvaluateRelativePath(gc, app.config.Section("ui").Key("redirect_url").String())
if app.config.Section("ui").Key("auto_redirect").MustBool(false) { if app.config.Section("ui").Key("auto_redirect").MustBool(false) {
gc.Redirect(301, jfLink) gc.Redirect(301, jfLink)
} else { } else {
@@ -756,7 +756,7 @@ func (app *appContext) InviteProxy(gc *gin.Context) {
"contactMessage": app.config.Section("ui").Key("contact_message").String(), "contactMessage": app.config.Section("ui").Key("contact_message").String(),
"helpMessage": app.config.Section("ui").Key("help_message").String(), "helpMessage": app.config.Section("ui").Key("help_message").String(),
"successMessage": app.config.Section("ui").Key("success_message").String(), "successMessage": app.config.Section("ui").Key("success_message").String(),
"jfLink": app.config.Section("ui").Key("redirect_url").String(), "jfLink": app.EvaluateRelativePath(gc, app.config.Section("ui").Key("redirect_url").String()),
"redirectToJellyfin": app.config.Section("ui").Key("auto_redirect").MustBool(false), "redirectToJellyfin": app.config.Section("ui").Key("auto_redirect").MustBool(false),
"validate": app.config.Section("password_validation").Key("enabled").MustBool(false), "validate": app.config.Section("password_validation").Key("enabled").MustBool(false),
"requirements": app.validator.getCriteria(), "requirements": app.validator.getCriteria(),