mirror of
https://github.com/aclindsa/moneygo.git
synced 2025-06-13 21:48:39 -04:00
Split Sessions into models
This commit is contained in:
67
internal/models/sessions.go
Normal file
67
internal/models/sessions.go
Normal file
@ -0,0 +1,67 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"io"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Session struct {
|
||||
SessionId int64
|
||||
SessionSecret string `json:"-"`
|
||||
UserId int64
|
||||
Created time.Time
|
||||
Expires time.Time
|
||||
}
|
||||
|
||||
func (s *Session) Cookie(domain string) *http.Cookie {
|
||||
return &http.Cookie{
|
||||
Name: "moneygo-session",
|
||||
Value: s.SessionSecret,
|
||||
Path: "/",
|
||||
Domain: domain,
|
||||
Expires: s.Expires,
|
||||
Secure: true,
|
||||
HttpOnly: true,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Session) Write(w http.ResponseWriter) error {
|
||||
enc := json.NewEncoder(w)
|
||||
return enc.Encode(s)
|
||||
}
|
||||
|
||||
func (s *Session) Read(json_str string) error {
|
||||
dec := json.NewDecoder(strings.NewReader(json_str))
|
||||
return dec.Decode(s)
|
||||
}
|
||||
|
||||
func newSessionSecret() (string, error) {
|
||||
bits := make([]byte, 128)
|
||||
if _, err := io.ReadFull(rand.Reader, bits); err != nil {
|
||||
return "", err
|
||||
}
|
||||
return base64.StdEncoding.EncodeToString(bits), nil
|
||||
}
|
||||
|
||||
func NewSession(userid int64) (*Session, error) {
|
||||
session_secret, err := newSessionSecret()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
now := time.Now()
|
||||
|
||||
s := Session{
|
||||
SessionSecret: session_secret,
|
||||
UserId: userid,
|
||||
Created: now,
|
||||
Expires: now.AddDate(0, 1, 0), // a month from now
|
||||
}
|
||||
|
||||
return &s, nil
|
||||
}
|
Reference in New Issue
Block a user