2021-07-22 11:41:52 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"fmt"
|
|
|
|
"log"
|
|
|
|
"net/http"
|
|
|
|
"net/smtp"
|
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/microcosm-cc/bluemonday"
|
|
|
|
)
|
|
|
|
|
|
|
|
const defaultContactPath = "/contact"
|
|
|
|
|
|
|
|
func (a *goBlog) serveContactForm(w http.ResponseWriter, r *http.Request) {
|
2021-07-27 10:51:08 +00:00
|
|
|
blog := r.Context().Value(blogKey).(string)
|
2021-07-22 11:41:52 +00:00
|
|
|
cc := a.cfg.Blogs[blog].Contact
|
|
|
|
a.render(w, r, templateContact, &renderData{
|
|
|
|
BlogString: blog,
|
|
|
|
Data: map[string]interface{}{
|
|
|
|
"title": cc.Title,
|
|
|
|
"description": cc.Description,
|
2021-07-22 12:04:46 +00:00
|
|
|
"privacy": cc.PrivacyPolicy,
|
2021-07-22 11:41:52 +00:00
|
|
|
},
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func (a *goBlog) sendContactSubmission(w http.ResponseWriter, r *http.Request) {
|
|
|
|
// Get form values
|
|
|
|
strict := bluemonday.StrictPolicy()
|
|
|
|
// Name
|
|
|
|
formName := strings.TrimSpace(strict.Sanitize(r.FormValue("name")))
|
|
|
|
// Email
|
|
|
|
formEmail := strings.TrimSpace(strict.Sanitize(r.FormValue("email")))
|
|
|
|
// Website
|
|
|
|
formWebsite := strings.TrimSpace(strict.Sanitize(r.FormValue("website")))
|
|
|
|
// Message
|
|
|
|
formMessage := strings.TrimSpace(strict.Sanitize(r.FormValue("message")))
|
|
|
|
if formMessage == "" {
|
|
|
|
a.serveError(w, r, "Message is empty", http.StatusBadRequest)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
// Build message
|
|
|
|
var message bytes.Buffer
|
|
|
|
if formName != "" {
|
|
|
|
_, _ = fmt.Fprintf(&message, "Name: %s", formName)
|
|
|
|
_, _ = fmt.Fprintln(&message)
|
|
|
|
}
|
|
|
|
if formEmail != "" {
|
|
|
|
_, _ = fmt.Fprintf(&message, "Email: %s", formEmail)
|
|
|
|
_, _ = fmt.Fprintln(&message)
|
|
|
|
}
|
|
|
|
if formWebsite != "" {
|
|
|
|
_, _ = fmt.Fprintf(&message, "Website: %s", formWebsite)
|
|
|
|
_, _ = fmt.Fprintln(&message)
|
|
|
|
}
|
|
|
|
if message.Len() > 0 {
|
|
|
|
_, _ = fmt.Fprintln(&message)
|
|
|
|
}
|
|
|
|
_, _ = message.WriteString(formMessage)
|
|
|
|
// Send submission
|
2021-07-27 10:51:08 +00:00
|
|
|
blog := r.Context().Value(blogKey).(string)
|
2021-07-22 11:41:52 +00:00
|
|
|
if cc := a.cfg.Blogs[blog].Contact; cc != nil && cc.SMTPHost != "" && cc.EmailFrom != "" && cc.EmailTo != "" {
|
|
|
|
// Build email
|
|
|
|
var email bytes.Buffer
|
|
|
|
if ef := cc.EmailFrom; ef != "" {
|
|
|
|
_, _ = fmt.Fprintf(&email, "From: %s <%s>", defaultIfEmpty(a.cfg.Blogs[blog].Title, "GoBlog"), cc.EmailFrom)
|
|
|
|
_, _ = fmt.Fprintln(&email)
|
|
|
|
}
|
|
|
|
_, _ = fmt.Fprintf(&email, "To: %s", cc.EmailTo)
|
|
|
|
_, _ = fmt.Fprintln(&email)
|
|
|
|
if formEmail != "" {
|
|
|
|
_, _ = fmt.Fprintf(&email, "Reply-To: %s", formEmail)
|
|
|
|
_, _ = fmt.Fprintln(&email)
|
|
|
|
}
|
|
|
|
_, _ = fmt.Fprintf(&email, "Date: %s", time.Now().UTC().Format(time.RFC1123Z))
|
|
|
|
_, _ = fmt.Fprintln(&email)
|
|
|
|
_, _ = fmt.Fprintln(&email, "Subject: New message")
|
|
|
|
_, _ = fmt.Fprintln(&email)
|
|
|
|
_, _ = fmt.Fprintln(&email, message.String())
|
|
|
|
// Send email
|
|
|
|
auth := smtp.PlainAuth("", cc.SMTPUser, cc.SMTPPassword, cc.SMTPHost)
|
|
|
|
port := cc.SMTPPort
|
|
|
|
if port == 0 {
|
|
|
|
port = 587
|
|
|
|
}
|
|
|
|
if err := smtp.SendMail(cc.SMTPHost+":"+strconv.Itoa(port), auth, cc.EmailFrom, []string{cc.EmailTo}, email.Bytes()); err != nil {
|
|
|
|
log.Println("Failed to send mail:", err.Error())
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
log.Println("New contact submission not send as email, config missing")
|
|
|
|
}
|
|
|
|
// Send notification
|
|
|
|
a.sendNotification(message.String())
|
|
|
|
// Give feedback
|
|
|
|
a.render(w, r, templateContact, &renderData{
|
|
|
|
BlogString: blog,
|
|
|
|
Data: map[string]interface{}{
|
|
|
|
"sent": true,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
}
|