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)) } }