79 lines
1.5 KiB
Go
79 lines
1.5 KiB
Go
package entity
|
|
|
|
import (
|
|
"crypto/md5"
|
|
"database/sql"
|
|
"fmt"
|
|
"strings"
|
|
"time"
|
|
|
|
"golang.org/x/crypto/bcrypt"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type User struct {
|
|
gorm.Model
|
|
Name string `gorm:"index;size:255"`
|
|
Email string `gorm:"index;size:255"`
|
|
Link string
|
|
Password string
|
|
BadgeName string
|
|
BadgeColor string
|
|
LastIP string
|
|
LastUA string
|
|
IsAdmin bool
|
|
ReceiveEmail bool `gorm:"default:true"`
|
|
TokenValidFrom sql.NullTime
|
|
|
|
// 配置文件中添加的
|
|
IsInConf bool
|
|
}
|
|
|
|
func (u User) IsEmpty() bool {
|
|
return u.ID == 0
|
|
}
|
|
|
|
func (u *User) SetPasswordEncrypt(password string) (err error) {
|
|
var encrypted []byte
|
|
if encrypted, err = bcrypt.GenerateFromPassword(
|
|
[]byte(password), bcrypt.DefaultCost,
|
|
); err != nil {
|
|
return err
|
|
}
|
|
u.Password = "(bcrypt)" + string(encrypted)
|
|
u.TokenValidFrom.Scan(time.Now())
|
|
return nil
|
|
}
|
|
|
|
func (u *User) CheckPassword(input string) bool {
|
|
if u.ID == 0 {
|
|
return false
|
|
}
|
|
password := strings.TrimSpace(u.Password)
|
|
if password == "" {
|
|
return false
|
|
}
|
|
|
|
const BcryptPrefix = "(bcrypt)"
|
|
const MD5Prefix = "(md5)"
|
|
|
|
switch {
|
|
case strings.HasPrefix(password, BcryptPrefix):
|
|
if err := bcrypt.CompareHashAndPassword([]byte(password[len(BcryptPrefix):]),
|
|
[]byte(input)); err == nil {
|
|
return true
|
|
}
|
|
case strings.HasPrefix(password, MD5Prefix):
|
|
if strings.EqualFold(password[len(MD5Prefix):],
|
|
fmt.Sprintf("%x", md5.Sum([]byte(input)))) {
|
|
return true
|
|
}
|
|
default:
|
|
if password == input {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|