moneygo/internal/models/sessions.go

68 lines
1.2 KiB
Go

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
}