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
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
|
|
}
|