aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--walrss/internal/http/auth.go17
-rw-r--r--walrss/internal/http/http.go26
2 files changed, 39 insertions, 4 deletions
diff --git a/walrss/internal/http/auth.go b/walrss/internal/http/auth.go
index eff478d..62e4295 100644
--- a/walrss/internal/http/auth.go
+++ b/walrss/internal/http/auth.go
@@ -12,6 +12,10 @@ import (
func (s *Server) authRegister(ctx *fiber.Ctx) error {
page := new(views.RegisterPage)
+ if getCurrentUserID(ctx) != "" {
+ goto success
+ }
+
if ctx.Method() == fiber.MethodPost {
password := ctx.FormValue("password")
passwordConfirmation := ctx.FormValue("passwordConfirmation")
@@ -44,16 +48,22 @@ func (s *Server) authRegister(ctx *fiber.Ctx) error {
HTTPOnly: true,
})
- return ctx.Redirect(urls.Index)
+ goto success
}
exit:
return views.SendPage(ctx, page)
+success:
+ return ctx.Redirect(urls.Index)
}
func (s *Server) authSignIn(ctx *fiber.Ctx) error {
page := &views.SignInPage{}
+ if getCurrentUserID(ctx) != "" {
+ goto success
+ }
+
if ctx.Method() == fiber.MethodPost {
email := ctx.FormValue("email")
@@ -88,11 +98,12 @@ func (s *Server) authSignIn(ctx *fiber.Ctx) error {
HTTPOnly: true,
})
- return ctx.Redirect(urls.Index)
+ goto success
}
return views.SendPage(ctx, page)
-
+success:
+ return ctx.Redirect(urls.Index)
incorrectUsernameOrPassword:
ctx.Status(fiber.StatusUnauthorized)
return views.SendPage(ctx, &views.SignInPage{Problem: "Incorrect username or password"})
diff --git a/walrss/internal/http/http.go b/walrss/internal/http/http.go
index 92829f7..037e310 100644
--- a/walrss/internal/http/http.go
+++ b/walrss/internal/http/http.go
@@ -12,6 +12,7 @@ import (
const (
sessionCookieKey = "walrss-session"
sessionDuration = (time.Hour * 24) * 7 // 7 days
+ userIDLocalKey = "userID"
)
type Server struct {
@@ -54,6 +55,19 @@ func New(st *state.State) (*Server, error) {
}
func (s *Server) registerHandlers() {
+ s.app.Use(func(ctx *fiber.Ctx) error {
+ if token := ctx.Cookies(sessionCookieKey); token != "" {
+ log.Debug().Msgf("cookie %s=%s", sessionCookieKey, token)
+ userID, createdAt, err := core.ValidateSessionToken(token)
+ if err == nil && time.Now().Sub(createdAt) < sessionDuration {
+ log.Debug().Msg("session valid")
+ ctx.Locals(userIDLocalKey, userID)
+ }
+ }
+
+ return ctx.Next()
+ })
+
s.app.Get(urls.AuthRegister, s.authRegister)
s.app.Post(urls.AuthRegister, s.authRegister)
@@ -65,7 +79,17 @@ func (s *Server) Run() error {
return s.app.Listen(s.state.Config.GetHTTPAddress())
}
-func UserErrorToResponse(ctx *fiber.Ctx, ue core.UserError) error {
+func userErrorToResponse(ctx *fiber.Ctx, ue core.UserError) error {
ctx.Status(ue.Status)
return ctx.SendString(ue.Error())
}
+
+func getCurrentUserID(ctx *fiber.Ctx) string {
+ if x := ctx.Locals(userIDLocalKey); x != nil {
+ s, ok := x.(string)
+ if ok {
+ return s
+ }
+ }
+ return ""
+}