From f9634cfc712130dac11176e4c819b3fe40d9838b Mon Sep 17 00:00:00 2001 From: WeebDataHoarder <57538841+WeebDataHoarder@users.noreply.github.com> Date: Thu, 3 Apr 2025 04:39:33 +0200 Subject: [PATCH] Revamp templates, allow loading external templates, support themes --- assets/static/{ => anubis}/geist.woff2 | Bin assets/static/{ => anubis}/iosevka-curly.woff2 | Bin assets/static/{ => anubis}/podkova.woff2 | Bin assets/static/{ => anubis}/style.css | 6 +++--- cmd/away.go | 8 +++++--- lib/http.go | 14 +++++++++++--- lib/state.go | 17 +++++++++++++++-- templates/challenge-anubis.gohtml | 2 +- ...jo-dark.gohtml => challenge-forgejo.gohtml} | 10 ++++++---- 9 files changed, 41 insertions(+), 16 deletions(-) rename assets/static/{ => anubis}/geist.woff2 (100%) rename assets/static/{ => anubis}/iosevka-curly.woff2 (100%) rename assets/static/{ => anubis}/podkova.woff2 (100%) rename assets/static/{ => anubis}/style.css (90%) rename templates/{challenge-forgejo-dark.gohtml => challenge-forgejo.gohtml} (94%) diff --git a/assets/static/geist.woff2 b/assets/static/anubis/geist.woff2 similarity index 100% rename from assets/static/geist.woff2 rename to assets/static/anubis/geist.woff2 diff --git a/assets/static/iosevka-curly.woff2 b/assets/static/anubis/iosevka-curly.woff2 similarity index 100% rename from assets/static/iosevka-curly.woff2 rename to assets/static/anubis/iosevka-curly.woff2 diff --git a/assets/static/podkova.woff2 b/assets/static/anubis/podkova.woff2 similarity index 100% rename from assets/static/podkova.woff2 rename to assets/static/anubis/podkova.woff2 diff --git a/assets/static/style.css b/assets/static/anubis/style.css similarity index 90% rename from assets/static/style.css rename to assets/static/anubis/style.css index 60c97c3..30d6cd8 100644 --- a/assets/static/style.css +++ b/assets/static/anubis/style.css @@ -3,7 +3,7 @@ font-style: normal; font-weight: 100 900; font-display: swap; - src: url("./geist.woff2") format("woff2"); + src: url("geist.woff2") format("woff2"); } @font-face { @@ -11,14 +11,14 @@ font-style: normal; font-weight: 400 800; font-display: swap; - src: url("./podkova.woff2") format("woff2"); + src: url("podkova.woff2") format("woff2"); } @font-face { font-family: "Iosevka Curly"; font-style: monospace; font-display: swap; - src: url("./iosevka-curly.woff2") format("woff2"); + src: url("iosevka-curly.woff2") format("woff2"); } main { diff --git a/cmd/away.go b/cmd/away.go index d575084..6455e99 100644 --- a/cmd/away.go +++ b/cmd/away.go @@ -57,7 +57,8 @@ func main() { slogLevel := flag.String("slog-level", "INFO", "logging level (see https://pkg.go.dev/log/slog#hdr-Levels)") policyFile := flag.String("policy", "", "path to policy YAML file") - challengeTemplate := flag.String("challenge-template", "anubis", "name of the challenge template to use") + challengeTemplate := flag.String("challenge-template", "anubis", "name or path of the challenge template to use (anubis, forgejo)") + challengeTemplateTheme := flag.String("challenge-template-theme", "", "name of the challenge template theme to use (forgejo => [forgejo-dark, forgejo-light, gitea...])") flag.Parse() @@ -90,8 +91,9 @@ func main() { } state, err := lib.NewState(p, lib.StateSettings{ - PackagePath: "git.gammaspectra.live/git/go-away/cmd", - ChallengeTemplate: *challengeTemplate, + PackagePath: "git.gammaspectra.live/git/go-away/cmd", + ChallengeTemplate: *challengeTemplate, + ChallengeTemplateTheme: *challengeTemplateTheme, }) if err != nil { diff --git a/lib/http.go b/lib/http.go index 02298ba..4a781a4 100644 --- a/lib/http.go +++ b/lib/http.go @@ -50,15 +50,23 @@ func init() { if err != nil { panic(err) } - tpl := template.New(e.Name()) - _, err = tpl.Parse(string(data)) + err = initTemplate(e.Name(), string(data)) if err != nil { panic(err) } - templates[e.Name()] = tpl } } +func initTemplate(name, data string) error { + tpl := template.New(name) + _, err := tpl.Parse(data) + if err != nil { + return err + } + templates[name] = tpl + return nil +} + func makeReverseProxy(target string) (http.Handler, error) { u, err := url.Parse(target) if err != nil { diff --git a/lib/state.go b/lib/state.go index d450fa3..cfe3791 100644 --- a/lib/state.go +++ b/lib/state.go @@ -30,6 +30,8 @@ import ( "net" "net/http" "net/url" + "os" + "path" "strconv" "strings" "time" @@ -96,8 +98,9 @@ type ChallengeState struct { } type StateSettings struct { - PackagePath string - ChallengeTemplate string + PackagePath string + ChallengeTemplate string + ChallengeTemplateTheme string } func NewState(p policy.Policy, settings StateSettings) (state *State, err error) { @@ -131,6 +134,16 @@ func NewState(p policy.Policy, settings StateSettings) (state *State, err error) } if templates["challenge-"+state.Settings.ChallengeTemplate+".gohtml"] == nil { + + if data, err := os.ReadFile(state.Settings.ChallengeTemplate); err == nil && len(data) > 0 { + name := path.Base(state.Settings.ChallengeTemplate) + err := initTemplate(name, string(data)) + if err != nil { + return nil, fmt.Errorf("error loading template %s: %w", settings.ChallengeTemplate, err) + } + state.Settings.ChallengeTemplate = name + } + return nil, fmt.Errorf("no template defined for %s", settings.ChallengeTemplate) } diff --git a/templates/challenge-anubis.gohtml b/templates/challenge-anubis.gohtml index 3b536a5..653a421 100644 --- a/templates/challenge-anubis.gohtml +++ b/templates/challenge-anubis.gohtml @@ -2,7 +2,7 @@ {{ .Title }} - + {{ range $key, $value := .Meta }} {{ if eq $key "refresh"}} diff --git a/templates/challenge-forgejo-dark.gohtml b/templates/challenge-forgejo.gohtml similarity index 94% rename from templates/challenge-forgejo-dark.gohtml rename to templates/challenge-forgejo.gohtml index 36db098..088f27e 100644 --- a/templates/challenge-forgejo-dark.gohtml +++ b/templates/challenge-forgejo.gohtml @@ -1,5 +1,9 @@ - +{{$theme := "forgejo-dark"}} +{{ if .Theme }} + {{$theme = .Theme}} +{{ end }} + @@ -21,8 +25,6 @@ - -