This repository has been archived by the owner on Mar 28, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
UserImpl.go
140 lines (127 loc) · 3.31 KB
/
UserImpl.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package users
import (
"crypto/sha256"
b64 "encoding/base64"
"errors"
"fmt"
"time"
"github.com/matscus/Hamster/Package/Clients/client/postgres"
"github.com/dgrijalva/jwt-go"
"github.com/matscus/Hamster/Package/JWTToken/jwttoken"
"github.com/matscus/Hamster/Package/Users/subset"
)
//User - struct for user, contains username, passowd (in base64) and JWT
type User struct {
ID int64 `json:id`
User string `json:user`
Password string `json:password,omitempty`
Role string `json:"role"`
Projects []string `json:"projects"`
DBClient *postgres.PGClient
jwt.StandardClaims
}
//New - return inretface user
func New(client *postgres.PGClient) subset.User {
var user subset.User
user = User{DBClient: client}
return user
}
//NewTokenString - func for generate and response new token
func (u User) NewTokenString(temp bool) (token string, err error) {
userID, role, err := u.DBClient.GetUserIDAndRole(u.User)
if err != nil {
return "", err
} else {
projects, err := u.DBClient.GetUserProjects(userID)
if err != nil {
return "", err
} else {
if temp {
token, err = jwttoken.Token{}.New().GenerateTemp(role, u.User, projects)
if err != nil {
return "", err
}
} else {
token, err = jwttoken.Token{}.New().Generate(role, u.User, projects)
if err != nil {
return "", err
}
}
}
}
return token, err
}
//CheckUser - func for check users (for )validation of user token)
func (u User) CheckUser() (res bool, err error) {
hash, err := u.DBClient.GetUserHash(u.User)
password, err := b64.StdEncoding.DecodeString(u.Password)
ok := compareHash(hash, password)
if ok {
return true, nil
}
err = errors.New("check user fail")
return false, err
}
//CheckPasswordExp - func for check PasswordExp (for )validation of user token)
func (u User) CheckPasswordExp() (res bool, err error) {
exp, err := u.DBClient.GetUserPasswordExp(u.User)
t, _ := time.Parse(time.RFC3339, exp)
if t.Unix() == 0 {
return true, nil
} else {
if time.Now().Unix() > t.Unix() {
return false, err
} else {
return true, err
}
}
}
//Create - create new user and insert data to database
func (u User) Create() error {
h := sha256.New()
pass, err := b64.StdEncoding.DecodeString(u.Password)
if err != nil {
return err
}
h.Write([]byte(pass))
projectsID, err := u.DBClient.GetProjectsIDtoString(u.Projects)
if err != nil {
return err
}
return u.DBClient.NewUser(u.User, fmt.Sprintf("%x", h.Sum(nil)), u.Role, projectsID)
}
//Update - update user data
func (u User) Update() error {
err := u.DBClient.UpdateUser(string(u.ID), u.Role, u.Projects)
if err != nil {
return err
}
projectsID, err := u.DBClient.GetProjectsIDtoString(u.Projects)
if err != nil {
return err
}
return u.DBClient.UpdatetUserProjects(u.ID, projectsID)
}
//Delete -delete user
func (u User) Delete() error {
return u.DBClient.DeleteUser(u.ID)
}
//ChangePassword - change user password
func (u User) ChangePassword() error {
h := sha256.New()
pass, err := b64.StdEncoding.DecodeString(u.Password)
if err != nil {
return err
}
h.Write([]byte(pass))
return u.DBClient.ChangeUserPassword(u.ID, fmt.Sprintf("%x", h.Sum(nil)))
}
func compareHash(hash string, password []byte) bool {
h := sha256.New()
h.Write(password)
pass := fmt.Sprintf("%x", h.Sum(nil))
if hash == pass {
return true
}
return false
}