notifications.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package notifications
  2. import (
  3. "bytes"
  4. "encoding/hex"
  5. "errors"
  6. "html/template"
  7. "path/filepath"
  8. "github.com/Unknwon/com"
  9. "github.com/grafana/grafana/pkg/bus"
  10. m "github.com/grafana/grafana/pkg/models"
  11. "github.com/grafana/grafana/pkg/setting"
  12. "github.com/grafana/grafana/pkg/util"
  13. )
  14. var mailTemplates *template.Template
  15. var tmplResetPassword = "reset_password.html"
  16. func Init() error {
  17. bus.AddHandler("email", sendResetPasswordEmail)
  18. mailTemplates = template.New("name")
  19. mailTemplates.Funcs(template.FuncMap{
  20. "Subject": subjectTemplateFunc,
  21. })
  22. templatePattern := filepath.Join(setting.StaticRootPath, "emails/*.html")
  23. _, err := mailTemplates.ParseGlob(templatePattern)
  24. if err != nil {
  25. return err
  26. }
  27. if !util.IsEmail(setting.Smtp.FromAddress) {
  28. return errors.New("Invalid email address for smpt from_adress config")
  29. }
  30. if setting.EmailCodeValidMinutes == 0 {
  31. setting.EmailCodeValidMinutes = 120
  32. }
  33. return nil
  34. }
  35. var dispatchMail = func(cmd *m.SendEmailCommand) error {
  36. return bus.Dispatch(cmd)
  37. }
  38. func subjectTemplateFunc(obj map[string]interface{}, value string) string {
  39. obj["value"] = value
  40. return ""
  41. }
  42. func sendResetPasswordEmail(cmd *m.SendResetPasswordEmailCommand) error {
  43. var buffer bytes.Buffer
  44. var data = getMailTmplData(cmd.User)
  45. code := CreateUserActiveCode(cmd.User, nil)
  46. data["Code"] = code
  47. mailTemplates.ExecuteTemplate(&buffer, tmplResetPassword, data)
  48. dispatchMail(&m.SendEmailCommand{
  49. To: []string{cmd.User.Email},
  50. From: setting.Smtp.FromAddress,
  51. Subject: data["Subject"].(map[string]interface{})["value"].(string),
  52. Body: buffer.String(),
  53. })
  54. return nil
  55. }
  56. func CreateUserActiveCode(u *m.User, startInf interface{}) string {
  57. minutes := setting.EmailCodeValidMinutes
  58. data := com.ToStr(u.Id) + u.Email + u.Login + u.Password + u.Rands
  59. code := CreateTimeLimitCode(data, minutes, startInf)
  60. // add tail hex username
  61. code += hex.EncodeToString([]byte(u.Login))
  62. return code
  63. }
  64. // // verify active code when active account
  65. // func VerifyUserActiveCode(code string) (user *User) {
  66. // minutes := setting.Service.ActiveCodeLives
  67. //
  68. // if user = getVerifyUser(code); user != nil {
  69. // // time limit code
  70. // prefix := code[:base.TimeLimitCodeLength]
  71. // data := com.ToStr(user.Id) + user.Email + user.LowerName + user.Passwd + user.Rands
  72. //
  73. // if base.VerifyTimeLimitCode(data, minutes, prefix) {
  74. // return user
  75. // }
  76. // }
  77. // return nil
  78. // }
  79. //
  80. // // verify active code when active account
  81. // func VerifyUserActiveCode(code string) (user *User) {
  82. // minutes := setting.Service.ActiveCodeLives
  83. //
  84. // if user = getVerifyUser(code); user != nil {
  85. // // time limit code
  86. // prefix := code[:base.TimeLimitCodeLength]
  87. // data := com.ToStr(user.Id) + user.Email + user.LowerName + user.Passwd + user.Rands
  88. //
  89. // if base.VerifyTimeLimitCode(data, minutes, prefix) {
  90. // return user
  91. // }
  92. // }
  93. // return nil
  94. // }