update
This commit is contained in:
parent
73c0340c9e
commit
3f6343127e
4 changed files with 12 additions and 19 deletions
0
.vscode/temp.sql
vendored
Normal file
0
.vscode/temp.sql
vendored
Normal file
|
@ -4,7 +4,6 @@ import "time"
|
||||||
|
|
||||||
// Defaults for sessions.Options
|
// Defaults for sessions.Options
|
||||||
const (
|
const (
|
||||||
DefaultPath = "/"
|
|
||||||
DefaultMaxAge = 60 * 60 * 24 * 30 // 30days
|
DefaultMaxAge = 60 * 60 * 24 * 30 // 30days
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -2,25 +2,16 @@ package store
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/admpub/boltstore/shared"
|
"github.com/admpub/boltstore/shared"
|
||||||
"github.com/admpub/sessions"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Config represents a config for a session store.
|
// Config represents a config for a session store.
|
||||||
type Config struct {
|
type Config struct {
|
||||||
// SessionOptions represents options for a session.
|
|
||||||
SessionOptions sessions.Options
|
|
||||||
// DBOptions represents options for a database.
|
// DBOptions represents options for a database.
|
||||||
DBOptions Options
|
DBOptions Options
|
||||||
}
|
}
|
||||||
|
|
||||||
// setDefault sets default to the config.
|
// setDefault sets default to the config.
|
||||||
func (c *Config) setDefault() {
|
func (c *Config) setDefault() {
|
||||||
if c.SessionOptions.Path == "" {
|
|
||||||
c.SessionOptions.Path = shared.DefaultPath
|
|
||||||
}
|
|
||||||
if c.SessionOptions.MaxAge == 0 {
|
|
||||||
c.SessionOptions.MaxAge = shared.DefaultMaxAge
|
|
||||||
}
|
|
||||||
if c.DBOptions.BucketName == nil {
|
if c.DBOptions.BucketName == nil {
|
||||||
c.DBOptions.BucketName = []byte(shared.DefaultBucketName)
|
c.DBOptions.BucketName = []byte(shared.DefaultBucketName)
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,9 +9,9 @@ import (
|
||||||
"github.com/gogo/protobuf/proto"
|
"github.com/gogo/protobuf/proto"
|
||||||
|
|
||||||
"github.com/admpub/boltstore/shared"
|
"github.com/admpub/boltstore/shared"
|
||||||
|
"github.com/admpub/securecookie"
|
||||||
"github.com/admpub/sessions"
|
"github.com/admpub/sessions"
|
||||||
"github.com/boltdb/bolt"
|
"github.com/boltdb/bolt"
|
||||||
"github.com/gorilla/securecookie"
|
|
||||||
"github.com/webx-top/echo"
|
"github.com/webx-top/echo"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -35,10 +35,9 @@ func (s *Store) Get(ctx echo.Context, name string) (*sessions.Session, error) {
|
||||||
func (s *Store) New(ctx echo.Context, name string) (*sessions.Session, error) {
|
func (s *Store) New(ctx echo.Context, name string) (*sessions.Session, error) {
|
||||||
var err error
|
var err error
|
||||||
session := sessions.NewSession(s, name)
|
session := sessions.NewSession(s, name)
|
||||||
session.Options = &s.config.SessionOptions
|
|
||||||
session.IsNew = true
|
session.IsNew = true
|
||||||
if v := ctx.GetCookie(name); len(v) > 0 {
|
if v := ctx.GetCookie(name); len(v) > 0 {
|
||||||
err = securecookie.DecodeMulti(name, v, &session.ID, s.codecs...)
|
err = securecookie.DecodeMultiWithMaxAge(name, v, &session.ID, ctx.CookieOptions().MaxAge, s.codecs...)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
ok, err := s.load(session)
|
ok, err := s.load(session)
|
||||||
session.IsNew = !(err == nil && ok) // not new if no error and data available
|
session.IsNew = !(err == nil && ok) // not new if no error and data available
|
||||||
|
@ -49,22 +48,22 @@ func (s *Store) New(ctx echo.Context, name string) (*sessions.Session, error) {
|
||||||
|
|
||||||
// Save adds a single session to the response.
|
// Save adds a single session to the response.
|
||||||
func (s *Store) Save(ctx echo.Context, session *sessions.Session) error {
|
func (s *Store) Save(ctx echo.Context, session *sessions.Session) error {
|
||||||
if session.Options.MaxAge < 0 {
|
if ctx.CookieOptions().MaxAge < 0 {
|
||||||
s.delete(session)
|
s.delete(session)
|
||||||
sessions.SetCookie(ctx, session.Name(), "", session.Options)
|
sessions.SetCookie(ctx, session.Name(), "")
|
||||||
} else {
|
} else {
|
||||||
// Build an alphanumeric ID.
|
// Build an alphanumeric ID.
|
||||||
if len(session.ID) == 0 {
|
if len(session.ID) == 0 {
|
||||||
session.ID = strings.TrimRight(base32.StdEncoding.EncodeToString(securecookie.GenerateRandomKey(32)), "=")
|
session.ID = strings.TrimRight(base32.StdEncoding.EncodeToString(securecookie.GenerateRandomKey(32)), "=")
|
||||||
}
|
}
|
||||||
if err := s.save(session); err != nil {
|
if err := s.save(ctx, session); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
encoded, err := securecookie.EncodeMulti(session.Name(), session.ID, s.codecs...)
|
encoded, err := securecookie.EncodeMulti(session.Name(), session.ID, s.codecs...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
sessions.SetCookie(ctx, session.Name(), encoded, session.Options)
|
sessions.SetCookie(ctx, session.Name(), encoded)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -112,14 +111,18 @@ func (s *Store) delete(session *sessions.Session) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// save stores the session data in the database.
|
// save stores the session data in the database.
|
||||||
func (s *Store) save(session *sessions.Session) error {
|
func (s *Store) save(ctx echo.Context, session *sessions.Session) error {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
enc := gob.NewEncoder(&buf)
|
enc := gob.NewEncoder(&buf)
|
||||||
err := enc.Encode(session.Values)
|
err := enc.Encode(session.Values)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
data, err := proto.Marshal(shared.NewSession(buf.Bytes(), session.Options.MaxAge))
|
maxAge := ctx.CookieOptions().MaxAge
|
||||||
|
if maxAge == 0 {
|
||||||
|
maxAge = shared.DefaultMaxAge
|
||||||
|
}
|
||||||
|
data, err := proto.Marshal(shared.NewSession(buf.Bytes(), maxAge))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue