@@ -6,17 +6,14 @@ import (
6
6
"encoding/base64"
7
7
"fmt"
8
8
"strings"
9
- "time"
10
- "context"
11
9
12
10
"github.com/gomodule/redigo/redis"
11
+ uuidLib "github.com/google/uuid"
13
12
"github.com/ihucos/counter.dev/utils"
13
+ "gopkg.in/gomail.v2"
14
14
"gorm.io/gorm"
15
- uuidLib "github.com/google/uuid"
16
- "github.com/mailgun/mailgun-go/v4"
17
15
)
18
16
19
-
20
17
var surveySender string = "hey@counter.dev"
21
18
var surveySubject string = "Is counter.dev useful?"
22
19
var surveyText string = `Hello %s,
@@ -30,9 +27,6 @@ Thank you. Your feedback is appreciated!
30
27
31
28
Your counter.dev team`
32
29
33
-
34
-
35
-
36
30
var passwordRecoverySender string = "hey@counter.dev"
37
31
var passwordRecoverSubject string = "Forgot your password?"
38
32
var passwordRecoveryContent string = `Hello %s,
@@ -51,13 +45,12 @@ Cheers,
51
45
52
46
The counter.dev team`
53
47
54
-
55
48
var uuid2id = map [string ]string {}
56
49
57
50
type User struct {
58
- redis redis.Conn
59
- db * gorm.DB
60
- Id string
51
+ redis redis.Conn
52
+ db * gorm.DB
53
+ Id string
61
54
passwordSalt string
62
55
}
63
56
@@ -93,13 +86,13 @@ func NewUser(conn redis.Conn, userId string, db *gorm.DB, passwordSalt []byte) U
93
86
return User {redis : conn , Id : truncate (userId ), passwordSalt : string (passwordSalt ), db : db }
94
87
}
95
88
96
- func NewUserByCachedUUID (conn redis.Conn , uuid string , db * gorm.DB , passwordSalt []byte ) (User , error ){
89
+ func NewUserByCachedUUID (conn redis.Conn , uuid string , db * gorm.DB , passwordSalt []byte ) (User , error ) {
97
90
var err error
98
91
// Basically we must 'id' here so it can be set inside the if clause
99
92
var id string
100
93
var ok bool
101
94
id , ok = uuid2id [uuid ]
102
- if ! ok {
95
+ if ! ok {
103
96
// hit the redis db
104
97
id , err = redis .String (conn .Do ("HGET" , "uuid2id" , uuid ))
105
98
if err == redis .ErrNil {
@@ -150,10 +143,9 @@ func (user User) ReadToken() (string, error) {
150
143
if err != nil {
151
144
return "" , err
152
145
}
153
- return base64 .URLEncoding .EncodeToString ([]byte (token )), nil
146
+ return base64 .URLEncoding .EncodeToString ([]byte (token )), nil
154
147
}
155
148
156
-
157
149
func (user User ) ReadUUID () (string , error ) {
158
150
return redis .String (user .redis .Do ("HGET" , "id2uuid" , user .Id ))
159
151
}
@@ -253,7 +245,6 @@ func (user User) VerifyTmpPassword(tmpPassword string) (bool, error) {
253
245
return hashedTmpPassword != "" && hashedTmpPassword == user .hashPassword (tmpPassword ), nil
254
246
}
255
247
256
-
257
248
func (user User ) VerifyPasswordOrTmpPassword (password string ) (bool , error ) {
258
249
259
250
// validate as password
@@ -277,7 +268,7 @@ func (user User) VerifyPasswordOrTmpPassword(password string) (bool, error) {
277
268
}
278
269
279
270
func (user User ) NewTmpPassword () (string , error ) {
280
- expire := 60 * 15 // 15 minutes
271
+ expire := 60 * 15 // 15 minutes
281
272
tmpPassword := base64 .URLEncoding .EncodeToString ([]byte (randToken ()[:8 ]))
282
273
_ , err := user .redis .Do ("SETEX" ,
283
274
fmt .Sprintf ("tmppwd:%s" , user .Id ), expire , user .hashPassword (tmpPassword ))
@@ -400,8 +391,7 @@ func (user User) HandleSignals(conn redis.Conn, cb func(error)) {
400
391
}
401
392
}
402
393
403
-
404
- func (user User ) PasswordRecovery (mailgunSecretApiKey string ) error {
394
+ func (user User ) PasswordRecovery (SMTPSecret string ) error {
405
395
mail , err := user .GetPref ("mail" )
406
396
if err != nil {
407
397
return err
@@ -410,57 +400,31 @@ func (user User) PasswordRecovery(mailgunSecretApiKey string) error {
410
400
if err != nil {
411
401
return err
412
402
}
413
- mg := mailgun .NewMailgun ("counter.dev" , mailgunSecretApiKey )
414
403
415
404
body := fmt .Sprintf (passwordRecoveryContent , user .Id , user .Id , tmppwd )
416
- message := mg .NewMessage (passwordRecoverySender , passwordRecoverSubject , body , mail )
417
-
418
- ctx , cancel := context .WithTimeout (context .Background (), time .Second * 30 )
419
- defer cancel ()
420
405
421
- _ , _ , err = mg .Send (ctx , message )
406
+ m := gomail .NewMessage ()
407
+ m .SetHeader ("From" , passwordRecoverySender )
408
+ m .SetHeader ("To" , mail )
409
+ m .SetHeader ("Subject" , passwordRecoverSubject )
410
+ m .SetBody ("text/plain" , body )
422
411
412
+ d := gomail .NewDialer ("smtp.protonmail.ch" , 587 , "hey@counter.dev" , SMTPSecret )
413
+ err = d .DialAndSend (m )
423
414
if err != nil {
424
415
return err
425
416
}
426
417
return nil
427
418
}
428
419
429
- func (user User ) SendSurvey (mailgunSecretApiKey string ) error {
430
- mail , err := user .GetPref ("mail" )
431
- if err != nil {
432
- return err
433
- }
434
- if mail == "" {
435
- return nil
436
- }
437
- mg := mailgun .NewMailgun ("counter.dev" , mailgunSecretApiKey )
438
-
439
- body := fmt .Sprintf (surveyText , user .Id )
440
- message := mg .NewMessage (surveySender , surveySubject , body , mail )
441
- message .SetDeliveryTime (time .Now ().Add (24 * 2 * time .Second ))
442
-
443
- ctx , cancel := context .WithTimeout (context .Background (), time .Second * 30 )
444
- defer cancel ()
445
-
446
- _ , _ , err = mg .Send (ctx , message )
447
-
448
- if err != nil {
449
- return err
450
- }
451
- return nil
452
- }
453
-
454
-
455
- func (user User ) RegisterSubscriptionID (subscriptionID string ) error {
420
+ func (user User ) RegisterSubscriptionID (subscriptionID string ) error {
456
421
_ , err := user .redis .Do ("HSET" , "subscription" , user .Id , subscriptionID )
457
422
if err != nil {
458
423
return err
459
424
}
460
425
return nil
461
426
}
462
427
463
-
464
428
func (user User ) ReadSubscriptionID () (string , error ) {
465
429
val , err := redis .String (user .redis .Do ("HGET" , "subscription" , user .Id ))
466
430
if err == redis .ErrNil {
0 commit comments