From 00257988ef1707a028cd7dd0b1f8f68e6e8fac53 Mon Sep 17 00:00:00 2001 From: Frédéric Guillot Date: Sat, 16 Dec 2017 18:07:53 -0800 Subject: Session management refactoring --- storage/session.go | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 storage/session.go (limited to 'storage/session.go') diff --git a/storage/session.go b/storage/session.go new file mode 100644 index 0000000..17a63e2 --- /dev/null +++ b/storage/session.go @@ -0,0 +1,77 @@ +// Copyright 2017 Frédéric Guillot. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package storage + +import ( + "database/sql" + "fmt" + + "github.com/miniflux/miniflux/helper" + "github.com/miniflux/miniflux/model" +) + +// CreateSession creates a new session. +func (s *Storage) CreateSession() (*model.Session, error) { + session := model.Session{ + ID: helper.GenerateRandomString(32), + Data: &model.SessionData{CSRF: helper.GenerateRandomString(64)}, + } + + query := "INSERT INTO sessions (id, data) VALUES ($1, $2)" + _, err := s.db.Exec(query, session.ID, session.Data) + if err != nil { + return nil, fmt.Errorf("unable to create session: %v", err) + } + + return &session, nil +} + +// UpdateSessionField updates only one session field. +func (s *Storage) UpdateSessionField(sessionID, field string, value interface{}) error { + query := `UPDATE sessions + SET data = jsonb_set(data, '{%s}', to_jsonb($1::text), true) + WHERE id=$2` + + _, err := s.db.Exec(fmt.Sprintf(query, field), value, sessionID) + if err != nil { + return fmt.Errorf("unable to update session field: %v", err) + } + + return nil +} + +// Session returns the given session. +func (s *Storage) Session(id string) (*model.Session, error) { + var session model.Session + + query := "SELECT id, data FROM sessions WHERE id=$1" + err := s.db.QueryRow(query, id).Scan( + &session.ID, + &session.Data, + ) + + if err == sql.ErrNoRows { + return nil, fmt.Errorf("session not found: %s", id) + } else if err != nil { + return nil, fmt.Errorf("unable to fetch session: %v", err) + } + + return &session, nil +} + +// FlushAllSessions removes all sessions from the database. +func (s *Storage) FlushAllSessions() (err error) { + _, err = s.db.Exec(`DELETE FROM user_sessions`) + if err != nil { + return err + } + + _, err = s.db.Exec(`DELETE FROM sessions`) + if err != nil { + return err + } + + return nil +} -- cgit v1.2.3