/
worker.go
108 lines (95 loc) · 2.26 KB
/
worker.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
package auth
import (
"encoding/json"
"fmt"
"time"
"github.com/SermoDigital/jose/jws"
log "github.com/Sirupsen/logrus"
"github.com/kapmahc/h2o/web"
"github.com/kapmahc/h2o/web/job"
gomail "gopkg.in/gomail.v2"
)
const (
actConfirm = "confirm"
actUnlock = "unlock"
actResetPassword = "reset-password"
sendEmailJob = "auth.send-email"
)
// Workers job handler
func (p *Plugin) Workers() map[string]job.Handler {
return map[string]job.Handler{
sendEmailJob: func(buf []byte) error {
var msg map[string]string
if err := json.Unmarshal(buf, &msg); err != nil {
return err
}
return p.doSendEmail(msg["to"], msg["subject"], msg["body"])
},
}
}
func (p *Plugin) sendEmail(lng string, user *User, act string) {
cm := jws.Claims{}
cm.Set("act", act)
cm.Set("uid", user.UID)
tkn, err := p.Jwt.Sum(cm, time.Hour*6)
if err != nil {
log.Error(err)
return
}
obj := struct {
Home string
Token string
}{
Home: web.Home(),
Token: string(tkn),
}
subject, err := p.I18n.F(lng, fmt.Sprintf("auth.emails.%s.subject", act), obj)
if err != nil {
log.Error(err)
return
}
body, err := p.I18n.F(lng, fmt.Sprintf("auth.emails.%s.body", act), obj)
if err != nil {
log.Error(err)
return
}
// -----------------------
p.Server.Send(job.PriorityLow, sendEmailJob, map[string]string{
"to": user.Email,
"subject": subject,
"body": body,
})
}
func (p *Plugin) parseToken(lng, tkn, act string) (*User, error) {
cm, err := p.Jwt.Validate([]byte(tkn))
if err != nil {
return nil, err
}
if act != cm.Get("act").(string) {
return nil, p.I18n.E(lng, "errors.bad-action")
}
return p.Dao.GetUserByUID(cm.Get("uid").(string))
}
func (p *Plugin) doSendEmail(to, subject, body string) error {
if !(web.IsProduction()) {
log.Debugf("send to %s: %s\n%s", to, subject, body)
return nil
}
smtp := make(map[string]interface{})
if err := p.Settings.Get("site.smtp", &smtp); err != nil {
return err
}
sender := smtp["username"].(string)
msg := gomail.NewMessage()
msg.SetHeader("From", sender)
msg.SetHeader("To", to)
msg.SetHeader("Subject", subject)
msg.SetBody("text/html", body)
dia := gomail.NewDialer(
smtp["host"].(string),
smtp["port"].(int),
sender,
smtp["password"].(string),
)
return dia.DialAndSend(msg)
}