116 lines
2.9 KiB
Go
116 lines
2.9 KiB
Go
package service
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
"myschools.me/heritage/heritage-api/model"
|
|
"myschools.me/heritage/heritage-api/mysql"
|
|
"myschools.me/heritage/heritage-api/redis"
|
|
)
|
|
|
|
var (
|
|
ErrInvalidCredentials = errors.New("invalid credentials")
|
|
ErrInvalidArgument = errors.New("invalid argument")
|
|
ErrOldPasswordWrong = errors.New("old password wrong")
|
|
ErrNewPasswordShort = errors.New("new password too short")
|
|
ErrUserNotFound = errors.New("user not found")
|
|
)
|
|
|
|
func Login(userName, plainPassword string) (string, *model.User, error) {
|
|
userName = strings.TrimSpace(userName)
|
|
if userName == "" || plainPassword == "" {
|
|
return "", nil, ErrInvalidCredentials
|
|
}
|
|
|
|
u, found, err := mysql.UserByUserName(&userName)
|
|
if err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "service.Login",
|
|
"userName": userName,
|
|
}).Errorf("mysql.UserByUserName: %s", err.Error())
|
|
return "", nil, err
|
|
}
|
|
if !found || u == nil || u.PasswordHash == "" {
|
|
return "", nil, ErrInvalidCredentials
|
|
}
|
|
if !VerifyPassword(u.PasswordHash, plainPassword) {
|
|
return "", nil, ErrInvalidCredentials
|
|
}
|
|
|
|
token := newToken()
|
|
safeUser := &model.User{
|
|
ID: u.ID,
|
|
UserName: u.UserName,
|
|
RoleID: u.RoleID,
|
|
}
|
|
if err := redis.UserTokenSet(&token, safeUser); err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "service.Login",
|
|
"userID": u.ID,
|
|
}).Errorf("redis.UserTokenSet: %s", err.Error())
|
|
return "", nil, err
|
|
}
|
|
return token, safeUser, nil
|
|
}
|
|
|
|
func Logout(token string) error {
|
|
token = strings.TrimSpace(token)
|
|
token = strings.TrimPrefix(token, "Bearer ")
|
|
token = strings.TrimPrefix(token, "bearer ")
|
|
if token == "" {
|
|
return nil
|
|
}
|
|
return redis.UserTokenDel(&token)
|
|
}
|
|
|
|
func ChangePassword(userID, oldPassword, newPassword string) error {
|
|
oldPassword = strings.TrimSpace(oldPassword)
|
|
newPassword = strings.TrimSpace(newPassword)
|
|
if oldPassword == "" || newPassword == "" {
|
|
return ErrInvalidArgument
|
|
}
|
|
if len(newPassword) < 6 {
|
|
return ErrNewPasswordShort
|
|
}
|
|
|
|
dbUser, found, err := mysql.UserByID(&userID)
|
|
if err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "service.ChangePassword",
|
|
"userID": userID,
|
|
}).Errorf("mysql.UserByID: %s", err.Error())
|
|
return err
|
|
}
|
|
if !found || dbUser == nil || dbUser.PasswordHash == "" {
|
|
return ErrUserNotFound
|
|
}
|
|
|
|
if !VerifyPassword(dbUser.PasswordHash, oldPassword) {
|
|
return ErrOldPasswordWrong
|
|
}
|
|
|
|
hash, err := HashPassword(newPassword)
|
|
if err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "service.ChangePassword",
|
|
"userID": userID,
|
|
}).Errorf("password.HashPassword: %s", err.Error())
|
|
return err
|
|
}
|
|
|
|
updated, err := mysql.UpdateUserPasswordHash(&userID, &hash)
|
|
if err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "service.ChangePassword",
|
|
"userID": userID,
|
|
}).Errorf("mysql.UpdateUserPasswordHash: %s", err.Error())
|
|
return err
|
|
}
|
|
if !updated {
|
|
return ErrUserNotFound
|
|
}
|
|
return nil
|
|
}
|