| 
									
										
										
										
											2015-06-04 23:23:46 +08:00
										 |  |  | package notifications | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-05 17:08:19 +08:00
										 |  |  | import ( | 
					
						
							|  |  |  | 	"bytes" | 
					
						
							|  |  |  | 	"errors" | 
					
						
							|  |  |  | 	"html/template" | 
					
						
							|  |  |  | 	"path/filepath" | 
					
						
							| 
									
										
										
										
											2015-06-04 23:23:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-05 17:08:19 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/bus" | 
					
						
							| 
									
										
										
										
											2015-06-08 23:56:56 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/events" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/log" | 
					
						
							| 
									
										
										
										
											2015-06-05 17:08:19 +08:00
										 |  |  | 	m "github.com/grafana/grafana/pkg/models" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/setting" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/util" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var mailTemplates *template.Template | 
					
						
							|  |  |  | var tmplResetPassword = "reset_password.html" | 
					
						
							| 
									
										
										
										
											2015-06-08 23:56:56 +08:00
										 |  |  | var tmplWelcomeOnSignUp = "welcome_on_signup.html" | 
					
						
							| 
									
										
										
										
											2015-06-05 17:08:19 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func Init() error { | 
					
						
							| 
									
										
										
										
											2015-06-08 22:51:25 +08:00
										 |  |  | 	initMailQueue() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-04 23:23:46 +08:00
										 |  |  | 	bus.AddHandler("email", sendResetPasswordEmail) | 
					
						
							| 
									
										
										
										
											2015-06-08 19:39:02 +08:00
										 |  |  | 	bus.AddHandler("email", validateResetPasswordCode) | 
					
						
							| 
									
										
										
										
											2015-06-08 22:51:25 +08:00
										 |  |  | 	bus.AddHandler("email", sendEmailCommandHandler) | 
					
						
							| 
									
										
										
										
											2015-06-05 17:08:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-08 23:56:56 +08:00
										 |  |  | 	bus.AddEventListener(userSignedUpHandler) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-05 17:08:19 +08:00
										 |  |  | 	mailTemplates = template.New("name") | 
					
						
							|  |  |  | 	mailTemplates.Funcs(template.FuncMap{ | 
					
						
							|  |  |  | 		"Subject": subjectTemplateFunc, | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-09 00:25:04 +08:00
										 |  |  | 	templatePattern := filepath.Join(setting.StaticRootPath, setting.Smtp.TemplatesPattern) | 
					
						
							| 
									
										
										
										
											2015-06-05 17:08:19 +08:00
										 |  |  | 	_, err := mailTemplates.ParseGlob(templatePattern) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if !util.IsEmail(setting.Smtp.FromAddress) { | 
					
						
							|  |  |  | 		return errors.New("Invalid email address for smpt from_adress config") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-08 16:57:01 +08:00
										 |  |  | 	if setting.EmailCodeValidMinutes == 0 { | 
					
						
							|  |  |  | 		setting.EmailCodeValidMinutes = 120 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-05 17:08:19 +08:00
										 |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func subjectTemplateFunc(obj map[string]interface{}, value string) string { | 
					
						
							|  |  |  | 	obj["value"] = value | 
					
						
							|  |  |  | 	return "" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-08 22:51:25 +08:00
										 |  |  | func sendEmailCommandHandler(cmd *m.SendEmailCommand) error { | 
					
						
							| 
									
										
										
										
											2015-06-08 23:56:56 +08:00
										 |  |  | 	if !setting.Smtp.Enabled { | 
					
						
							|  |  |  | 		return errors.New("Grafana mailing/smtp options not configured, contact your Grafana admin") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-05 17:08:19 +08:00
										 |  |  | 	var buffer bytes.Buffer | 
					
						
							| 
									
										
										
										
											2015-06-08 22:51:25 +08:00
										 |  |  | 	data := cmd.Data | 
					
						
							|  |  |  | 	if data == nil { | 
					
						
							|  |  |  | 		data = make(map[string]interface{}, 10) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-06-05 17:08:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-08 22:51:25 +08:00
										 |  |  | 	setDefaultTemplateData(data, nil) | 
					
						
							|  |  |  | 	mailTemplates.ExecuteTemplate(&buffer, cmd.Template, data) | 
					
						
							| 
									
										
										
										
											2015-06-05 17:08:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-14 12:07:36 +08:00
										 |  |  | 	subjectTmplText := data["Subject"].(map[string]interface{})["value"].(string) | 
					
						
							|  |  |  | 	subjectTmpl, err := template.New("subject").Parse(subjectTmplText) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var subjectBuffer bytes.Buffer | 
					
						
							|  |  |  | 	err = subjectTmpl.ExecuteTemplate(&subjectBuffer, "subject", data) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-08 22:51:25 +08:00
										 |  |  | 	addToMailQueue(&Message{ | 
					
						
							|  |  |  | 		To:      cmd.To, | 
					
						
							| 
									
										
										
										
											2015-06-05 17:08:19 +08:00
										 |  |  | 		From:    setting.Smtp.FromAddress, | 
					
						
							| 
									
										
										
										
											2015-06-14 12:07:36 +08:00
										 |  |  | 		Subject: subjectBuffer.String(), | 
					
						
							| 
									
										
										
										
											2015-06-05 17:08:19 +08:00
										 |  |  | 		Body:    buffer.String(), | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-05 14:15:38 +08:00
										 |  |  | 	return nil | 
					
						
							| 
									
										
										
										
											2015-06-04 23:23:46 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-06-05 17:08:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-08 22:51:25 +08:00
										 |  |  | func sendResetPasswordEmail(cmd *m.SendResetPasswordEmailCommand) error { | 
					
						
							|  |  |  | 	return sendEmailCommandHandler(&m.SendEmailCommand{ | 
					
						
							|  |  |  | 		To:       []string{cmd.User.Email}, | 
					
						
							|  |  |  | 		Template: tmplResetPassword, | 
					
						
							|  |  |  | 		Data: map[string]interface{}{ | 
					
						
							|  |  |  | 			"Code": createUserEmailCode(cmd.User, nil), | 
					
						
							|  |  |  | 			"Name": cmd.User.NameOrFallback(), | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-08 19:39:02 +08:00
										 |  |  | func validateResetPasswordCode(query *m.ValidateResetPasswordCodeQuery) error { | 
					
						
							|  |  |  | 	login := getLoginForEmailCode(query.Code) | 
					
						
							|  |  |  | 	if login == "" { | 
					
						
							|  |  |  | 		return m.ErrInvalidEmailCode | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-06-05 17:08:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-08 19:39:02 +08:00
										 |  |  | 	userQuery := m.GetUserByLoginQuery{LoginOrEmail: login} | 
					
						
							|  |  |  | 	if err := bus.Dispatch(&userQuery); err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-06-08 16:57:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-08 19:39:02 +08:00
										 |  |  | 	if !validateUserEmailCode(userQuery.Result, query.Code) { | 
					
						
							|  |  |  | 		return m.ErrInvalidEmailCode | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	query.Result = userQuery.Result | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-06-08 23:56:56 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func userSignedUpHandler(evt *events.UserSignedUp) error { | 
					
						
							|  |  |  | 	log.Info("User signed up: %s, send_option: %s", evt.Email, setting.Smtp.SendWelcomeEmailOnSignUp) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if evt.Email == "" || !setting.Smtp.SendWelcomeEmailOnSignUp { | 
					
						
							|  |  |  | 		return nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return sendEmailCommandHandler(&m.SendEmailCommand{ | 
					
						
							|  |  |  | 		To:       []string{evt.Email}, | 
					
						
							|  |  |  | 		Template: tmplWelcomeOnSignUp, | 
					
						
							|  |  |  | 		Data: map[string]interface{}{ | 
					
						
							| 
									
										
										
										
											2015-08-27 19:59:58 +08:00
										 |  |  | 			"Email": evt.Email, | 
					
						
							| 
									
										
										
										
											2015-06-08 23:56:56 +08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } |