The main server, and probably only repository in this org.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

53 lines
906 B

package sessions
import (
"crypto/rand"
"encoding/binary"
"strconv"
"time"
"git.aiterp.net/lucifer/lucifer/models"
)
func Open(repo models.SessionRepository, user models.User) (models.Session, error) {
id, err := generateID()
if err != nil {
return models.Session{}, err
}
session := models.Session{ID: id, Expires: time.Now().Add(time.Hour * 72), UserID: user.ID}
err = repo.InsertSession(session)
if err != nil {
return models.Session{}, err
}
return session, nil
}
func generateID() (string, error) {
result := "S"
offset := 0
data := make([]byte, 32)
_, err := rand.Read(data)
if err != nil {
return "", err
}
for len(result) < 64 {
result += strconv.FormatUint(binary.LittleEndian.Uint64(data[offset:]), 36)
offset += 8
if offset >= 32 {
_, err = rand.Read(data)
if err != nil {
return "", err
}
offset = 0
}
}
return result[:64], nil
}