Revamp templates, allow loading external templates, support themes

This commit is contained in:
WeebDataHoarder
2025-04-03 04:39:33 +02:00
parent 150927e7ba
commit f9634cfc71
9 changed files with 41 additions and 16 deletions

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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 {

View File

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

View File

@@ -2,7 +2,7 @@
<html>
<head>
<title>{{ .Title }}</title>
<link rel="stylesheet" href="{{ .Path }}/assets/static/style.css?cacheBust={{ .Random }}"/>
<link rel="stylesheet" href="{{ .Path }}/assets/static/anubis/style.css?cacheBust={{ .Random }}"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
{{ range $key, $value := .Meta }}
{{ if eq $key "refresh"}}

View File

@@ -1,5 +1,9 @@
<!DOCTYPE html>
<html lang="en-US" data-theme="forgejo-dark">
{{$theme := "forgejo-dark"}}
{{ if .Theme }}
{{$theme = .Theme}}
{{ end }}
<html lang="en-US" data-theme="{{ $theme }}">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
@@ -21,8 +25,6 @@
<link rel="icon" href="/assets/img/favicon.svg" type="image/svg+xml">
<link rel="alternate icon" href="/assets/img/favicon.png" type="image/png">
<script src="/assets/js/webcomponents.js"></script>
<noscript>
<style>
.dropdown:hover > .menu { display: block; }
@@ -31,7 +33,7 @@
</noscript>
<link rel="stylesheet" href="/assets/css/index.css">
<link rel="stylesheet" href="/assets/css/theme-forgejo-dark.css">
<link rel="stylesheet" href="/assets/css/theme-{{$theme}}.css">
</head>