func renderContactForm(c *reqContext, context template.Context, formValues url.Values, h *nodeHandler) error { G, _, _, _ := gettext.DefaultLocales.Use("", c.Site.Locale) data := contactFormData{} form := htmlwidgets.NewForm(&data) form.AddWidget(&htmlwidgets.TextWidget{MinLength: 1, ValidationError: G("Required.")}, "Name", G("Name"), "") form.AddWidget(&htmlwidgets.TextWidget{MinLength: 1, ValidationError: G("Required.")}, "Email", G("Email"), "") form.AddWidget(&htmlwidgets.TextWidget{MinLength: 1, ValidationError: G("Required.")}, "Subject", G("Subject"), "") form.AddWidget(&htmlwidgets.TextAreaWidget{MinLength: 1, ValidationError: G("Required.")}, "Message", G("Message"), "") switch c.Req.Method { case "GET": if _, submitted := formValues["submitted"]; submitted { context["Submitted"] = 1 } case "POST": if form.Fill(formValues) { mail := mimemail.Mail{ From: mimemail.Address{data.Name, data.Email}, Subject: data.Subject, Body: []byte(data.Message)} site := h.Settings.Monsti.Sites[c.Site.Name] owner := mimemail.Address{site.Owner.Name, site.Owner.Email} mail.To = []mimemail.Address{owner} err := c.Serv.Monsti().SendMail(&mail) if err != nil { return fmt.Errorf("Could not send mail: %v", err) } http.Redirect(c.Res, c.Req, path.Dir(c.Node.Path)+"/?submitted", http.StatusSeeOther) return nil } default: return fmt.Errorf("Request method not supported: %v", c.Req.Method) } context["Form"] = form.RenderData() return nil }
func (m *MonstiService) SendMail(mail mimemail.Mail, reply *int) error { if !m.Settings.Mail.Debug { auth := smtp.PlainAuth("", m.Settings.Mail.Username, m.Settings.Mail.Password, strings.Split(m.Settings.Mail.Host, ":")[0]) if err := smtp.SendMail(m.Settings.Mail.Host, auth, mail.Sender(), mail.Recipients(), mail.Message()); err != nil { return fmt.Errorf("monsti: Could not send email: %v", err) } } else { m.Logger.Printf(`SendMail debug: From: %v To: %v Cc: %v Bcc: %v Subject: %v -- Body Start -- %v -- Body End --`, mail.From, mail.To, mail.Cc, mail.Bcc, mail.Subject, string(mail.Body)) } return nil }
// RequestPasswordToken sends the user a token to be able to change // the login password. func (h *nodeHandler) RequestPasswordToken(c *reqContext) error { G, _, _, _ := gettext.DefaultLocales.Use("", c.UserSession.Locale) data := requestPasswordTokenFormData{} form := htmlwidgets.NewForm(&data) form.AddWidget(new(htmlwidgets.TextWidget), "User", G("Login"), "") sent := false c.Req.ParseForm() switch c.Req.Method { case "GET": if _, ok := c.Req.Form["sent"]; ok { sent = true } case "POST": if form.Fill(c.Req.Form) { user, err := getUser(data.User, h.Settings.Monsti.GetSiteDataPath(c.Site.Name)) if err != nil { return fmt.Errorf("Could not get user: %v", err) } if user != nil { site := h.Settings.Monsti.Sites[c.Site.Name] link := getRequestPasswordToken(c.Site.Name, data.User, site.PasswordTokenKey) mail := mimemail.Mail{ From: mimemail.Address{site.EmailName, site.EmailAddress}, Subject: G("Password request"), Body: []byte(fmt.Sprintf(`Hello, someone, possibly you, requested a new password for your account %v at "%v". To change your password, visit the following link within 24 hours. If you did not request a new password, you may ignore this email. %v This is an automatically generated email. Please don't reply to it. `, data.User, site.Title, site.BaseURL+"/@@change-password?token="+link))} mail.To = []mimemail.Address{mimemail.Address{user.Login, user.Email}} err := c.Serv.Monsti().SendMail(&mail) if err != nil { return fmt.Errorf("Could not send mail: %v", err) } http.Redirect(c.Res, c.Req, "@@request-password-token?sent", http.StatusSeeOther) return nil } else { form.AddError("User", G("Unkown user.")) } } default: return fmt.Errorf("Request method not supported: %v", c.Req.Method) } body, err := h.Renderer.Render("actions/request_password_token_form", template.Context{ "Sent": sent, "Form": form.RenderData()}, c.UserSession.Locale, h.Settings.Monsti.GetSiteTemplatesPath(c.Site.Name)) if err != nil { return fmt.Errorf("Can't render login form: %v", err) } env := masterTmplEnv{ Node: c.Node, Session: c.UserSession, Title: G("Request new password"), Flags: EDIT_VIEW} fmt.Fprint(c.Res, renderInMaster(h.Renderer, []byte(body), env, h.Settings, *c.Site, c.UserSession.Locale, c.Serv)) return nil }