hlfw.ca

webbing

Download patch

ref: 8fbacf88eb03ff1db4cee8fba0bbacfdf472a47e
author: halfwit <michaelmisch1985@gmail.com>
date: Sat Mar 28 07:29:43 PDT 2020

Moving code

--- /dev/null
+++ b/form.go
@@ -1,0 +1,83 @@
+// All forms must set the "sendto" key to a []string{"someemail@email.com"}
+// As well, they require a "name" and "email" combo.
+
+package email
+
+import (
+	"bytes"
+	"log"
+	"mime/multipart"
+	"net/mail"
+	"net/smtp"
+	"text/template"
+
+	"github.com/scorredoira/email"
+	"golang.org/x/text/message"
+)
+
+const tmpl = `
+<!DOCTYPE html>
+<html>
+	<title>{{index .pagetitle 0}}</title>
+<head>
+	
+</head>
+<body>
+	<h2>{{index .pagetitle 0}}</h2>
+	<ul>
+	{{range $key, $value := . }}
+		{{if eq $key "pagetitle"}}
+		{{else if eq $key "country" }}
+			<li>countries: {{range $value}}{{.}} {{end}}</li>
+		{{else if eq $key "specialty" }}
+			<li>specialties: {{range $value}}{{.}} {{end}}</li>
+		{{else}}
+			{{$val := len $value}}
+			{{if eq $val 2}}
+				<li>{{$key}}: {{index $value 1 }}</li>
+			{{else}}
+				<li>{{$key}}: {{index $value 0 }}</li>
+			{{end}}
+		{{end}}
+	{{end}}
+	</ul>
+</body>
+</html>
+`
+
+var t *template.Template
+
+func init() {
+	t = template.Must(template.New("email").Parse(tmpl))
+}
+
+// SendForm - Fill in the template and send it out from our email address
+func SendForm(form map[string][]string, p *message.Printer, attachments map[string]multipart.File) {
+	var body bytes.Buffer
+	address := form["sendto"][0]
+	delete(form, "sendto")
+	if err := t.Execute(&body, form); err != nil {
+		log.Println(err)
+		return
+	}
+	m := email.NewHTMLMessage("Form contents", body.String())
+	m.From = mail.Address{
+		Name:    "From",
+		Address: "olmaxmedical@gmail.com",
+	}
+	m.AddTo(mail.Address{
+		Name:    "To",
+		Address: address,
+	})
+	for name, buff := range attachments {
+		var attc bytes.Buffer
+		attc.ReadFrom(buff)
+		if err := m.AttachBuffer(name, attc.Bytes(), false); err != nil {
+			log.Println(err)
+		}
+	}
+	auth := smtp.PlainAuth("", "olmaxmedical@gmail.com", "hunter2", "smtp.gmail.com")
+	if err := email.Send("smtp.gmail.com:587", auth, m); err != nil {
+		log.Println(err)
+	}
+}
--- /dev/null
+++ b/reset.go
@@ -1,0 +1,61 @@
+package email
+
+import (
+	"bytes"
+	"fmt"
+	"log"
+	"net/smtp"
+	"time"
+
+	"github.com/google/uuid"
+	"github.com/olmaxmedical/olmax_go/db"
+	"golang.org/x/text/message"
+)
+
+// SendReset - Wrapper for resetmail and timeout
+func SendReset(email string, p *message.Printer) {
+	u, _ := uuid.NewRandom()
+	token := u.String()
+	if db.UserExists(email) {
+		db.CreateTempEntry("", "", email, "", token)
+		resetemail(token, email, p)
+		go func() {
+			time.Sleep(time.Minute * 10)
+			db.RemoveTempEntry(token)
+		}()
+	}
+}
+
+// NextResetToken - Make sure we have unique tokens!
+func NextResetToken(old, user string) string {
+	if db.FindTempEntry(old) {
+		db.RemoveTempEntry(old)
+		u, _ := uuid.NewRandom()
+		token := u.String()
+		db.CreateTempEntry("", "", user, "", token)
+		go func() {
+			time.Sleep(time.Minute * 10)
+			db.RemoveTempEntry(token)
+		}()
+		return token
+	}
+	return ""
+}
+
+func resetemail(token string, sendto string, p *message.Printer) {
+	var msg bytes.Buffer
+	msg.WriteString("From: ")
+	msg.WriteString("olmaxmedical@gmail.com" + "\n")
+	msg.WriteString("To: ")
+	msg.WriteString(sendto + "\n")
+	msg.WriteString(p.Sprintf("Subject: Olmax Medical - Reset Your Password\n\n"))
+	msg.WriteString(p.Sprintf("Please click the following link to reset your password "))
+	msg.WriteString(fmt.Sprintf("%s/reset/%s\n", url, token))
+	err := smtp.SendMail("smtp.gmail.com:587",
+		smtp.PlainAuth("", "olmaxmedical@gmail.com", "hunter2", "smtp.gmail.com"),
+		"olmaxmedical@gmail.com", []string{sendto}, msg.Bytes(),
+	)
+	if err != nil {
+		log.Printf("smtp error: %v", err)
+	}
+}
--- /dev/null
+++ b/signup.go
@@ -1,0 +1,61 @@
+package email
+
+import (
+	"bytes"
+	"fmt"
+	"log"
+	"net/http"
+	"net/smtp"
+	"time"
+
+	"github.com/google/uuid"
+	"github.com/olmaxmedical/olmax_go/db"
+	"golang.org/x/text/message"
+)
+
+// TODO(halfwit) Update with whichever TLD we land on
+var url = "https://medical.olmax.dev"
+
+// SendSignup - email our prospective clients and create tokens
+func SendSignup(first, last, email, pass string, p *message.Printer) {
+	if !db.UserExists(email) {
+		u, _ := uuid.NewRandom()
+		token := u.String()
+		db.CreateTempEntry(first, last, email, pass, token)
+		signupemail(token, email, p)
+		go func() {
+			// Blow away the entry unconditionally after 10 minutes
+			time.Sleep(time.Minute * 10)
+			db.RemoveTempEntry(token)
+		}()
+	}
+}
+
+// ValidateSignupToken - Make sure token is good
+func ValidateSignupToken(w http.ResponseWriter, r *http.Request, token string) {
+	if db.FindTempEntry(token) {
+		db.CreateEntry(token)
+		http.Redirect(w, r, "/login.html", 302)
+		return
+	}
+	http.Error(w, "Bad Request", 400)
+
+}
+
+func signupemail(token string, sendto string, p *message.Printer) {
+	var msg bytes.Buffer
+	msg.WriteString("From: ")
+	msg.WriteString("olmaxmedical@gmail.com" + "\n")
+	msg.WriteString("To: ")
+	msg.WriteString(sendto + "\n")
+	msg.WriteString(p.Sprintf("Subject: Olmax Medical - Verify your new account\n\n"))
+	msg.WriteString(p.Sprintf("Please click the following link to finalize your account creation "))
+	msg.WriteString(fmt.Sprintf("%s/activate/%s\n", url, token))
+	err := smtp.SendMail("smtp.gmail.com:587",
+		smtp.PlainAuth("", "olmaxmedical@gmail.com", "hunter2", "smtp.gmail.com"),
+		"olmaxmedical@gmail.com", []string{sendto}, msg.Bytes(),
+	)
+	if err != nil {
+		log.Printf("smtp error: %v", err)
+	}
+}