Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/internal/op/user.go
1560 views
1
package op
2
3
import (
4
"time"
5
6
"github.com/Xhofe/go-cache"
7
"github.com/alist-org/alist/v3/internal/db"
8
"github.com/alist-org/alist/v3/internal/errs"
9
"github.com/alist-org/alist/v3/internal/model"
10
"github.com/alist-org/alist/v3/pkg/singleflight"
11
"github.com/alist-org/alist/v3/pkg/utils"
12
)
13
14
var userCache = cache.NewMemCache(cache.WithShards[*model.User](2))
15
var userG singleflight.Group[*model.User]
16
var guestUser *model.User
17
var adminUser *model.User
18
19
func GetAdmin() (*model.User, error) {
20
if adminUser == nil {
21
role, err := GetRoleByName("admin")
22
if err != nil {
23
return nil, err
24
}
25
user, err := db.GetUserByRole(int(role.ID))
26
if err != nil {
27
return nil, err
28
}
29
adminUser = user
30
}
31
return adminUser, nil
32
}
33
34
func GetGuest() (*model.User, error) {
35
if guestUser == nil {
36
role, err := GetRoleByName("guest")
37
if err != nil {
38
return nil, err
39
}
40
user, err := db.GetUserByRole(int(role.ID))
41
if err != nil {
42
return nil, err
43
}
44
guestUser = user
45
}
46
return guestUser, nil
47
}
48
49
func GetUserByRole(role int) (*model.User, error) {
50
return db.GetUserByRole(role)
51
}
52
53
func GetUsersByRole(role int) ([]model.User, error) {
54
return db.GetUsersByRole(role)
55
}
56
57
func GetUserByName(username string) (*model.User, error) {
58
if username == "" {
59
return nil, errs.EmptyUsername
60
}
61
if user, ok := userCache.Get(username); ok {
62
return user, nil
63
}
64
user, err, _ := userG.Do(username, func() (*model.User, error) {
65
_user, err := db.GetUserByName(username)
66
if err != nil {
67
return nil, err
68
}
69
userCache.Set(username, _user, cache.WithEx[*model.User](time.Hour))
70
return _user, nil
71
})
72
return user, err
73
}
74
75
func GetUserById(id uint) (*model.User, error) {
76
return db.GetUserById(id)
77
}
78
79
func GetUsers(pageIndex, pageSize int) (users []model.User, count int64, err error) {
80
return db.GetUsers(pageIndex, pageSize)
81
}
82
83
func CreateUser(u *model.User) error {
84
u.BasePath = utils.FixAndCleanPath(u.BasePath)
85
86
err := db.CreateUser(u)
87
if err != nil {
88
return err
89
}
90
91
roles, err := GetRolesByUserID(u.ID)
92
if err == nil {
93
for _, role := range roles {
94
if len(role.PermissionScopes) > 0 {
95
u.BasePath = utils.FixAndCleanPath(role.PermissionScopes[0].Path)
96
break
97
}
98
}
99
_ = db.UpdateUser(u)
100
userCache.Del(u.Username)
101
}
102
103
return nil
104
}
105
106
func DeleteUserById(id uint) error {
107
old, err := db.GetUserById(id)
108
if err != nil {
109
return err
110
}
111
if old.IsAdmin() || old.IsGuest() {
112
return errs.DeleteAdminOrGuest
113
}
114
userCache.Del(old.Username)
115
return db.DeleteUserById(id)
116
}
117
118
func UpdateUser(u *model.User) error {
119
old, err := db.GetUserById(u.ID)
120
if err != nil {
121
return err
122
}
123
if u.IsAdmin() {
124
adminUser = nil
125
}
126
if u.IsGuest() {
127
guestUser = nil
128
}
129
userCache.Del(old.Username)
130
u.BasePath = utils.FixAndCleanPath(u.BasePath)
131
//if len(u.Role) > 0 {
132
// roles, err := GetRolesByUserID(u.ID)
133
// if err == nil {
134
// for _, role := range roles {
135
// if len(role.PermissionScopes) > 0 {
136
// u.BasePath = utils.FixAndCleanPath(role.PermissionScopes[0].Path)
137
// break
138
// }
139
// }
140
// }
141
//}
142
return db.UpdateUser(u)
143
}
144
145
func Cancel2FAByUser(u *model.User) error {
146
u.OtpSecret = ""
147
return UpdateUser(u)
148
}
149
150
func Cancel2FAById(id uint) error {
151
user, err := db.GetUserById(id)
152
if err != nil {
153
return err
154
}
155
return Cancel2FAByUser(user)
156
}
157
158
func DelUserCache(username string) error {
159
user, err := GetUserByName(username)
160
if err != nil {
161
return err
162
}
163
if user.IsAdmin() {
164
adminUser = nil
165
}
166
if user.IsGuest() {
167
guestUser = nil
168
}
169
userCache.Del(username)
170
return nil
171
}
172
173
func CountEnabledAdminsExcluding(userID uint) (int64, error) {
174
adminRole, err := GetRoleByName("admin")
175
if err != nil {
176
return 0, err
177
}
178
return db.CountUsersByRoleAndEnabledExclude(adminRole.ID, userID)
179
}
180
181