@@ -5,13 +5,16 @@ import (
5
5
"errors"
6
6
"fmt"
7
7
8
+ "github.com/amalshaji/beaver/internal/utils"
8
9
"github.com/timshannon/badgerhold/v4"
9
10
)
10
11
11
- var ErrAdminUserNotFound = errors .New ("user does not exist" )
12
+ var ErrAdminUserNotFound = errors .New ("admin user does not exist" )
13
+ var ErrTunnelUserNotFound = errors .New ("tunnel user does not exist" )
12
14
var ErrInvalidUserSession = errors .New ("invalid user session" )
13
15
var ErrWrongEmailOrPassword = errors .New ("wrong email or password" )
14
- var ErrDuplicateAdminUser = errors .New ("user with the same email exists" )
16
+ var ErrDuplicateAdminUser = errors .New ("admin user with the same email exists" )
17
+ var ErrDuplicateTunnelUser = errors .New ("tunnel user with the same email exists" )
15
18
16
19
type User struct {
17
20
Store * badgerhold.Store
@@ -22,6 +25,8 @@ func NewUserService(store *badgerhold.Store) *User {
22
25
}
23
26
24
27
func (u * User ) findUserByEmail (ctx context.Context , email string ) (* AdminUser , error ) {
28
+ email = utils .SanitizeString (email )
29
+
25
30
var superUser AdminUser
26
31
if err := u .Store .FindOne (& superUser , badgerhold .Where ("Email" ).Eq (email )); err != nil {
27
32
if errors .Is (err , badgerhold .ErrNotFound ) {
@@ -33,6 +38,9 @@ func (u *User) findUserByEmail(ctx context.Context, email string) (*AdminUser, e
33
38
}
34
39
35
40
func (u * User ) CreateUser (ctx context.Context , email , password string , isSuperUser bool ) (* AdminUser , error ) {
41
+ email = utils .SanitizeString (email )
42
+ password = utils .SanitizeString (password )
43
+
36
44
existingAdminUser , err := u .findUserByEmail (ctx , email )
37
45
if err != nil && ! errors .Is (err , ErrAdminUserNotFound ) {
38
46
return nil , err
@@ -49,7 +57,7 @@ func (u *User) CreateUser(ctx context.Context, email, password string, isSuperUs
49
57
adminUser .IsSuperUser = isSuperUser
50
58
adminUser .MarkAsNew ()
51
59
52
- if err := u .Store .Insert (badgerhold .NextSequence (), adminUser ); err != nil {
60
+ if err := u .Store .Insert (badgerhold .NextSequence (), & adminUser ); err != nil {
53
61
if errors .Is (err , badgerhold .ErrUniqueExists ) {
54
62
return nil , ErrDuplicateAdminUser
55
63
}
@@ -68,6 +76,9 @@ func (u *User) CreateSuperUser(ctx context.Context, email, password string) (*Ad
68
76
}
69
77
70
78
func (u * User ) Login (ctx context.Context , email , password string ) (string , error ) {
79
+ email = utils .SanitizeString (email )
80
+ password = utils .SanitizeString (password )
81
+
71
82
var adminUser * AdminUser
72
83
73
84
adminUser , err := u .findUserByEmail (ctx , email )
@@ -124,3 +135,96 @@ func (u *User) ValidateSession(ctx context.Context, sessionToken string) (*Admin
124
135
}
125
136
return & adminUser , nil
126
137
}
138
+
139
+ func (u * User ) findTunnelUserByEmail (ctx context.Context , email string ) (* TunnelUser , error ) {
140
+ email = utils .SanitizeString (email )
141
+
142
+ var tunnelUser TunnelUser
143
+
144
+ if err := u .Store .FindOne (& tunnelUser , badgerhold .Where ("Email" ).Eq (email )); err != nil {
145
+ if errors .Is (err , badgerhold .ErrNotFound ) {
146
+ return nil , ErrTunnelUserNotFound
147
+ }
148
+ return nil , err
149
+ }
150
+ return & tunnelUser , nil
151
+ }
152
+
153
+ func (u * User ) CreateTunnelUser (ctx context.Context , email string ) (* TunnelUser , error ) {
154
+ email = utils .SanitizeString (email )
155
+
156
+ existingTunnelUser , err := u .findTunnelUserByEmail (ctx , email )
157
+ if err != nil && ! errors .Is (err , ErrTunnelUserNotFound ) {
158
+ return nil , err
159
+ }
160
+
161
+ if existingTunnelUser != nil {
162
+ return nil , ErrDuplicateTunnelUser
163
+ }
164
+
165
+ if err := utils .ValidateEmail (email ); err != nil {
166
+ return nil , fmt .Errorf ("enter a valid email address" )
167
+ }
168
+
169
+ var tunnelUser TunnelUser
170
+
171
+ tunnelUser .Email = email
172
+ tunnelUser .RotateSecretKey ()
173
+ tunnelUser .MarkAsNew ()
174
+
175
+ if err := u .Store .Insert (badgerhold .NextSequence (), & tunnelUser ); err != nil {
176
+ if errors .Is (err , badgerhold .ErrUniqueExists ) {
177
+ return nil , ErrDuplicateTunnelUser
178
+ }
179
+ return nil , err
180
+ }
181
+
182
+ return & tunnelUser , nil
183
+ }
184
+
185
+ func (u * User ) GetTunnelUserBySecret (ctx context.Context , secretKey string ) (* TunnelUser , error ) {
186
+ secretKey = utils .SanitizeString (secretKey )
187
+
188
+ var tunnelUser TunnelUser
189
+
190
+ if err := u .Store .FindOne (& tunnelUser , badgerhold .Where ("SecretKey" ).Eq (secretKey )); err != nil {
191
+ if errors .Is (err , badgerhold .ErrNotFound ) {
192
+ return nil , ErrTunnelUserNotFound
193
+ }
194
+ return nil , err
195
+ }
196
+ return & tunnelUser , nil
197
+ }
198
+
199
+ func (u * User ) ListTunnelUsers (ctx context.Context ) ([]TunnelUser , error ) {
200
+ var tunnelUsers []TunnelUser
201
+
202
+ if err := u .Store .Find (& tunnelUsers , nil ); err != nil {
203
+ return nil , err
204
+ }
205
+ if tunnelUsers == nil {
206
+ return []TunnelUser {}, nil
207
+ }
208
+ return tunnelUsers , nil
209
+ }
210
+
211
+ func (u * User ) RotateTunnelUserSecretKey (ctx context.Context , email string ) (* TunnelUser , error ) {
212
+ tunnelUser , err := u .findTunnelUserByEmail (ctx , email )
213
+
214
+ if err != nil {
215
+ return nil , err
216
+ }
217
+
218
+ tunnelUser .RotateSecretKey ()
219
+
220
+ u .Store .UpdateMatching (& TunnelUser {}, badgerhold .Where ("Email" ).Eq (email ), func (record interface {}) error {
221
+ update , ok := record .(* TunnelUser )
222
+ if ! ok {
223
+ return fmt .Errorf ("error while updating superuser" )
224
+ }
225
+ update .SecretKey = tunnelUser .SecretKey
226
+ return nil
227
+ })
228
+
229
+ return tunnelUser , nil
230
+ }
0 commit comments