diff --git a/etc/password-changed-email.tpl b/etc/password-changed-email.tpl new file mode 100644 index 00000000..761ea162 --- /dev/null +++ b/etc/password-changed-email.tpl @@ -0,0 +1 @@ +您好,您的密码已被重置 diff --git a/src/modules/rdb/config/i18n.go b/src/modules/rdb/config/i18n.go index 78580ae1..6a111293 100644 --- a/src/modules/rdb/config/i18n.go +++ b/src/modules/rdb/config/i18n.go @@ -123,11 +123,12 @@ var ( "Invalid user status %d": "异常的用户状态 %d", "Password expired, please change the password in time": "密码过期,请及时修改密码", "First Login, please change the password in time": "初始登陆,请及时修改密码", - "no privilege": "privilege 未设置", - "node is nil": "node 未设置", - "operation is blank": "operation 未设置", - "Reset Password": "重置密码", - "Login Code": "登录验证码", + "no privilege": "privilege 未设置", + "node is nil": "node 未设置", + "operation is blank": "operation 未设置", + "Reset Password": "重置密码", + "Login Code": "登录验证码", + "[Notify] Password Changed": "[通知] 账号密码修改", }, } ) diff --git a/src/modules/rdb/http/router_auth.go b/src/modules/rdb/http/router_auth.go index 1fbcec6e..38274327 100644 --- a/src/modules/rdb/http/router_auth.go +++ b/src/modules/rdb/http/router_auth.go @@ -28,9 +28,10 @@ import ( ) var ( - loginCodeSmsTpl *template.Template - loginCodeEmailTpl *template.Template - errUnsupportCaptcha = errors.New("unsupported captcha") + loginCodeSmsTpl *template.Template + loginCodeEmailTpl *template.Template + passwordChangedEmailTpl *template.Template + errUnsupportCaptcha = errors.New("unsupported captcha") // https://captcha.mojotv.cn captchaDirver = base64Captcha.DriverString{ @@ -74,6 +75,16 @@ func init() { if err != nil { log.Fatalf("open %s err: %s", filename, err) } + + filename, err = getConfigFile("password-changed-email", "tpl") + if err != nil { + log.Fatal(err) + } + passwordChangedEmailTpl, err = template.ParseFiles(filename) + if err != nil { + log.Fatalf("open %s err: %s", filename, err) + } + } // login for UI @@ -525,6 +536,10 @@ func rstPassword(c *gin.Context) { if err := auth.ChangePassword(user, in.Password); err != nil { return err } + + if err := passwordChangedNotify(user); err != nil { + logger.Warningf("password changed notify error %s", err) + } lc.Del() return nil }() @@ -756,3 +771,12 @@ func sessionDestory(c *gin.Context) (sid string, err error) { return } + +func passwordChangedNotify(user *models.User) error { + var buf bytes.Buffer + if err := passwordChangedEmailTpl.Execute(&buf, nil); err != nil { + return err + } + + return redisc.Write(&dataobj.Message{Tos: []string{user.Email}, Subject: _s("[Notify] Password Changed"), Content: buf.String()}, config.MAIL_QUEUE_NAME) +} diff --git a/src/modules/rdb/http/router_self.go b/src/modules/rdb/http/router_self.go index 0f5c47f5..98e6d4d7 100644 --- a/src/modules/rdb/http/router_self.go +++ b/src/modules/rdb/http/router_self.go @@ -5,6 +5,7 @@ import ( "github.com/didi/nightingale/src/modules/rdb/auth" "github.com/didi/nightingale/src/modules/rdb/config" "github.com/gin-gonic/gin" + "github.com/toolkits/pkg/logger" ) func selfProfileGet(c *gin.Context) { @@ -58,7 +59,15 @@ func selfPasswordPut(c *gin.Context) { return _e("Incorrect old password") } - return auth.ChangePassword(user, f.NewPass) + if err := auth.ChangePassword(user, f.NewPass); err != nil { + return err + } + + if err := passwordChangedNotify(user); err != nil { + logger.Warningf("password changed notify error %s", err) + } + + return nil }() renderMessage(c, err) diff --git a/src/modules/rdb/http/router_user.go b/src/modules/rdb/http/router_user.go index 3ccb3cb0..263cb042 100644 --- a/src/modules/rdb/http/router_user.go +++ b/src/modules/rdb/http/router_user.go @@ -7,6 +7,7 @@ import ( "time" "github.com/gin-gonic/gin" + "github.com/toolkits/pkg/logger" "github.com/toolkits/pkg/str" "github.com/didi/nightingale/src/models" @@ -200,6 +201,9 @@ func userPasswordPut(c *gin.Context) { err := auth.ChangePassword(user, f.Password) if err == nil { + if err := passwordChangedNotify(user); err != nil { + logger.Warningf("password changed notify error %s", err) + } go models.OperationLogNew(root.Username, "user", user.Id, fmt.Sprintf("UserChangePassword %s", user.Username)) } renderMessage(c, err)