From 58aa71997dc19c7dbc4133b208752d5da7d5937b Mon Sep 17 00:00:00 2001 From: Prad Nukala Date: Fri, 11 Oct 2024 19:03:14 -0400 Subject: [PATCH] feat: introduce AuthState enum for authentication state --- internal/ctx/session.go | 10 ++++++++ internal/ctx/state.go | 38 +++++++++++------------------ internal/ctx/store.go | 22 ----------------- pkg/nebula/components/home/route.go | 5 +++- 4 files changed, 28 insertions(+), 47 deletions(-) diff --git a/internal/ctx/session.go b/internal/ctx/session.go index 1117a8400..227645af6 100644 --- a/internal/ctx/session.go +++ b/internal/ctx/session.go @@ -45,6 +45,16 @@ func SessionMiddleware(next echo.HandlerFunc) echo.HandlerFunc { } } +func defaultSession(id string, s *sessions.Session) *session { + return &session{ + session: s, + id: id, + origin: "", + address: "", + chainID: "", + } +} + func getSessionID(ctx context.Context) (string, error) { sessionID, ok := ctx.Value(ctxKeySessionID{}).(string) if !ok || sessionID == "" { diff --git a/internal/ctx/state.go b/internal/ctx/state.go index a0c24662e..b0988ac8c 100644 --- a/internal/ctx/state.go +++ b/internal/ctx/state.go @@ -2,38 +2,28 @@ package ctx import "github.com/labstack/echo/v4" -type State string +type AuthState string const ( - StateAuthenticated State = "authenticated" - StateUnauthenticated State = "unauthenticated" - StatePendingCredentials State = "pending_credentials" - StatePendingAssertion State = "pending_assertion" - StateDisabled State = "disabled" - StateDisconnected State = "disconnected" + Visitor AuthState = "visitor" + Authenticated AuthState = "authenticated" + Expired AuthState = "expired" + + PendingCredentials AuthState = "pending_credentials" + PendingAssertion AuthState = "pending_assertion" ) -func (s State) String() string { +func (s AuthState) String() string { return string(s) } -func StateFromString(s string) State { - switch s { - case StateAuthenticated.String(): - return StateAuthenticated - case StateUnauthenticated.String(): - return StateUnauthenticated - case StatePendingCredentials.String(): - return StatePendingCredentials - case StatePendingAssertion.String(): - return StatePendingAssertion - case StateDisabled.String(): - return StateDisabled - case StateDisconnected.String(): - return StateDisconnected - default: - return State("") +func GetAuthState(c echo.Context) AuthState { + vals := c.Request().Header.Values("Authorization") + if len(vals) == 0 { + return Visitor } + s := AuthState(c.Request().Header.Get("Authorization")) + return s } func readSessionFromStore(c echo.Context, id string) (*session, error) { diff --git a/internal/ctx/store.go b/internal/ctx/store.go index 553b01908..55c0bf299 100644 --- a/internal/ctx/store.go +++ b/internal/ctx/store.go @@ -20,28 +20,15 @@ type Session interface { GetChallenge(subject string) (WebBytes, error) ValidateChallenge(challenge WebBytes, subject string) error - IsState(State) bool SaveHTTP(c echo.Context) error } -func defaultSession(id string, s *sessions.Session) *session { - return &session{ - session: s, - id: id, - origin: "", - address: "", - chainID: "", - state: StateUnauthenticated, - } -} - func NewSessionFromValues(vals map[interface{}]interface{}) *session { s := &session{ id: vals["id"].(string), origin: vals["origin"].(string), address: vals["address"].(string), chainID: vals["chainID"].(string), - state: StateFromString(vals["state"].(string)), challenge: vals["challenge"].(WebBytes), subject: vals["subject"].(string), } @@ -61,9 +48,6 @@ type session struct { // Authentication challenge WebBytes // Webauthn mapping to Challenge; Per session based on origin subject string // Webauthn mapping to User Displayable Name; Supplied by DWN frontend - - // State - state State } func (s *session) ID() string { @@ -97,14 +81,9 @@ func (s *session) ValidateChallenge(challenge WebBytes, subject string) error { return fmt.Errorf("invalid challenge") } s.subject = subject - s.state = StateAuthenticated return nil } -func (s *session) IsState(state State) bool { - return s.state == state -} - func (s *session) SaveHTTP(c echo.Context) error { sess, err := store.Get(c.Request(), s.id) if err != nil { @@ -123,7 +102,6 @@ func (s *session) Values() map[interface{}]interface{} { vals["id"] = s.id vals["address"] = s.address vals["chainID"] = s.chainID - vals["state"] = s.state vals["challenge"] = s.challenge vals["subject"] = s.subject return vals diff --git a/pkg/nebula/components/home/route.go b/pkg/nebula/components/home/route.go index 737d37843..30e9604d0 100644 --- a/pkg/nebula/components/home/route.go +++ b/pkg/nebula/components/home/route.go @@ -10,6 +10,9 @@ import ( func Route(c echo.Context) error { s := ctx.GetSession(c) - log.Println(s.ID()) + log.Printf("Session ID: %s", s.ID()) + log.Printf("Session Origin: %s", s.Origin()) + log.Printf("Session Address: %s", s.Address()) + log.Printf("Session ChainID: %s", s.ChainID()) return ctx.RenderTempl(c, View()) }