diff --git a/server/app/cleaner.go b/server/app/cleaner.go new file mode 100644 index 0000000..2e48142 --- /dev/null +++ b/server/app/cleaner.go @@ -0,0 +1,16 @@ +package app + +import ( + "time" +) + +func (s *Server) StartCleaner() { + ticker := time.NewTicker(time.Hour * 1) + + go func() { + for { + s.Services.Sessions.Cleanup() + <-ticker.C + } + }() +} diff --git a/server/main.go b/server/main.go index 6f88584..3cb3531 100644 --- a/server/main.go +++ b/server/main.go @@ -49,5 +49,9 @@ func main() { keyProtected := router.Group("/", middleware.KeyAuthMiddleware(server)) keyProtected.POST("/api/sensors/:sensor/values", routes.HandlePostSensorValues(server)) + // Starts session cleanup goroutine + server.StartCleaner() + + // Run the server router.Run(fmt.Sprintf("%s:%d", server.Config.Ip, server.Config.Port)) } diff --git a/server/services/auth_service.go b/server/services/auth_service.go index 81ed1ae..c4b18b9 100644 --- a/server/services/auth_service.go +++ b/server/services/auth_service.go @@ -1,13 +1,27 @@ package services -import "github.com/gin-gonic/gin" +import ( + "time" + + "github.com/gin-gonic/gin" +) type AuthService struct { ctx *Context } +const SESSION_ID string = "session.id" + func (s *AuthService) FromContext(ctx *gin.Context) (*SessionItem, error) { - return s.ctx.Services.Sessions.FromContext(ctx) + session, err := s.getSessionFromContext(ctx) + + if err != nil { + return nil, err + } + + s.ctx.Services.Sessions.Extend(session) + + return session, nil } func (s *AuthService) Login(ctx *gin.Context) error { @@ -17,13 +31,13 @@ func (s *AuthService) Login(ctx *gin.Context) error { return err } - s.ctx.Services.Sessions.ToContext(ctx, session) + ctx.SetCookie(SESSION_ID, session.Id, int(time.Duration(time.Hour*24).Seconds()), "/", "", true, true) return nil } func (s *AuthService) Logout(ctx *gin.Context) error { - session, err := s.ctx.Services.Sessions.FromContext(ctx) + session, err := s.getSessionFromContext(ctx) if err != nil { return err @@ -33,7 +47,17 @@ func (s *AuthService) Logout(ctx *gin.Context) error { return err } - s.ctx.Services.Sessions.ClearContext(ctx) + ctx.SetCookie(SESSION_ID, "", 0, "/", "", true, true) return nil } + +func (s *AuthService) getSessionFromContext(ctx *gin.Context) (*SessionItem, error) { + cookie, err := ctx.Cookie(SESSION_ID) + + if err != nil { + return nil, err + } + + return s.ctx.Services.Sessions.GetById(cookie) +} diff --git a/server/services/sessions_service.go b/server/services/sessions_service.go index 06fb542..7e73841 100644 --- a/server/services/sessions_service.go +++ b/server/services/sessions_service.go @@ -5,8 +5,6 @@ import ( "encoding/hex" "io" "time" - - "github.com/gin-gonic/gin" ) type SessionsService struct { @@ -18,32 +16,6 @@ type SessionItem struct { ExpiresAt int64 `json:"expiresAt"` } -func (s *SessionsService) FromContext(ctx *gin.Context) (*SessionItem, error) { - cookie, err := ctx.Cookie("session.id") - - if err != nil { - return nil, err - } - - session, err := s.GetById(cookie) - - if err != nil { - return nil, err - } - - s.Extend(session) - - return session, nil -} - -func (s *SessionsService) ToContext(ctx *gin.Context, session *SessionItem) { - ctx.SetCookie("session.id", session.Id, int(time.Duration(time.Hour*24).Seconds()), "/", "", true, true) -} - -func (s *SessionsService) ClearContext(ctx *gin.Context) { - ctx.SetCookie("session.id", "", int(time.Duration(time.Hour*24).Seconds()), "/", "", true, true) -} - func (s *SessionsService) GetById(id string) (*SessionItem, error) { item := SessionItem{} @@ -87,6 +59,12 @@ func (s *SessionsService) Extend(session *SessionItem) error { return err } +func (s *SessionsService) Cleanup() error { + _, err := s.ctx.DB.Exec("DELETE FROM sessions WHERE expires_at < ?", time.Now().Unix()) + + return err +} + func generateExpiryDate() time.Time { return time.Now().Add(time.Hour * 24) }