func (s *Store) save(session *sessions.Session) error { encoded, err := securecookie.EncodeMulti(session.Name(), session.Values, s.codecs...) if err != nil { return err } var expiresOn time.Time exOn := session.Values["expires_on"] if exOn == nil { expiresOn = time.Now().Add(time.Second * time.Duration(session.Options.MaxAge)) } else { expiresOn = exOn.(time.Time) if expiresOn.Sub(time.Now().Add(time.Second*time.Duration(session.Options.MaxAge))) < 0 { expiresOn = time.Now().Add(time.Second * time.Duration(session.Options.MaxAge)) } } ss := &Session{ Key: session.ID, Data: encoded, ExpiresOn: expiresOn, } if session.IsNew { return s.q.SaveSession(ss) } return s.q.UpdateSession(ss) }
func (s *RedisStore) save(session *sessions.Session) error { encoded, err := securecookie.EncodeMulti(session.Name(), session.Values, s.Codecs...) if err != nil { return err } c := s.storeHandler.GetRedisConnection() defer c.Close() if session.ID == "" { // Because the ID is used in the filename, encode it to // use alphanumeric characters only. session.ID = strings.TrimRight(base32.StdEncoding.EncodeToString(securecookie.GenerateRandomKey(32)), "=") } c.Send("SET", "morioka_sess_"+session.ID, encoded) if err = c.Flush(); err != nil { return err } if _, err = c.Receive(); err != nil { return err } c.Send("EXPIRE", "morioka_sess_"+session.ID, 86400) if err = c.Flush(); err != nil { return err } if _, err = c.Receive(); err != nil { return err } return nil }
func (s *RethinkDBStore) save(session *sessions.Session) error { values := map[string]interface{}{} for k, v := range session.Values { kstr, ok := k.(string) if !ok { return errors.New("cannot serialize non-string value key") } values[kstr] = v } json := map[string]interface{}{ "name": session.Name(), "values": values, } var write gorethink.WriteResponse var err error if session.ID != "" { write, err = s.term.Get(session.ID).Update(json).RunWrite(s.rethinkdbSession) if err == nil && write.Updated == 0 { json["id"] = session.ID } } if write.Updated == 0 { write, err = s.term.Insert(json).RunWrite(s.rethinkdbSession) if err == nil && len(write.GeneratedKeys) > 0 { session.ID = write.GeneratedKeys[0] } } return err }
func (m *MongoStore) upsert(session *sessions.Session) error { if !bson.IsObjectIdHex(session.ID) { return ErrInvalidId } var modified time.Time if val, ok := session.Values["modified"]; ok { modified, ok = val.(time.Time) if !ok { return errors.New("mongostore: invalid modified value") } } else { modified = time.Now() } encoded, err := securecookie.EncodeMulti(session.Name(), session.Values, m.Codecs...) if err != nil { return err } s := Session{ Id: bson.ObjectIdHex(session.ID), Data: encoded, Modified: modified, } _, err = m.coll.UpsertId(s.Id, &s) if err != nil { return err } return nil }
// load reads a file and decodes its content into session.Values. func (s *DumbMemoryStore) load(session *sessions.Session) error { if err := securecookie.DecodeMulti(session.Name(), string(s.Data[session.ID]), &session.Values, s.Codecs...); err != nil { return err } return nil }
//load fetches a session by ID from the database and decodes its content into session.Values func (db *PGStore) load(session *sessions.Session) error { s, err := query.GetSessionByKey(session.ID) if err != nil { return err } return securecookie.DecodeMulti(session.Name(), string(s.Data), &session.Values, db.Codecs...) }
//load fetches a session by ID from the database and decodes its content into session.Values func (s *Store) load(session *sessions.Session) error { ss, err := s.q.GetSessionByKey(session.ID) if err != nil { return err } return securecookie.DecodeMulti(session.Name(), string(ss.Data), &session.Values, s.codecs...) }
func (s *Store) destroy(r *http.Request, w http.ResponseWriter, session *sessions.Session) error { options := *s.options options.MaxAge = -1 http.SetCookie(w, sessions.NewCookie(session.Name(), "", &options)) for k := range session.Values { delete(session.Values, k) } return s.q.DeleteSession(session.ID) }
func saveCookie(w http.ResponseWriter, s *sessions.Session, store *sessions.CookieStore) (string, error) { encoded, err := securecookie.EncodeMulti(s.Name(), s.Values, store.Codecs...) if err != nil { return "", err } cookie := sessions.NewCookie(s.Name(), encoded, s.Options) http.SetCookie(w, cookie) return cookie.Value, nil }
// save writes encoded session.Values using the memcache client func (s *DumbMemoryStore) save(session *sessions.Session) error { encoded, err := securecookie.EncodeMulti(session.Name(), session.Values, s.Codecs...) if err != nil { return err } s.Data[session.ID] = encoded return nil }
// load fetches a session by ID from the database and decodes its content // into session.Values func (db *PGStore) load(session *sessions.Session) error { var s Session err := db.DbMap.SelectOne(&s, "SELECT * FROM http_sessions WHERE key = $1", session.ID) if err := securecookie.DecodeMulti(session.Name(), string(s.Data), &session.Values, db.Codecs...); err != nil { return err } return err }
func (s *RethinkDBStore) Save(r *http.Request, w http.ResponseWriter, session *sessions.Session) error { if err := s.save(session); err != nil { return err } encoded, err := securecookie.EncodeMulti(session.Name(), session.ID, s.Codecs...) if err != nil { return err } http.SetCookie(w, sessions.NewCookie(session.Name(), encoded, session.Options)) return nil }
// save writes encoded session.Values to a database record. // writes to http_sessions table by default. func (db *DatabaseStore) save(session *sessions.Session) error { encoded, err := securecookie.EncodeMulti(session.Name(), session.Values, db.Codecs...) if err != nil { return err } fn := func(dbConn *sql.DB) error { // Write record to sessions table. var sessionCount int = -1 // Session exists? row := dbConn.QueryRow("SELECT COUNT(key) AS count FROM \""+SESSIONS_TABLE+"\" WHERE key = $1", session.ID) err := row.Scan(&sessionCount) if err != nil { return err } tx, err := dbConn.Begin() if err != nil { return err } if sessionCount > 0 { // update _, err = tx.Exec("UPDATE \""+SESSIONS_TABLE+"\" SET data = $1 WHERE key = $2", encoded, session.ID) if err != nil { return err } } else if sessionCount == 0 { // insert _, err = tx.Exec("INSERT INTO \""+SESSIONS_TABLE+"\" (key, data) VALUES($1,$2)", session.ID, encoded) if err != nil { return err } } else { // error err = errors.New("There was an error while trying to lookup a previous session.") return err } if err = tx.Commit(); err != nil { return err } return nil } return dbLib.ExecuteFn(fn) }
// Save saves a session to the store. If the session has no ID, Save assigns // a random one. This implementation of Save never returns a non-nil error // if client is storing sessions data in a *RamSessions instance. func (s *RAMStore) Save(r *http.Request, w http.ResponseWriter, session *sessions.Session) error { if session.ID == "" { session.ID = strings.TrimRight( base32.StdEncoding.EncodeToString( securecookie.GenerateRandomKey(32)), "=") } if err := s.save(session); err != nil { return err } http.SetCookie(w, sessions.NewCookie(session.Name(), session.ID, session.Options)) return nil }
// load reads from redis and decodes its content into session.Values. func (s *RedisStore) load(session *sessions.Session) error { c := s.redisPool.Get() defer c.Close() encoded, err := redis.String(c.Do("GET", "s:"+session.ID)) if err != nil { return err } return securecookie.DecodeMulti(session.Name(), encoded, &session.Values, s.Codecs...) }
// save stores the session in redis. func (s *RediStore) save(session *sessions.Session) error { encoded, err := securecookie.EncodeMulti(session.Name(), session.Values, s.Codecs...) if err != nil { return err } conn := s.Pool.Get() defer conn.Close() if err = conn.Err(); err != nil { return err } _, err = conn.Do("SETEX", "session_"+session.ID, session.Options.MaxAge, encoded) return err }
func (s *RedisStore) load(session *sessions.Session) error { c := s.storeHandler.GetRedisConnection() defer c.Close() c.Send("GET", "morioka_sess_"+session.ID) c.Flush() data, err := redis.String(c.Receive()) if err != nil { return err } if err = securecookie.DecodeMulti(session.Name(), data, &session.Values, s.Codecs...); err != nil { return err } return nil }
func (m *SqliteStore) Save(r *http.Request, w http.ResponseWriter, session *sessions.Session) error { var err error if session.ID == "" { if err = m.insert(session); err != nil { return err } } else if err = m.save(session); err != nil { return err } encoded, err := securecookie.EncodeMulti(session.Name(), session.ID, m.Codecs...) if err != nil { return err } http.SetCookie(w, sessions.NewCookie(session.Name(), encoded, session.Options)) return nil }
// Delete removes the session from redis, and sets the cookie to expire. // // WARNING: This method should be considered deprecated since it is not exposed via the gorilla/sessions interface. // Set session.Options.MaxAge = -1 and call Save instead. - July 18th, 2013 func (s *RediStore) Delete(r *http.Request, w http.ResponseWriter, session *sessions.Session) error { conn := s.Pool.Get() defer conn.Close() if _, err := conn.Do("DEL", "session_"+session.ID); err != nil { return err } // Set cookie to expire. options := *session.Options options.MaxAge = -1 http.SetCookie(w, sessions.NewCookie(session.Name(), "", &options)) // Clear session values. for k := range session.Values { delete(session.Values, k) } return nil }
func (s *RedisStore) Save(r *http.Request, w http.ResponseWriter, session *sessions.Session) error { if session.ID == "" { // Because the ID is used in the filename, encode it to // use alphanumeric characters only. session.ID = strings.TrimRight(base32.StdEncoding.EncodeToString(securecookie.GenerateRandomKey(32)), "=") } if err := s.save(session); err != nil { return err } encoded, err := securecookie.EncodeMulti(session.Name(), session.ID, s.Codecs...) if err != nil { return err } http.SetCookie(w, sessions.NewCookie(session.Name(), encoded, session.Options)) return nil }
func (m *SqliteStore) Delete(r *http.Request, w http.ResponseWriter, session *sessions.Session) error { // Set cookie to expire. options := *session.Options options.MaxAge = -1 http.SetCookie(w, sessions.NewCookie(session.Name(), "", &options)) // Clear session values. for k := range session.Values { delete(session.Values, k) } _, delErr := m.stmtDelete.Exec(session.ID) if delErr != nil { return delErr } return nil }
// save writes encoded session.Values to a database record. // writes to http_sessions table by default. func (db *PGStore) save(session *sessions.Session) error { encoded, err := securecookie.EncodeMulti(session.Name(), session.Values, db.Codecs...) if err != nil { return err } var createdOn time.Time var expiresOn time.Time crOn := session.Values["created_on"] exOn := session.Values["expires_on"] if crOn == nil { createdOn = time.Now() } else { createdOn = crOn.(time.Time) } if exOn == nil { expiresOn = time.Now().Add(time.Second * time.Duration(session.Options.MaxAge)) } else { expiresOn = exOn.(time.Time) if expiresOn.Sub(time.Now().Add(time.Second*time.Duration(session.Options.MaxAge))) < 0 { expiresOn = time.Now().Add(time.Second * time.Duration(session.Options.MaxAge)) } } s := Session{ Key: session.ID, Data: encoded, CreatedOn: createdOn, ExpiresOn: expiresOn, ModifiedOn: time.Now(), } if session.IsNew { err = db.DbMap.Insert(&s) } else { _, err = db.DbMap.Exec("update http_sessions set data=$1, modified_on=$2, expires_on=$3 where key=$4", s.Data, s.ModifiedOn, s.ExpiresOn, s.Key) } return err }
func (m *MongoStore) load(session *sessions.Session) error { if !bson.IsObjectIdHex(session.ID) { return ErrInvalidId } s := Session{} err := m.coll.FindId(bson.ObjectIdHex(session.ID)).One(&s) if err != nil { return err } if err := securecookie.DecodeMulti(session.Name(), s.Data, &session.Values, m.Codecs...); err != nil { return err } return nil }
// save writes encoded session.Values into redis. func (s *RedisStore) save(session *sessions.Session) error { encoded, err := securecookie.EncodeMulti(session.Name(), session.Values, s.Codecs...) if err != nil { return err } c := s.redisPool.Get() defer c.Close() _, err = c.Do("SET", "s:"+session.ID, encoded) if err != nil { return err } _, err = c.Do("EXPIRE", "s:"+session.ID, session.Options.MaxAge) return err }
func (d *dalStore) load(session *gSessions.Session) (bool, error) { if !dal.IsObjectIDHex(session.ID) { return false, nSessions.ErrInvalidId } conn := d.connection.Clone() defer conn.Close() db := conn.DB(d.database) c := db.C(d.collection) s := dalSession{} err := c.FindID(dal.ObjectIDHex(session.ID)).One(&s) if err != nil { return false, err } if err := securecookie.DecodeMulti(session.Name(), s.Data, &session.Values, d.Codecs...); err != nil { return false, err } return true, nil }
// Save adds a single session to the response. func (s *MemoryStore) Save(r *http.Request, w http.ResponseWriter, session *sessions.Session) error { Log.Info("MemoryStore Save()", session.ID) if session.ID == "" { session.ID = strings.TrimRight( base32.StdEncoding.EncodeToString( securecookie.GenerateRandomKey(32)), "=") } if err := s.save(session); err != nil { return err } encoded, err := securecookie.EncodeMulti(session.Name(), session.ID, s.Codecs...) if err != nil { return err } http.SetCookie(w, sessions.NewCookie(session.Name(), encoded, session.Options)) return nil }
func (s *Store) Save( r *http.Request, w http.ResponseWriter, sess *sessions.Session, ) error { Lock(sess) defer Unlock(sess) s.writeCookie(r, w, CookieIdName, sess.ID) id := []byte(sess.ID) sess.Values[SessionLastUpdated] = time.Now().UTC() tx, err := s.Begin() if err != nil { return err } _, err = tx.Exec("DELETE FROM "+SqlTableName+" WHERE id = $1", id) if err != nil { tx.Rollback() return err } prep, err := tx.Prepare(` INSERT INTO ` + SqlTableName + ` (id, name, key, value) VALUES ($1, $2, $3, $4) `) if err != nil { tx.Rollback() return err } defer prep.Close() for k, v := range sess.Values { if _, err := prep.Exec(id, sess.Name(), k, v); err != nil { tx.Rollback() return err } } return tx.Commit() }
// Save adds a single session to the response. func (s *MemcacheStore) Save(r *http.Request, w http.ResponseWriter, session *sessions.Session) error { if session.ID == "" { session.ID = s.prefix + strings.TrimRight( base32.StdEncoding.EncodeToString( securecookie.GenerateRandomKey(32)), "=") } c := appengine.NewContext(r) if err := saveToMemcache(c, s.nonPersistentSessionDuration, session); err != nil { return err } encoded, err := securecookie.EncodeMulti(session.Name(), session.ID, s.Codecs...) if err != nil { return err } http.SetCookie(w, sessions.NewCookie(session.Name(), encoded, session.Options)) return nil }
//load fetches a session by ID from the database and decodes its content into session.Values func (db *DatabaseStore) load(session *sessions.Session) error { fn := func(dbConn *sql.DB) error { // Write record to sessions table. row := dbConn.QueryRow("SELECT http_session_id, key, data FROM \""+SESSIONS_TABLE+"\" WHERE key = $1", session.ID) var id int var key, data string if err := row.Scan(&id, &key, &data); err != nil { return err } if err := securecookie.DecodeMulti(session.Name(), string(data), &session.Values, db.Codecs...); err != nil { return err } return nil } return dbLib.ExecuteFn(fn) }
func (m *SqliteStore) load(session *sessions.Session) error { row := m.stmtSelect.QueryRow(session.ID) sess := sessionRow{} scanErr := row.Scan(&sess.id, &sess.data, &sess.createdOn, &sess.modifiedOn, &sess.expiresOn) if scanErr != nil { return scanErr } if sess.expiresOn.Sub(time.Now()) < 0 { log.Printf("Session expired on %s, but it is %s now.", sess.expiresOn, time.Now()) return errors.New("Session expired") } err := securecookie.DecodeMulti(session.Name(), sess.data, &session.Values, m.Codecs...) if err != nil { return err } session.Values["created_on"] = sess.createdOn session.Values["modified_on"] = sess.modifiedOn session.Values["expires_on"] = sess.expiresOn return nil }