fix: use APP_URL for email links instead of host:port
DUMPSTER_PORT=8080 (internal) was baked into email reset links, producing http://dumpster.dustin.coffee:8080/reset-password which doesn't resolve through Caddy. Added Config.AppURL() that reads APP_URL env var (set to https://dumpster.dustin.coffee on server), falls back to http://host:port for dev.
This commit is contained in:
@@ -39,10 +39,7 @@ func (h *Handler) RequestVerification(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
appURL := "http://" + h.cfg.Host
|
appURL := h.cfg.AppURL()
|
||||||
if h.cfg.Port != "80" && h.cfg.Port != "443" {
|
|
||||||
appURL += ":" + h.cfg.Port
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := h.mailer.SendVerificationEmail(user.Email, user.Username, token, appURL); err != nil {
|
if err := h.mailer.SendVerificationEmail(user.Email, user.Username, token, appURL); err != nil {
|
||||||
http.Error(w, `{"error":"failed to send email"}`, http.StatusInternalServerError)
|
http.Error(w, `{"error":"failed to send email"}`, http.StatusInternalServerError)
|
||||||
@@ -112,10 +109,7 @@ func (h *Handler) RequestPasswordReset(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
appURL := "http://" + h.cfg.Host
|
appURL := h.cfg.AppURL()
|
||||||
if h.cfg.Port != "80" && h.cfg.Port != "443" {
|
|
||||||
appURL += ":" + h.cfg.Port
|
|
||||||
}
|
|
||||||
|
|
||||||
h.mailer.SendPasswordResetEmail(req.Email, username, token, appURL)
|
h.mailer.SendPasswordResetEmail(req.Email, username, token, appURL)
|
||||||
w.WriteHeader(http.StatusNoContent)
|
w.WriteHeader(http.StatusNoContent)
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package config
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -151,6 +152,22 @@ func Load() *Config {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Config) AppURL() string {
|
||||||
|
if v := getEnv("APP_URL", ""); v != "" {
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
scheme := "http"
|
||||||
|
port := c.Port
|
||||||
|
if c.Database.SSLMode == "require" {
|
||||||
|
// ponytail: using SSLMode as a rough https hint; add explicit APP_URL for real setups
|
||||||
|
scheme = "https"
|
||||||
|
}
|
||||||
|
if port == "80" || port == "443" {
|
||||||
|
return fmt.Sprintf("%s://%s", scheme, c.Host)
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%s://%s:%s", scheme, c.Host, port)
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Config) DatabaseDSN() string {
|
func (c *Config) DatabaseDSN() string {
|
||||||
return "postgres://" + c.Database.User + ":" + c.Database.Password + "@" + c.Database.Host + ":" + c.Database.Port + "/" + c.Database.Database + "?sslmode=" + c.Database.SSLMode
|
return "postgres://" + c.Database.User + ":" + c.Database.Password + "@" + c.Database.Host + ":" + c.Database.Port + "/" + c.Database.Database + "?sslmode=" + c.Database.SSLMode
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user