You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
package models
|
|
|
|
|
|
|
|
import (
|
|
|
|
"crypto/rand"
|
|
|
|
|
|
|
|
"gorm.io/gorm"
|
|
|
|
"spahl.ddns.net/jasper/wok-able/auth"
|
|
|
|
)
|
|
|
|
|
|
|
|
const saltSize = 64
|
|
|
|
|
|
|
|
type User struct {
|
|
|
|
ID uint `json:"-" gorm:"primary key"`
|
|
|
|
Username string `json:"username" gorm:"unique;not null"`
|
|
|
|
Email string `json:"email" gorm:"unique;not null"`
|
|
|
|
Password string `json:"password" gorm:"-" binding:"required"`
|
|
|
|
PasswordHash []byte `json:"-" gorm:"not null"`
|
|
|
|
Salt []byte `json:"-" gorm:"not null"`
|
|
|
|
CardDecks []CardDeck `json:"-"`
|
|
|
|
Cards []Card `json:"-"`
|
|
|
|
}
|
|
|
|
type Auth struct {
|
|
|
|
Username string `json:"username" binding:"required"`
|
|
|
|
Password string `json:"password" binding:"required"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
|
|
|
|
salt := make([]byte, saltSize)
|
|
|
|
if _, err = rand.Read(salt[:]); err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
u.Salt = salt
|
|
|
|
u.PasswordHash, err = auth.HashPassword(u.Password, u.Salt)
|
|
|
|
return
|
|
|
|
}
|