Revamp templates, allow loading external templates, support themes
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 100 900;
|
font-weight: 100 900;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url("./geist.woff2") format("woff2");
|
src: url("geist.woff2") format("woff2");
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
@@ -11,14 +11,14 @@
|
|||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 400 800;
|
font-weight: 400 800;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url("./podkova.woff2") format("woff2");
|
src: url("podkova.woff2") format("woff2");
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "Iosevka Curly";
|
font-family: "Iosevka Curly";
|
||||||
font-style: monospace;
|
font-style: monospace;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url("./iosevka-curly.woff2") format("woff2");
|
src: url("iosevka-curly.woff2") format("woff2");
|
||||||
}
|
}
|
||||||
|
|
||||||
main {
|
main {
|
||||||
@@ -57,7 +57,8 @@ func main() {
|
|||||||
slogLevel := flag.String("slog-level", "INFO", "logging level (see https://pkg.go.dev/log/slog#hdr-Levels)")
|
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")
|
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()
|
flag.Parse()
|
||||||
|
|
||||||
@@ -92,6 +93,7 @@ func main() {
|
|||||||
state, err := lib.NewState(p, lib.StateSettings{
|
state, err := lib.NewState(p, lib.StateSettings{
|
||||||
PackagePath: "git.gammaspectra.live/git/go-away/cmd",
|
PackagePath: "git.gammaspectra.live/git/go-away/cmd",
|
||||||
ChallengeTemplate: *challengeTemplate,
|
ChallengeTemplate: *challengeTemplate,
|
||||||
|
ChallengeTemplateTheme: *challengeTemplateTheme,
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
14
lib/http.go
14
lib/http.go
@@ -50,15 +50,23 @@ func init() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
tpl := template.New(e.Name())
|
err = initTemplate(e.Name(), string(data))
|
||||||
_, err = tpl.Parse(string(data))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
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) {
|
func makeReverseProxy(target string) (http.Handler, error) {
|
||||||
u, err := url.Parse(target)
|
u, err := url.Parse(target)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
13
lib/state.go
13
lib/state.go
@@ -30,6 +30,8 @@ import (
|
|||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
@@ -98,6 +100,7 @@ type ChallengeState struct {
|
|||||||
type StateSettings struct {
|
type StateSettings struct {
|
||||||
PackagePath string
|
PackagePath string
|
||||||
ChallengeTemplate string
|
ChallengeTemplate string
|
||||||
|
ChallengeTemplateTheme string
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewState(p policy.Policy, settings StateSettings) (state *State, err error) {
|
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 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)
|
return nil, fmt.Errorf("no template defined for %s", settings.ChallengeTemplate)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>{{ .Title }}</title>
|
<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"/>
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||||
{{ range $key, $value := .Meta }}
|
{{ range $key, $value := .Meta }}
|
||||||
{{ if eq $key "refresh"}}
|
{{ if eq $key "refresh"}}
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
<!DOCTYPE html>
|
<!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>
|
<head>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<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="icon" href="/assets/img/favicon.svg" type="image/svg+xml">
|
||||||
<link rel="alternate icon" href="/assets/img/favicon.png" type="image/png">
|
<link rel="alternate icon" href="/assets/img/favicon.png" type="image/png">
|
||||||
|
|
||||||
<script src="/assets/js/webcomponents.js"></script>
|
|
||||||
|
|
||||||
<noscript>
|
<noscript>
|
||||||
<style>
|
<style>
|
||||||
.dropdown:hover > .menu { display: block; }
|
.dropdown:hover > .menu { display: block; }
|
||||||
@@ -31,7 +33,7 @@
|
|||||||
</noscript>
|
</noscript>
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/index.css">
|
<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>
|
</head>
|
||||||
Reference in New Issue
Block a user