86 lines
2.5 KiB
Go
86 lines
2.5 KiB
Go
package models
|
|
|
|
import (
|
|
"math/rand"
|
|
"strings"
|
|
"time"
|
|
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
"golang.org/x/crypto/bcrypt"
|
|
)
|
|
|
|
var (
|
|
lowerCharSet = "abcdedfghijklmnopqrst"
|
|
upperCharSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
specialCharSet = "!@#$%&*?,.`~"
|
|
numberSet = "0123456789"
|
|
allCharSet = lowerCharSet + upperCharSet + specialCharSet + numberSet
|
|
)
|
|
|
|
type User struct {
|
|
ID primitive.ObjectID `bson:"_id"`
|
|
Firstname string `json:"firstname"`
|
|
Lastname string `json:"lastname"`
|
|
Username string `json:"username" validate:"required"`
|
|
Email string `json:"email" validate:"required"`
|
|
Password string `json:"-" validate:"min=10,max=32"`
|
|
TempPassword bool `json:"temppassword"`
|
|
Subscription string `json:"subscription"` // standard, professional, business
|
|
Created_at time.Time `json:"created_at"`
|
|
Updated_at time.Time `json:"updated_at"`
|
|
}
|
|
|
|
func (u *User) HashPassword(password string) string {
|
|
hash, _ := bcrypt.GenerateFromPassword([]byte(password), 14)
|
|
return string(hash)
|
|
}
|
|
|
|
func (u *User) ComparePasswords(password string) bool {
|
|
err := bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(password))
|
|
if err != nil {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
func (u *User) CheckPasswordStrength(password string) bool {
|
|
if strings.ContainsAny(password, specialCharSet) && strings.ContainsAny(password, upperCharSet) && strings.ContainsAny(password, lowerCharSet) {
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
}
|
|
|
|
func (u *User) GeneratePassword(passwordLength, minSpecialChar, minNum, minUpperCase int) string {
|
|
var password strings.Builder
|
|
|
|
//Set special character
|
|
for i := 0; i < minSpecialChar; i++ {
|
|
random := rand.Intn(len(specialCharSet))
|
|
password.WriteString(string(specialCharSet[random]))
|
|
}
|
|
|
|
//Set numeric
|
|
for i := 0; i < minNum; i++ {
|
|
random := rand.Intn(len(numberSet))
|
|
password.WriteString(string(numberSet[random]))
|
|
}
|
|
|
|
//Set uppercase
|
|
for i := 0; i < minUpperCase; i++ {
|
|
random := rand.Intn(len(upperCharSet))
|
|
password.WriteString(string(upperCharSet[random]))
|
|
}
|
|
|
|
remainingLength := passwordLength - minSpecialChar - minNum - minUpperCase
|
|
for i := 0; i < remainingLength; i++ {
|
|
random := rand.Intn(len(allCharSet))
|
|
password.WriteString(string(allCharSet[random]))
|
|
}
|
|
inRune := []rune(password.String())
|
|
rand.Shuffle(len(inRune), func(i, j int) {
|
|
inRune[i], inRune[j] = inRune[j], inRune[i]
|
|
})
|
|
return string(inRune)
|
|
}
|