reprogl

Форк
0
55 строк · 1.3 Кб
1
package auth
2

3
import (
4
	"crypto/subtle"
5
	"errors"
6
	"fmt"
7

8
	"xelbot.com/reprogl/container"
9
	"xelbot.com/reprogl/models"
10
	"xelbot.com/reprogl/models/repositories"
11
	"xelbot.com/reprogl/security"
12
)
13

14
type Error interface {
15
	InfoLogMessage() string
16
}
17

18
type wrongCredentialsError struct {
19
	info string
20
}
21

22
func HandleLoginPassword(app *container.Application, username, password string) (*models.LoggedUser, error) {
23
	if len(username) == 0 || len(password) == 0 {
24
		return nil, wrongCredentialsError{info: "username or password is empty"}
25
	}
26

27
	if len(password) > 4096 {
28
		return nil, wrongCredentialsError{info: "password too long"}
29
	}
30

31
	repo := repositories.UserRepository{DB: app.DB}
32
	user, err := repo.GetLoggedUserByUsername(username)
33
	if err != nil {
34
		if errors.Is(err, models.RecordNotFound) {
35
			return nil, wrongCredentialsError{info: fmt.Sprintf("user \"%s\" not found", username)}
36
		}
37

38
		return nil, err
39
	}
40

41
	passwordHash := security.EncodePassword(password, user.Salt)
42
	if subtle.ConstantTimeCompare([]byte(passwordHash), []byte(user.PasswordHash)) == 0 {
43
		return nil, wrongCredentialsError{info: fmt.Sprintf("invalid password for \"%s\"", username)}
44
	}
45

46
	return user, nil
47
}
48

49
func (_ wrongCredentialsError) Error() string {
50
	return "Недействительные логин/пароль"
51
}
52

53
func (w wrongCredentialsError) InfoLogMessage() string {
54
	return w.info
55
}
56

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.