/
User.go
130 lines (108 loc) · 2.79 KB
/
User.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
package models
import (
"errors"
"github.com/JojiiOfficial/gaw"
"github.com/jinzhu/gorm"
"github.com/sirupsen/logrus"
)
// User user in db
type User struct {
gorm.Model
Username string
Password string
RoleID uint `sql:"index"`
Role *Role `gorm:"association_autoupdate:false;association_autocreate:false"`
}
// Login login user
func (user *User) Login(db *gorm.DB, machineID string) (*LoginSession, error) {
// Truncat machineID if too big
if len(machineID) > 100 {
machineID = ""
}
// Return if user not exists
if has, err := user.Has(db, true); !has {
return nil, err
}
// Clean old sessions for user + machineID
if err := user.cleanOldSessions(db, machineID); err != nil {
logrus.Error(err)
}
// Generate session
session := NewSession(user, machineID)
if session == nil {
return nil, errors.New("Can't generate session")
}
// Save session
if err := db.Create(&session).Error; err != nil {
return nil, err
}
return session, nil
}
func (user *User) cleanOldSessions(db *gorm.DB, machineID string) error {
if len(machineID) == 0 {
return nil
}
// Delete session(s)
return db.Unscoped().Where(&LoginSession{
UserID: user.ID,
MachineID: machineID,
}).Delete(&LoginSession{}).Error
}
// Register register user
func (user User) Register(db *gorm.DB, config *Config) error {
// Return if user already exists
has, _ := user.Has(db, false)
if has {
return ErrorUserAlreadyExists
}
user = User{
Password: gaw.SHA512(user.Username + user.Password),
Username: user.Username,
RoleID: config.GetDefaultRole().ID,
Role: config.GetDefaultRole(),
}
err := db.Create(&user).Error
if err != nil {
return err
}
// Create namespace for user
_, err = user.CreateDefaultNamespace(db)
return err
}
//Has return true if user exists
func (user *User) Has(db *gorm.DB, checkPass bool) (bool, error) {
pass := ""
if checkPass {
pass = user.Password
}
//Check if user exists
if err := db.Where(&User{
Username: user.Username,
Password: pass,
}).First(user).Error; err != nil {
return false, err
}
return true, nil
}
//GetDefaultNamespaceName return the name of the default namespace for a user
func (user *User) GetDefaultNamespaceName() string {
return user.Username + "_default"
}
//CreateDefaultNamespace creates user namespace
func (user *User) CreateDefaultNamespace(db *gorm.DB) (*Namespace, error) {
namespace := Namespace{
Name: user.GetDefaultNamespaceName(),
User: user,
}
//Crreate
err := db.Create(&namespace).Error
if err != nil {
return nil, err
}
return &namespace, nil
}
//HasAccess return true if user has access to the given namespace
func (user *User) HasAccess(namespace *Namespace) bool {
// User has access if it's his namespace or if he can write others
return namespace.IsOwnedBy(user) || user.CanWriteForeignNamespace()
}