diff --git a/.github/goreportcard-report.md b/.github/goreportcard-report.md index 8521ae7..6d98af8 100644 --- a/.github/goreportcard-report.md +++ b/.github/goreportcard-report.md @@ -1,11 +1,11 @@ # Go Report Card -**Grade: A+** (98.4%) +**Grade: A+** (100.0%) | Metric | Value | | ------ | ----- | | Files | 22 | -| Issues | 3 | +| Issues | 0 | ## Checks @@ -13,22 +13,12 @@ | ----- | ----- | | gofmt | 100% | | go_vet | 100% | -| gocyclo | 86% | +| gocyclo | 100% | | ineffassign | 100% | | license | 100% | | misspell | 100% | -## Issues - -### gocyclo - -- `checker.go` - - Line 173: cyclomatic complexity 22 for function (*SessionChecker).Check -- `handler.go` - - Line 184: cyclomatic complexity 17 for function (*Handler).refreshAuthInfo - - Line 118: cyclomatic complexity 17 for function (*Handler).Check -- `config.go` - - Line 219: cyclomatic complexity 16 for function (*Config).ApplyDefaults +No issues found. Nice work! --- diff --git a/checker.go b/checker.go index 53e1706..e1a96e5 100644 --- a/checker.go +++ b/checker.go @@ -192,33 +192,10 @@ func (c *SessionChecker) Check(ctx Context, sess Session) (*AuthResult, error) { AuthMethod: AuthMethodSession, } - // Get user ID - if val := sess.Get(KeyUserID); val != nil { - if id, ok := val.(string); ok { - result.UserID = id - } - } - - // Get email - if val := sess.Get(KeyUserMail); val != nil { - if mail, ok := val.(string); ok { - result.Email = mail - } - } - - // Get phone - if val := sess.Get(KeyUserPhone); val != nil { - if phone, ok := val.(string); ok { - result.Phone = phone - } - } - - // Get name - if val := sess.Get(KeyUserName); val != nil { - if name, ok := val.(string); ok { - result.Name = name - } - } + result.UserID, _ = sess.Get(KeyUserID).(string) + result.Email, _ = sess.Get(KeyUserMail).(string) + result.Phone, _ = sess.Get(KeyUserPhone).(string) + result.Name, _ = sess.Get(KeyUserName).(string) // Get scopes if val := sess.Get(KeyUserScope); val != nil { @@ -230,12 +207,7 @@ func (c *SessionChecker) Check(ctx Context, sess Session) (*AuthResult, error) { } } - // Get role - if val := sess.Get(KeyUserRole); val != nil { - if role, ok := val.(string); ok { - result.Role = role - } - } + result.Role, _ = sess.Get(KeyUserRole).(string) // Get AMR if val := sess.Get(KeyUserAMR); val != nil { diff --git a/config.go b/config.go index 6686afb..c4be971 100644 --- a/config.go +++ b/config.go @@ -237,27 +237,8 @@ func (c *Config) ApplyDefaults() { if c.AuthRefreshInterval == 0 { c.AuthRefreshInterval = defaults.AuthRefreshInterval } - if c.UserHeaderName == "" { - c.UserHeaderName = defaults.UserHeaderName - } - if c.AuthUserHeader == "" { - c.AuthUserHeader = defaults.AuthUserHeader - } - if c.AuthEmailHeader == "" { - c.AuthEmailHeader = defaults.AuthEmailHeader - } - if c.AuthNameHeader == "" { - c.AuthNameHeader = defaults.AuthNameHeader - } - if c.AuthScopesHeader == "" { - c.AuthScopesHeader = defaults.AuthScopesHeader - } - if c.AuthRoleHeader == "" { - c.AuthRoleHeader = defaults.AuthRoleHeader - } - if c.AuthAMRHeader == "" { - c.AuthAMRHeader = defaults.AuthAMRHeader - } + c.applyHeaderDefaults(defaults) + if c.LoginPath == "" { c.LoginPath = defaults.LoginPath } @@ -364,3 +345,27 @@ func ProxySecretTrustFunc(header, secret string) func(c Context) bool { return subtle.ConstantTimeCompare([]byte(got), want) == 1 } } + +func (c *Config) applyHeaderDefaults(defaults Config) { + if c.UserHeaderName == "" { + c.UserHeaderName = defaults.UserHeaderName + } + if c.AuthUserHeader == "" { + c.AuthUserHeader = defaults.AuthUserHeader + } + if c.AuthEmailHeader == "" { + c.AuthEmailHeader = defaults.AuthEmailHeader + } + if c.AuthNameHeader == "" { + c.AuthNameHeader = defaults.AuthNameHeader + } + if c.AuthScopesHeader == "" { + c.AuthScopesHeader = defaults.AuthScopesHeader + } + if c.AuthRoleHeader == "" { + c.AuthRoleHeader = defaults.AuthRoleHeader + } + if c.AuthAMRHeader == "" { + c.AuthAMRHeader = defaults.AuthAMRHeader + } +} diff --git a/go.mod b/go.mod index a531b25..5cb597b 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( ) require ( - github.com/gofiber/schema v1.9.1 // indirect + github.com/gofiber/schema v1.9.2 // indirect github.com/gofiber/utils/v2 v2.6.3 // indirect github.com/google/uuid v1.6.0 // indirect github.com/klauspost/compress v1.20.3 // indirect @@ -19,7 +19,7 @@ require ( github.com/tinylib/msgp v1.6.5 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.77.0 // indirect - go.yaml.in/yaml/v3 v3.0.5 // indirect + go.yaml.in/yaml/v3 v3.0.6 // indirect golang.org/x/crypto v0.58.0 // indirect golang.org/x/net v0.62.0 // indirect golang.org/x/sys v0.49.0 // indirect diff --git a/go.sum b/go.sum index c67d797..e05ebf9 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,8 @@ github.com/fxamacker/cbor/v2 v2.9.6 h1:NHZPxuUjJXQjX9itA785y/5NKSlI4HQ+S7noZsmI7 github.com/fxamacker/cbor/v2 v2.9.6/go.mod h1:4EaZp6ClVunETjQ4GHmGNzysDK91Lr+r6Yz6tJqzVCw= github.com/gofiber/fiber/v3 v3.6.1 h1:wYjbgqpJm6VErIVLSGzGpX7lLZyTNgElsj8nQ1i+iFo= github.com/gofiber/fiber/v3 v3.6.1/go.mod h1:+nxjBal3gw0EPf3gqK5EmtxaxTL01+zbSTagFletlDI= -github.com/gofiber/schema v1.9.1 h1:QjicFdTDMlkzCOoZAlNWqdkR2YHhgH8/Q/MpcbHurjs= -github.com/gofiber/schema v1.9.1/go.mod h1:219nYAgzIEBWl/aHCyhQtFoXBvfLjsC6+FI3DUN1+Ck= +github.com/gofiber/schema v1.9.2 h1:Gzw2PF1K5DpWgG2L51/9t9dkmxw4kqK6auKMvgD9mIU= +github.com/gofiber/schema v1.9.2/go.mod h1:219nYAgzIEBWl/aHCyhQtFoXBvfLjsC6+FI3DUN1+Ck= github.com/gofiber/utils/v2 v2.6.3 h1:VlnOB89rFnonlXoYOkESOkXtIkAw4CBBwpBHu+/a/YQ= github.com/gofiber/utils/v2 v2.6.3/go.mod h1:Mq3OXwyBPxORb3jPafy6Swki4/TJJW9TDPHeerXkXpg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -30,8 +30,8 @@ github.com/valyala/fasthttp v1.77.0 h1:6mxBJdHabRmU4Cmw79Uqhgvjzsp6pjOaQk2t8COfl github.com/valyala/fasthttp v1.77.0/go.mod h1:m8oTPC8riDDky07invpl+Gz3RixnAN5BbwyUuVB5H2o= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= -go.yaml.in/yaml/v3 v3.0.5 h1:N6y/pJk8buWs9NY5ERU2HSMfm+IuD/OtfdAnq6kESPw= -go.yaml.in/yaml/v3 v3.0.5/go.mod h1:HVTZu1O7/Vkt2N+BFy8Zza+lnLsABggaTM2ZpNIGuKg= +go.yaml.in/yaml/v3 v3.0.6 h1:zcDfvjXEqTQmpjniUBLc91xYJMB2c4QOFxEF/LCEckM= +go.yaml.in/yaml/v3 v3.0.6/go.mod h1:HVTZu1O7/Vkt2N+BFy8Zza+lnLsABggaTM2ZpNIGuKg= golang.org/x/crypto v0.58.0 h1:COkYLr4k7nDI4r6QtMML2AfzeIswWHAJthLS6K/M/54= golang.org/x/crypto v0.58.0/go.mod h1:Xh+kl5A+M0gMiWDytH2Hhr5Z7WbNCpv/eB/EFgfSk+w= golang.org/x/net v0.62.0 h1:18ELalfM5+XNRwzM2nYqXsZQ9ByS1uhj2O/U7+5jqRY= diff --git a/handler.go b/handler.go index 94a9e45..7660971 100644 --- a/handler.go +++ b/handler.go @@ -116,33 +116,7 @@ func (h *Handler) ServeWithStore(c Context, store SessionStore) error { // Check performs the full authentication check. func (h *Handler) Check(c Context, sess Session) (*AuthResult, error) { - var lastErr error - var result *AuthResult - - // Try each checker in priority order - for _, checker := range h.checkers { - r, err := checker.Check(c, sess) - if err != nil { - lastErr = err - if h.config.Logger != nil { - h.config.Logger.Debug(). - Str("checker", checker.Name()). - Err(err). - Msg("Auth checker failed") - } - continue - } - if r != nil && r.Authenticated { - result = r - if h.config.Logger != nil { - h.config.Logger.Debug(). - Str("checker", checker.Name()). - Str("method", r.AuthMethod.String()). - Msg("Authentication successful") - } - break - } - } + result, lastErr := h.checkAuthentication(c, sess) if result == nil { if lastErr != nil { @@ -186,20 +160,8 @@ func (h *Handler) refreshAuthInfo(c Context, sess Session, result *AuthResult) { return } - userPhone := "" - userMail := "" - - // Get identifiers from session - if val := sess.Get(KeyUserPhone); val != nil { - if phone, ok := val.(string); ok { - userPhone = phone - } - } - if val := sess.Get(KeyUserMail); val != nil { - if mail, ok := val.(string); ok { - userMail = mail - } - } + userPhone, _ := sess.Get(KeyUserPhone).(string) + userMail, _ := sess.Get(KeyUserMail).(string) if userPhone == "" && userMail == "" { return @@ -451,3 +413,35 @@ func (h *Handler) stepUpRequiredFor(c Context) bool { } return false } + +func (h *Handler) checkAuthentication(c Context, sess Session) (*AuthResult, error) { + var lastErr error + var result *AuthResult + + // Try each checker in priority order + for _, checker := range h.checkers { + r, err := checker.Check(c, sess) + if err != nil { + lastErr = err + if h.config.Logger != nil { + h.config.Logger.Debug(). + Str("checker", checker.Name()). + Err(err). + Msg("Auth checker failed") + } + continue + } + if r != nil && r.Authenticated { + result = r + if h.config.Logger != nil { + h.config.Logger.Debug(). + Str("checker", checker.Name()). + Str("method", r.AuthMethod.String()). + Msg("Authentication successful") + } + break + } + } + + return result, lastErr +}