fix(plugins): don't log "no proxy IP found" when using Subsonic API in plugins with reverse proxy auth (#4388)

* fix(auth): Do not try reverse proxy auth if internal auth succeeds

* cmp.Or will still require function results to be evaluated...

* move to a function
This commit is contained in:
Kendall Garner
2025-07-28 14:18:49 +00:00
committed by GitHub
parent 5ea14ba520
commit d75ebc5efd
+16 -5
View File
@@ -47,11 +47,23 @@ func postFormToQueryParams(next http.Handler) http.Handler {
}) })
} }
func fromInternalOrProxyAuth(r *http.Request) (string, bool) {
username := server.InternalAuth(r)
// If the username comes from internal auth, do not also do reverse proxy auth, as
// the request will have no reverse proxy IP
if username != "" {
return username, true
}
return server.UsernameFromReverseProxyHeader(r), false
}
func checkRequiredParameters(next http.Handler) http.Handler { func checkRequiredParameters(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var requiredParameters []string var requiredParameters []string
username := cmp.Or(server.InternalAuth(r), server.UsernameFromReverseProxyHeader(r)) username, _ := fromInternalOrProxyAuth(r)
if username != "" { if username != "" {
requiredParameters = []string{"v", "c"} requiredParameters = []string{"v", "c"}
} else { } else {
@@ -91,10 +103,9 @@ func authenticate(ds model.DataStore) func(next http.Handler) http.Handler {
var usr *model.User var usr *model.User
var err error var err error
internalAuth := server.InternalAuth(r) username, isInternalAuth := fromInternalOrProxyAuth(r)
proxyAuth := server.UsernameFromReverseProxyHeader(r) if username != "" {
if username := cmp.Or(internalAuth, proxyAuth); username != "" { authType := If(isInternalAuth, "internal", "reverse-proxy")
authType := If(internalAuth != "", "internal", "reverse-proxy")
usr, err = ds.User(ctx).FindByUsername(username) usr, err = ds.User(ctx).FindByUsername(username)
if errors.Is(err, context.Canceled) { if errors.Is(err, context.Canceled) {
log.Debug(ctx, "API: Request canceled when authenticating", "auth", authType, "username", username, "remoteAddr", r.RemoteAddr, err) log.Debug(ctx, "API: Request canceled when authenticating", "auth", authType, "username", username, "remoteAddr", r.RemoteAddr, err)