From d48be63513ec083c3073df5b7c50525d18bf0181 Mon Sep 17 00:00:00 2001 From: Thomas Balthazar Date: Wed, 18 May 2016 17:14:55 +0200 Subject: Move away from the "andForget" style of function (#3043) As suggested by @crspeller here: https://github.com/mattermost/platform/pull/3022#issuecomment-220004020 --- api/oauth.go | 2 +- api/user.go | 312 +++++++++++++++++++++++++++-------------------------------- 2 files changed, 144 insertions(+), 170 deletions(-) diff --git a/api/oauth.go b/api/oauth.go index 37ca5ce0a..30efbdce3 100644 --- a/api/oauth.go +++ b/api/oauth.go @@ -636,5 +636,5 @@ func CompleteSwitchWithOAuth(c *Context, w http.ResponseWriter, r *http.Request, return } - sendSignInChangeEmailAndForget(c, user.Email, c.GetSiteURL(), strings.Title(service)+" SSO") + go sendSignInChangeEmail(c, user.Email, c.GetSiteURL(), strings.Title(service)+" SSO") } diff --git a/api/user.go b/api/user.go index da94a0ff5..34e6c01af 100644 --- a/api/user.go +++ b/api/user.go @@ -90,7 +90,7 @@ func createUser(c *Context, w http.ResponseWriter, r *http.Request) { hash := r.URL.Query().Get("h") teamId := "" var team *model.Team - sendWelcomeEmail := true + shouldSendWelcomeEmail := true user.EmailVerified = false if len(hash) > 0 { @@ -120,7 +120,7 @@ func createUser(c *Context, w http.ResponseWriter, r *http.Request) { user.Email = props["email"] user.EmailVerified = true - sendWelcomeEmail = false + shouldSendWelcomeEmail = false } inviteId := r.URL.Query().Get("iid") @@ -170,11 +170,11 @@ func createUser(c *Context, w http.ResponseWriter, r *http.Request) { return } - addDirectChannelsAndForget(team.Id, ruser) + go addDirectChannels(team.Id, ruser) } - if sendWelcomeEmail { - sendWelcomeEmailAndForget(c, ruser.Id, ruser.Email, c.GetSiteURL(), ruser.EmailVerified) + if shouldSendWelcomeEmail { + go sendWelcomeEmail(c, ruser.Id, ruser.Email, c.GetSiteURL(), ruser.EmailVerified) } w.Write([]byte(ruser.ToJson())) @@ -330,7 +330,7 @@ func CreateOAuthUser(c *Context, w http.ResponseWriter, r *http.Request, service return nil } - addDirectChannelsAndForget(team.Id, user) + go addDirectChannels(team.Id, user) } } @@ -342,91 +342,83 @@ func CreateOAuthUser(c *Context, w http.ResponseWriter, r *http.Request, service return ruser } -func sendWelcomeEmailAndForget(c *Context, userId string, email string, siteURL string, verified bool) { - go func() { - - subjectPage := utils.NewHTMLTemplate("welcome_subject", c.Locale) - subjectPage.Props["Subject"] = c.T("api.templates.welcome_subject", map[string]interface{}{"TeamDisplayName": siteURL}) - - bodyPage := utils.NewHTMLTemplate("welcome_body", c.Locale) - bodyPage.Props["SiteURL"] = siteURL - bodyPage.Props["Title"] = c.T("api.templates.welcome_body.title", map[string]interface{}{"TeamDisplayName": siteURL}) - bodyPage.Props["Info"] = c.T("api.templates.welcome_body.info") - bodyPage.Props["Button"] = c.T("api.templates.welcome_body.button") - bodyPage.Props["Info2"] = c.T("api.templates.welcome_body.info2") - bodyPage.Props["Info3"] = c.T("api.templates.welcome_body.info3") - bodyPage.Props["TeamURL"] = siteURL - - if !verified { - link := fmt.Sprintf("%s/do_verify_email?uid=%s&hid=%s&email=%s", siteURL, userId, model.HashPassword(userId), url.QueryEscape(email)) - bodyPage.Props["VerifyUrl"] = link - } +func sendWelcomeEmail(c *Context, userId string, email string, siteURL string, verified bool) { + subjectPage := utils.NewHTMLTemplate("welcome_subject", c.Locale) + subjectPage.Props["Subject"] = c.T("api.templates.welcome_subject", map[string]interface{}{"TeamDisplayName": siteURL}) + + bodyPage := utils.NewHTMLTemplate("welcome_body", c.Locale) + bodyPage.Props["SiteURL"] = siteURL + bodyPage.Props["Title"] = c.T("api.templates.welcome_body.title", map[string]interface{}{"TeamDisplayName": siteURL}) + bodyPage.Props["Info"] = c.T("api.templates.welcome_body.info") + bodyPage.Props["Button"] = c.T("api.templates.welcome_body.button") + bodyPage.Props["Info2"] = c.T("api.templates.welcome_body.info2") + bodyPage.Props["Info3"] = c.T("api.templates.welcome_body.info3") + bodyPage.Props["TeamURL"] = siteURL + + if !verified { + link := fmt.Sprintf("%s/do_verify_email?uid=%s&hid=%s&email=%s", siteURL, userId, model.HashPassword(userId), url.QueryEscape(email)) + bodyPage.Props["VerifyUrl"] = link + } - if err := utils.SendMail(email, subjectPage.Render(), bodyPage.Render()); err != nil { - l4g.Error(utils.T("api.user.send_welcome_email_and_forget.failed.error"), err) - } - }() + if err := utils.SendMail(email, subjectPage.Render(), bodyPage.Render()); err != nil { + l4g.Error(utils.T("api.user.send_welcome_email_and_forget.failed.error"), err) + } } -func addDirectChannelsAndForget(teamId string, user *model.User) { - go func() { - var profiles map[string]*model.User - if result := <-Srv.Store.User().GetProfiles(teamId); result.Err != nil { - l4g.Error(utils.T("api.user.add_direct_channels_and_forget.failed.error"), user.Id, teamId, result.Err.Error()) - return - } else { - profiles = result.Data.(map[string]*model.User) - } +func addDirectChannels(teamId string, user *model.User) { + var profiles map[string]*model.User + if result := <-Srv.Store.User().GetProfiles(teamId); result.Err != nil { + l4g.Error(utils.T("api.user.add_direct_channels_and_forget.failed.error"), user.Id, teamId, result.Err.Error()) + return + } else { + profiles = result.Data.(map[string]*model.User) + } - var preferences model.Preferences + var preferences model.Preferences - for id := range profiles { - if id == user.Id { - continue - } + for id := range profiles { + if id == user.Id { + continue + } - profile := profiles[id] + profile := profiles[id] - preference := model.Preference{ - UserId: user.Id, - Category: model.PREFERENCE_CATEGORY_DIRECT_CHANNEL_SHOW, - Name: profile.Id, - Value: "true", - } + preference := model.Preference{ + UserId: user.Id, + Category: model.PREFERENCE_CATEGORY_DIRECT_CHANNEL_SHOW, + Name: profile.Id, + Value: "true", + } - preferences = append(preferences, preference) + preferences = append(preferences, preference) - if len(preferences) >= 10 { - break - } + if len(preferences) >= 10 { + break } + } - if result := <-Srv.Store.Preference().Save(&preferences); result.Err != nil { - l4g.Error(utils.T("api.user.add_direct_channels_and_forget.failed.error"), user.Id, teamId, result.Err.Error()) - } - }() + if result := <-Srv.Store.Preference().Save(&preferences); result.Err != nil { + l4g.Error(utils.T("api.user.add_direct_channels_and_forget.failed.error"), user.Id, teamId, result.Err.Error()) + } } -func SendVerifyEmailAndForget(c *Context, userId, userEmail, siteURL string) { - go func() { - - link := fmt.Sprintf("%s/do_verify_email?uid=%s&hid=%s&email=%s", siteURL, userId, model.HashPassword(userId), url.QueryEscape(userEmail)) +func SendVerifyEmail(c *Context, userId, userEmail, siteURL string) { + link := fmt.Sprintf("%s/do_verify_email?uid=%s&hid=%s&email=%s", siteURL, userId, model.HashPassword(userId), url.QueryEscape(userEmail)) - subjectPage := utils.NewHTMLTemplate("verify_subject", c.Locale) - subjectPage.Props["Subject"] = c.T("api.templates.verify_subject", - map[string]interface{}{"TeamDisplayName": utils.ClientCfg["SiteName"], "SiteName": utils.ClientCfg["SiteName"]}) + subjectPage := utils.NewHTMLTemplate("verify_subject", c.Locale) + subjectPage.Props["Subject"] = c.T("api.templates.verify_subject", + map[string]interface{}{"TeamDisplayName": utils.ClientCfg["SiteName"], "SiteName": utils.ClientCfg["SiteName"]}) - bodyPage := utils.NewHTMLTemplate("verify_body", c.Locale) - bodyPage.Props["SiteURL"] = siteURL - bodyPage.Props["Title"] = c.T("api.templates.verify_body.title", map[string]interface{}{"TeamDisplayName": utils.ClientCfg["SiteName"]}) - bodyPage.Props["Info"] = c.T("api.templates.verify_body.info") - bodyPage.Props["VerifyUrl"] = link - bodyPage.Props["Button"] = c.T("api.templates.verify_body.button") + bodyPage := utils.NewHTMLTemplate("verify_body", c.Locale) + bodyPage.Props["SiteURL"] = siteURL + bodyPage.Props["Title"] = c.T("api.templates.verify_body.title", map[string]interface{}{"TeamDisplayName": utils.ClientCfg["SiteName"]}) + bodyPage.Props["Info"] = c.T("api.templates.verify_body.info") + bodyPage.Props["VerifyUrl"] = link + bodyPage.Props["Button"] = c.T("api.templates.verify_body.button") - if err := utils.SendMail(userEmail, subjectPage.Render(), bodyPage.Render()); err != nil { - l4g.Error(utils.T("api.user.send_verify_email_and_forget.failed.error"), err) - } - }() + if err := utils.SendMail(userEmail, subjectPage.Render(), bodyPage.Render()); err != nil { + l4g.Error(utils.T("api.user.send_verify_email_and_forget.failed.error"), err) + } } func login(c *Context, w http.ResponseWriter, r *http.Request) { @@ -1285,15 +1277,15 @@ func updateUser(c *Context, w http.ResponseWriter, r *http.Request) { rusers := result.Data.([2]*model.User) if rusers[0].Email != rusers[1].Email { - sendEmailChangeEmailAndForget(c, rusers[1].Email, rusers[0].Email, c.GetSiteURL()) + go sendEmailChangeEmail(c, rusers[1].Email, rusers[0].Email, c.GetSiteURL()) if utils.Cfg.EmailSettings.RequireEmailVerification { - SendEmailChangeVerifyEmailAndForget(c, rusers[0].Id, rusers[0].Email, c.GetSiteURL()) + go SendEmailChangeVerifyEmail(c, rusers[0].Id, rusers[0].Email, c.GetSiteURL()) } } if rusers[0].Username != rusers[1].Username { - sendEmailChangeUsernameAndForget(c, rusers[1].Username, rusers[0].Username, rusers[0].Email, c.GetSiteURL()) + go sendEmailChangeUsername(c, rusers[1].Username, rusers[0].Username, rusers[0].Email, c.GetSiteURL()) } rusers[0].Password = "" @@ -1365,7 +1357,7 @@ func updatePassword(c *Context, w http.ResponseWriter, r *http.Request) { } else { c.LogAudit("completed") - sendPasswordChangeEmailAndForget(c, user.Email, c.GetSiteURL(), c.T("api.user.update_password.menu")) + go sendPasswordChangeEmail(c, user.Email, c.GetSiteURL(), c.T("api.user.update_password.menu")) data := make(map[string]string) data["user_id"] = uresult.Data.(string) @@ -1767,95 +1759,81 @@ func ResetPassword(c *Context, userId, newPassword string) *model.AppError { return result.Err } - sendPasswordChangeEmailAndForget(c, user.Email, c.GetSiteURL(), c.T("api.user.reset_password.method")) + go sendPasswordChangeEmail(c, user.Email, c.GetSiteURL(), c.T("api.user.reset_password.method")) return nil } -func sendPasswordChangeEmailAndForget(c *Context, email, siteURL, method string) { - go func() { - - subjectPage := utils.NewHTMLTemplate("password_change_subject", c.Locale) - subjectPage.Props["Subject"] = c.T("api.templates.password_change_subject", - map[string]interface{}{"TeamDisplayName": utils.Cfg.TeamSettings.SiteName, "SiteName": utils.Cfg.TeamSettings.SiteName}) +func sendPasswordChangeEmail(c *Context, email, siteURL, method string) { + subjectPage := utils.NewHTMLTemplate("password_change_subject", c.Locale) + subjectPage.Props["Subject"] = c.T("api.templates.password_change_subject", + map[string]interface{}{"TeamDisplayName": utils.Cfg.TeamSettings.SiteName, "SiteName": utils.Cfg.TeamSettings.SiteName}) - bodyPage := utils.NewHTMLTemplate("password_change_body", c.Locale) - bodyPage.Props["SiteURL"] = siteURL - bodyPage.Props["Title"] = c.T("api.templates.password_change_body.title") - bodyPage.Html["Info"] = template.HTML(c.T("api.templates.password_change_body.info", - map[string]interface{}{"TeamDisplayName": utils.Cfg.TeamSettings.SiteName, "TeamURL": siteURL, "Method": method})) + bodyPage := utils.NewHTMLTemplate("password_change_body", c.Locale) + bodyPage.Props["SiteURL"] = siteURL + bodyPage.Props["Title"] = c.T("api.templates.password_change_body.title") + bodyPage.Html["Info"] = template.HTML(c.T("api.templates.password_change_body.info", + map[string]interface{}{"TeamDisplayName": utils.Cfg.TeamSettings.SiteName, "TeamURL": siteURL, "Method": method})) - if err := utils.SendMail(email, subjectPage.Render(), bodyPage.Render()); err != nil { - l4g.Error(utils.T("api.user.send_password_change_email_and_forget.error"), err) - } - - }() + if err := utils.SendMail(email, subjectPage.Render(), bodyPage.Render()); err != nil { + l4g.Error(utils.T("api.user.send_password_change_email_and_forget.error"), err) + } } -func sendEmailChangeEmailAndForget(c *Context, oldEmail, newEmail, siteURL string) { - go func() { - - subjectPage := utils.NewHTMLTemplate("email_change_subject", c.Locale) - subjectPage.Props["Subject"] = c.T("api.templates.email_change_subject", - map[string]interface{}{"TeamDisplayName": utils.Cfg.TeamSettings.SiteName}) - subjectPage.Props["SiteName"] = utils.Cfg.TeamSettings.SiteName - - bodyPage := utils.NewHTMLTemplate("email_change_body", c.Locale) - bodyPage.Props["SiteURL"] = siteURL - bodyPage.Props["Title"] = c.T("api.templates.email_change_body.title") - bodyPage.Html["Info"] = template.HTML(c.T("api.templates.email_change_body.info", - map[string]interface{}{"TeamDisplayName": utils.Cfg.TeamSettings.SiteName, "NewEmail": newEmail})) +func sendEmailChangeEmail(c *Context, oldEmail, newEmail, siteURL string) { + subjectPage := utils.NewHTMLTemplate("email_change_subject", c.Locale) + subjectPage.Props["Subject"] = c.T("api.templates.email_change_subject", + map[string]interface{}{"TeamDisplayName": utils.Cfg.TeamSettings.SiteName}) + subjectPage.Props["SiteName"] = utils.Cfg.TeamSettings.SiteName - if err := utils.SendMail(oldEmail, subjectPage.Render(), bodyPage.Render()); err != nil { - l4g.Error(utils.T("api.user.send_email_change_email_and_forget.error"), err) - } + bodyPage := utils.NewHTMLTemplate("email_change_body", c.Locale) + bodyPage.Props["SiteURL"] = siteURL + bodyPage.Props["Title"] = c.T("api.templates.email_change_body.title") + bodyPage.Html["Info"] = template.HTML(c.T("api.templates.email_change_body.info", + map[string]interface{}{"TeamDisplayName": utils.Cfg.TeamSettings.SiteName, "NewEmail": newEmail})) - }() + if err := utils.SendMail(oldEmail, subjectPage.Render(), bodyPage.Render()); err != nil { + l4g.Error(utils.T("api.user.send_email_change_email_and_forget.error"), err) + } } -func SendEmailChangeVerifyEmailAndForget(c *Context, userId, newUserEmail, siteURL string) { - go func() { +func SendEmailChangeVerifyEmail(c *Context, userId, newUserEmail, siteURL string) { + link := fmt.Sprintf("%s/do_verify_email?uid=%s&hid=%s&email=%s", siteURL, userId, model.HashPassword(userId), url.QueryEscape(newUserEmail)) - link := fmt.Sprintf("%s/do_verify_email?uid=%s&hid=%s&email=%s", siteURL, userId, model.HashPassword(userId), url.QueryEscape(newUserEmail)) + subjectPage := utils.NewHTMLTemplate("email_change_verify_subject", c.Locale) + subjectPage.Props["Subject"] = c.T("api.templates.email_change_verify_subject", + map[string]interface{}{"TeamDisplayName": utils.Cfg.TeamSettings.SiteName}) + subjectPage.Props["SiteName"] = utils.Cfg.TeamSettings.SiteName - subjectPage := utils.NewHTMLTemplate("email_change_verify_subject", c.Locale) - subjectPage.Props["Subject"] = c.T("api.templates.email_change_verify_subject", - map[string]interface{}{"TeamDisplayName": utils.Cfg.TeamSettings.SiteName}) - subjectPage.Props["SiteName"] = utils.Cfg.TeamSettings.SiteName + bodyPage := utils.NewHTMLTemplate("email_change_verify_body", c.Locale) + bodyPage.Props["SiteURL"] = siteURL + bodyPage.Props["Title"] = c.T("api.templates.email_change_verify_body.title") + bodyPage.Props["Info"] = c.T("api.templates.email_change_verify_body.info", + map[string]interface{}{"TeamDisplayName": utils.Cfg.TeamSettings.SiteName}) + bodyPage.Props["VerifyUrl"] = link + bodyPage.Props["VerifyButton"] = c.T("api.templates.email_change_verify_body.button") - bodyPage := utils.NewHTMLTemplate("email_change_verify_body", c.Locale) - bodyPage.Props["SiteURL"] = siteURL - bodyPage.Props["Title"] = c.T("api.templates.email_change_verify_body.title") - bodyPage.Props["Info"] = c.T("api.templates.email_change_verify_body.info", - map[string]interface{}{"TeamDisplayName": utils.Cfg.TeamSettings.SiteName}) - bodyPage.Props["VerifyUrl"] = link - bodyPage.Props["VerifyButton"] = c.T("api.templates.email_change_verify_body.button") - - if err := utils.SendMail(newUserEmail, subjectPage.Render(), bodyPage.Render()); err != nil { - l4g.Error(utils.T("api.user.send_email_change_verify_email_and_forget.error"), err) - } - }() + if err := utils.SendMail(newUserEmail, subjectPage.Render(), bodyPage.Render()); err != nil { + l4g.Error(utils.T("api.user.send_email_change_verify_email_and_forget.error"), err) + } } -func sendEmailChangeUsernameAndForget(c *Context, oldUsername, newUsername, email, siteURL string) { - go func() { +func sendEmailChangeUsername(c *Context, oldUsername, newUsername, email, siteURL string) { + subjectPage := utils.NewHTMLTemplate("username_change_subject", c.Locale) + subjectPage.Props["Subject"] = c.T("api.templates.username_change_subject", + map[string]interface{}{"TeamDisplayName": utils.Cfg.TeamSettings.SiteName}) + subjectPage.Props["SiteName"] = utils.Cfg.TeamSettings.SiteName - subjectPage := utils.NewHTMLTemplate("username_change_subject", c.Locale) - subjectPage.Props["Subject"] = c.T("api.templates.username_change_subject", - map[string]interface{}{"TeamDisplayName": utils.Cfg.TeamSettings.SiteName}) - subjectPage.Props["SiteName"] = utils.Cfg.TeamSettings.SiteName + bodyPage := utils.NewHTMLTemplate("email_change_body", c.Locale) + bodyPage.Props["SiteURL"] = siteURL + bodyPage.Props["Title"] = c.T("api.templates.username_change_body.title") + bodyPage.Html["Info"] = template.HTML(c.T("api.templates.username_change_body.info", + map[string]interface{}{"TeamDisplayName": utils.Cfg.TeamSettings.SiteName, "NewUsername": newUsername})) - bodyPage := utils.NewHTMLTemplate("email_change_body", c.Locale) - bodyPage.Props["SiteURL"] = siteURL - bodyPage.Props["Title"] = c.T("api.templates.username_change_body.title") - bodyPage.Html["Info"] = template.HTML(c.T("api.templates.username_change_body.info", - map[string]interface{}{"TeamDisplayName": utils.Cfg.TeamSettings.SiteName, "NewUsername": newUsername})) - - if err := utils.SendMail(email, subjectPage.Render(), bodyPage.Render()); err != nil { - l4g.Error(utils.T("api.user.send_email_change_username_and_forget.error"), err) - } + if err := utils.SendMail(email, subjectPage.Render(), bodyPage.Render()); err != nil { + l4g.Error(utils.T("api.user.send_email_change_username_and_forget.error"), err) + } - }() } func updateUserNotify(c *Context, w http.ResponseWriter, r *http.Request) { @@ -2055,7 +2033,7 @@ func oauthToEmail(c *Context, w http.ResponseWriter, r *http.Request) { return } - sendSignInChangeEmailAndForget(c, user.Email, c.GetSiteURL(), c.T("api.templates.signin_change_email.body.method_email")) + go sendSignInChangeEmail(c, user.Email, c.GetSiteURL(), c.T("api.templates.signin_change_email.body.method_email")) RevokeAllSession(c, c.Session.UserId) if c.Err != nil { @@ -2131,7 +2109,7 @@ func emailToLdap(c *Context, w http.ResponseWriter, r *http.Request) { return } - sendSignInChangeEmailAndForget(c, user.Email, c.GetSiteURL(), "LDAP") + go sendSignInChangeEmail(c, user.Email, c.GetSiteURL(), "LDAP") m := map[string]string{} m["follow_link"] = "/login?extra=signin_change" @@ -2201,7 +2179,7 @@ func ldapToEmail(c *Context, w http.ResponseWriter, r *http.Request) { return } - sendSignInChangeEmailAndForget(c, user.Email, c.GetSiteURL(), c.T("api.templates.signin_change_email.body.method_email")) + go sendSignInChangeEmail(c, user.Email, c.GetSiteURL(), c.T("api.templates.signin_change_email.body.method_email")) m := map[string]string{} m["follow_link"] = "/login?extra=signin_change" @@ -2210,24 +2188,20 @@ func ldapToEmail(c *Context, w http.ResponseWriter, r *http.Request) { w.Write([]byte(model.MapToJson(m))) } -func sendSignInChangeEmailAndForget(c *Context, email, siteURL, method string) { - go func() { - - subjectPage := utils.NewHTMLTemplate("signin_change_subject", c.Locale) - subjectPage.Props["Subject"] = c.T("api.templates.singin_change_email.subject", - map[string]interface{}{"SiteName": utils.ClientCfg["SiteName"]}) - - bodyPage := utils.NewHTMLTemplate("signin_change_body", c.Locale) - bodyPage.Props["SiteURL"] = siteURL - bodyPage.Props["Title"] = c.T("api.templates.signin_change_email.body.title") - bodyPage.Html["Info"] = template.HTML(c.T("api.templates.singin_change_email.body.info", - map[string]interface{}{"SiteName": utils.ClientCfg["SiteName"], "Method": method})) +func sendSignInChangeEmail(c *Context, email, siteURL, method string) { + subjectPage := utils.NewHTMLTemplate("signin_change_subject", c.Locale) + subjectPage.Props["Subject"] = c.T("api.templates.singin_change_email.subject", + map[string]interface{}{"SiteName": utils.ClientCfg["SiteName"]}) - if err := utils.SendMail(email, subjectPage.Render(), bodyPage.Render()); err != nil { - l4g.Error(utils.T("api.user.send_sign_in_change_email_and_forget.error"), err) - } + bodyPage := utils.NewHTMLTemplate("signin_change_body", c.Locale) + bodyPage.Props["SiteURL"] = siteURL + bodyPage.Props["Title"] = c.T("api.templates.signin_change_email.body.title") + bodyPage.Html["Info"] = template.HTML(c.T("api.templates.singin_change_email.body.info", + map[string]interface{}{"SiteName": utils.ClientCfg["SiteName"], "Method": method})) - }() + if err := utils.SendMail(email, subjectPage.Render(), bodyPage.Render()); err != nil { + l4g.Error(utils.T("api.user.send_sign_in_change_email_and_forget.error"), err) + } } func verifyEmail(c *Context, w http.ResponseWriter, r *http.Request) { @@ -2274,9 +2248,9 @@ func resendVerification(c *Context, w http.ResponseWriter, r *http.Request) { user := result.Data.(*model.User) if user.LastActivityAt > 0 { - SendEmailChangeVerifyEmailAndForget(c, user.Id, user.Email, c.GetSiteURL()) + go SendEmailChangeVerifyEmail(c, user.Id, user.Email, c.GetSiteURL()) } else { - SendVerifyEmailAndForget(c, user.Id, user.Email, c.GetSiteURL()) + go SendVerifyEmail(c, user.Id, user.Email, c.GetSiteURL()) } } } -- cgit v1.2.3-1-g7c22