-
-
Notifications
You must be signed in to change notification settings - Fork 239
/
user.go
151 lines (122 loc) · 3.33 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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package service
import (
"fmt"
"strconv"
"github.com/saltbo/gopkg/regexputil"
"github.com/saltbo/gopkg/strutil"
"github.com/saltbo/zpan/internal/app/dao"
"github.com/saltbo/zpan/internal/app/model"
)
type User struct {
dUser *dao.User
dOpt *dao.Option
sToken *Token
sMail *Mail
}
func NewUser() *User {
return &User{
dUser: dao.NewUser(),
dOpt: dao.NewOption(),
sToken: NewToken(),
sMail: NewMail(),
}
}
func (u *User) Signup(email, password string, opt model.UserCreateOption) (*model.User, error) {
if _, exist := u.dUser.TicketExist(opt.Ticket); !exist && opt.Ticket != "" {
return nil, fmt.Errorf("invalid ticket")
}
// 创建基本信息
user := &model.User{
Email: email,
Username: fmt.Sprintf("mu%s", strutil.RandomText(18)),
Password: strutil.Md5Hex(password),
Roles: opt.Roles,
Ticket: strutil.RandomText(6),
}
mUser, err := u.dUser.Create(user, opt.StorageMax)
if err != nil {
return nil, err
}
// 如果如果启用了发信邮箱则发送一份激活邮件给用户
if u.sMail.Enabled() {
token, err := u.sToken.Create(user.IDString(), 3600*24, user.Roles)
if err != nil {
return nil, err
}
return mUser, u.sMail.NotifyActive(opt.Origin, email, token)
}
return mUser, nil
}
func (u *User) Active(token string) error {
rc, err := u.sToken.Verify(token)
if err != nil {
return err
}
uid, _ := strconv.ParseInt(rc.Subject, 10, 64)
user, err := u.dUser.Find(uid)
if err != nil {
return err
} else if user.Status >= model.StatusActivated {
return fmt.Errorf("account already activated")
}
u.dUser.UpdateStorage(uid, model.UserStorageActiveSize) // 激活即送1G空间
return u.dUser.Activate(uid)
}
func (u *User) SignIn(usernameOrEmail, password string, ttl int) (*model.User, error) {
userFinder := u.dUser.UsernameExist
if regexputil.EmailRegex.MatchString(usernameOrEmail) {
userFinder = u.dUser.EmailExist
}
user, exist := userFinder(usernameOrEmail)
if !exist {
return nil, fmt.Errorf("user not exist")
} else if user.Password != strutil.Md5Hex(password) {
return nil, fmt.Errorf("invalid password")
} else if u.sMail.Enabled() && !user.Activated() {
return nil, fmt.Errorf("account is not activated")
}
token, err := u.sToken.Create(user.IDString(), ttl, user.Roles)
if err != nil {
return nil, err
}
user.Token = token
return user, nil
}
func (u *User) SignOut() {
}
func (u *User) PasswordUpdate(uid int64, oldPwd, newPwd string) error {
user, err := u.dUser.Find(uid)
if err != nil {
return err
} else if user.Password != strutil.Md5Hex(oldPwd) {
return fmt.Errorf("error password")
}
user.Password = strutil.Md5Hex(newPwd)
return u.dUser.Update(user)
}
func (u *User) PasswordResetApply(origin, email string) error {
user, ok := u.dUser.EmailExist(email)
if !ok {
return fmt.Errorf("email not exist")
}
// issue a short-term token for password reset
token, err := u.sToken.Create(user.IDString(), 300)
if err != nil {
return err
}
return u.sMail.NotifyPasswordReset(origin, email, token)
}
func (u *User) PasswordReset(token, password string) error {
rc, err := u.sToken.Verify(token)
if err != nil {
return err
}
return u.dUser.PasswordReset(rc.Uid(), password)
}
func (u *User) InviteRequired() bool {
opts, err := u.dOpt.Get(model.OptSite)
if err != nil {
return false
}
return opts.GetBool("invite_required")
}