fix: WIP on login regression

This commit is contained in:
jamesread 2025-10-25 00:31:02 +01:00
parent 0dd9e9b2b7
commit a7e7bf869e
1 changed files with 37 additions and 4 deletions

View File

@ -6,6 +6,7 @@ import (
"strings" "strings"
"connectrpc.com/connect" "connectrpc.com/connect"
"github.com/OliveTin/OliveTin/internal/auth"
config "github.com/OliveTin/OliveTin/internal/config" config "github.com/OliveTin/OliveTin/internal/config"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
@ -199,11 +200,43 @@ func UserFromContext[T any](ctx context.Context, req *connect.Request[T], cfg *c
if req != nil { if req != nil {
ret = &AuthenticatedUser{} ret = &AuthenticatedUser{}
ret.Username = getHeaderKeyOrEmpty(req.Header(), "username") // Only trust headers if explicitly configured
ret.UsergroupLine = getHeaderKeyOrEmpty(req.Header(), "usergroup") if cfg.AuthHttpHeaderUsername != "" {
ret.Provider = getHeaderKeyOrEmpty(req.Header(), "provider") ret.Username = getHeaderKeyOrEmpty(req.Header(), cfg.AuthHttpHeaderUsername)
}
buildUserAcls(cfg, ret) if cfg.AuthHttpHeaderUserGroup != "" {
ret.UsergroupLine = getHeaderKeyOrEmpty(req.Header(), cfg.AuthHttpHeaderUserGroup)
}
// Optional provider header; otherwise infer below
prov := getHeaderKeyOrEmpty(req.Header(), "provider")
if prov != "" {
ret.Provider = prov
}
// If no username from headers, fall back to local session cookie
if ret.Username == "" {
// Build a minimal http.Request to parse cookies from headers
dummy := &http.Request{Header: req.Header()}
if c, err := dummy.Cookie("olivetin-sid-local"); err == nil && c != nil && c.Value != "" {
if sess := auth.GetUserSession("local", c.Value); sess != nil {
if u := cfg.FindUserByUsername(sess.Username); u != nil {
ret.Username = u.Username
ret.UsergroupLine = u.Usergroup
ret.Provider = "local"
ret.SID = c.Value
} else {
log.WithFields(log.Fields{"username": sess.Username}).Warn("UserFromContext: local session user not in config")
}
} else {
log.WithFields(log.Fields{"sid": c.Value, "provider": "local"}).Warn("UserFromContext: stale local session")
}
}
}
if ret.Username != "" {
buildUserAcls(cfg, ret)
}
} }
if ret == nil || ret.Username == "" { if ret == nil || ret.Username == "" {