Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 4 additions & 14 deletions .github/goreportcard-report.md
Original file line number Diff line number Diff line change
@@ -1,34 +1,24 @@
# Go Report Card

**Grade: A+** (98.4%)
**Grade: A+** (100.0%)

| Metric | Value |
| ------ | ----- |
| Files | 22 |
| Issues | 3 |
| Issues | 0 |

## Checks

| Check | Score |
| ----- | ----- |
| 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!

---

Expand Down
38 changes: 5 additions & 33 deletions checker.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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 {
Expand Down
47 changes: 26 additions & 21 deletions config.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down Expand Up @@ -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
}
}
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
8 changes: 4 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -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=
Expand All @@ -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=
Expand Down
76 changes: 35 additions & 41 deletions handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
}
Loading