88 lines
1.9 KiB
Go
88 lines
1.9 KiB
Go
package main
|
|
|
|
import (
|
|
"embed"
|
|
"io/fs"
|
|
"log/slog"
|
|
"net/http"
|
|
"net/url"
|
|
"os"
|
|
|
|
"go.elara.ws/loggers"
|
|
"go.elara.ws/salix"
|
|
)
|
|
|
|
var log = slog.New(loggers.NewPretty(os.Stderr, loggers.Options{Level: slog.LevelInfo}))
|
|
|
|
//go:embed templates
|
|
var tmpls embed.FS
|
|
|
|
func main() {
|
|
baseURL, ok := os.LookupEnv("INSTANCE_URL")
|
|
if !ok {
|
|
log.Error("INSTANCE_URL environment variable must be set")
|
|
os.Exit(1)
|
|
}
|
|
|
|
_, ok = os.LookupEnv("SHARED_SECRET")
|
|
if !ok {
|
|
log.Error("SHARED_SECRET environment variable must be set")
|
|
os.Exit(1)
|
|
}
|
|
|
|
u, err := url.ParseRequestURI(baseURL)
|
|
if err != nil {
|
|
log.Error("Invalid INSTANCE_URL", slog.Any("error", err))
|
|
os.Exit(1)
|
|
}
|
|
|
|
tmplFS, err := fs.Sub(tmpls, "templates")
|
|
if err != nil {
|
|
log.Error("Error getting templates subdirectory", slog.Any("error", err))
|
|
os.Exit(1)
|
|
}
|
|
|
|
ns := salix.New().
|
|
WithEscapeHTML(true).
|
|
WithWriteOnSuccess(true).
|
|
WithVarMap(map[string]any{"instURL": u})
|
|
|
|
err = ns.ParseFSGlob(tmplFS, "*")
|
|
if err != nil {
|
|
log.Error("Error parsing templates", slog.Any("error", err))
|
|
os.Exit(1)
|
|
}
|
|
|
|
mux := http.NewServeMux()
|
|
|
|
mux.Handle("/", handleErr(ns, func(w http.ResponseWriter, r *http.Request) error {
|
|
return ns.ExecuteTemplate(w, "form.html", nil)
|
|
}))
|
|
|
|
mux.Handle("/register", handleErr(ns, func(w http.ResponseWriter, r *http.Request) error {
|
|
err := r.ParseForm()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
form := r.PostForm
|
|
|
|
// Check the automated script honeypot
|
|
if form.Get("nothing") != "" {
|
|
w.WriteHeader(http.StatusForbidden)
|
|
}
|
|
|
|
err = registerUser(form.Get("username"), form.Get("display_name"), form.Get("password"), *u)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return ns.ExecuteTemplate(w, "success.html", map[string]any{"dispName": form.Get("display_name")})
|
|
}))
|
|
|
|
if addr := os.Getenv("LISTEN_ADDR"); addr != "" {
|
|
http.ListenAndServe(addr, realIP(mux))
|
|
} else {
|
|
http.ListenAndServe(":2264", realIP(mux))
|
|
}
|
|
|
|
} |