/
storer.go
130 lines (106 loc) · 2.86 KB
/
storer.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 auth
import (
"strings"
"time"
"github.com/cloudway/platform/auth/userdb"
"github.com/cloudway/platform/broker"
"gopkg.in/authboss.v0"
)
type AuthbossUser struct {
basic *userdb.BasicUser
// Auth
Email string `bson:"-"`
Password string `bson:"-"`
// OAuth2
Oauth2Uid string `bson:",omitempty"`
Oauth2Provider string `bson:",omitempty"`
Oauth2Token string `bson:",omitempty"`
Oauth2Refresh string `bson:",omitempty"`
Oauth2Expiry time.Time `bson:",omitempty"`
// Confirm
ConfirmToken string `bson:",omitempty"`
Confirmed bool `bson:",omitempty"`
// Lock
AttemptNumber int64 `bson:",omitempty"`
AttemptTime time.Time `bson:",omitempty"`
Locked time.Time `bson:",omitempty"`
// Recover
RecoverToken string `bson:",omitempty"`
RecoverTokenExpiry time.Time `bson:",omitempty"`
}
func (u *AuthbossUser) Basic() *userdb.BasicUser {
return u.basic
}
type storeUser struct {
userdb.BasicUser `bson:",inline"`
Authboss AuthbossUser
}
func (u *storeUser) toAuthboss() *AuthbossUser {
u.Authboss.basic = &u.BasicUser
u.Authboss.Email = u.Name
u.Authboss.Password = string(u.Password)
return &u.Authboss
}
type Storer struct {
*broker.Broker
}
func NewStorer(br *broker.Broker) Storer {
return Storer{br}
}
func (s Storer) Create(key string, attr authboss.Attributes) error {
key = strings.ToLower(key)
var user storeUser
if err := attr.Bind(&user.Authboss, true); err != nil {
return err
}
user.Name = key
user.Inactive = user.Authboss.ConfirmToken != ""
return s.CreateUser(&user, user.Authboss.Password)
}
func (s Storer) Put(key string, attr authboss.Attributes) error {
key = strings.ToLower(key)
var user AuthbossUser
if err := attr.Bind(&user, true); err != nil {
return err
}
args := userdb.Args{
"authboss": &user,
"inactive": user.ConfirmToken != "",
}
err := s.Users.Update(key, args)
if userdb.IsUserNotFound(err) {
err = authboss.ErrUserNotFound
}
return err
}
func (s Storer) Get(key string) (result interface{}, err error) {
key = strings.ToLower(key)
var user storeUser
if err := s.Users.Find(key, &user); err != nil {
if userdb.IsUserNotFound(err) {
err = authboss.ErrUserNotFound
}
return nil, err
}
return user.toAuthboss(), nil
}
func (s Storer) ConfirmUser(tok string) (result interface{}, err error) {
var user storeUser
if err := s.Users.Search(userdb.Args{"authboss.confirmtoken": tok}, &user); err != nil {
if userdb.IsUserNotFound(err) {
err = authboss.ErrUserNotFound
}
return nil, err
}
return user.toAuthboss(), nil
}
func (s Storer) RecoverUser(rec string) (result interface{}, err error) {
var user storeUser
if err := s.Users.Search(userdb.Args{"authboss.recovertoken": rec}, &user); err != nil {
if userdb.IsUserNotFound(err) {
err = authboss.ErrUserNotFound
}
return nil, err
}
return user.toAuthboss(), nil
}