From 3118ac0a8e2a42fb54ae102fba58559125e2848b Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Tue, 20 Feb 2024 12:18:14 +0100 Subject: [PATCH] Add server name config directive References: https://todo.sr.ht/~emersion/sinwon/24 --- client.go | 10 ++++------ config.go | 5 +++-- config.in | 1 + main.go | 12 ++++++++++-- middleware.go | 44 +++++++++++++++++++++++++++++++++++++++++--- oauth2.go | 5 ++--- template/authorize.html | 4 ++-- template/client-secret.html | 4 ++-- template/head.html | 2 +- template/index.html | 4 ++-- template/login.html | 4 ++-- template/manage-client.html | 4 ++-- template/manage-user.html | 4 ++-- user.go | 18 ++++++------------ diff --git a/client.go b/client.go index dc7068584a0214a9f3da35700fcd980560f082c2..692132ac77744eb23cc34a15fc22d8ed0e901a5d 100644 --- a/client.go +++ b/client.go @@ -46,13 +46,12 @@ } if req.Method != http.MethodPost { data := struct { + TemplateBaseData Client *Client }{ Client: client, } - if err := tpl.ExecuteTemplate(w, "manage-client.html", &data); err != nil { - panic(err) - } + tpl.MustExecuteTemplate(w, "manage-client.html", &data) return } @@ -107,15 +106,14 @@ return } data := struct { + TemplateBaseData ClientID string ClientSecret string }{ ClientID: client.ClientID, ClientSecret: clientSecret, } - if err := tpl.ExecuteTemplate(w, "client-secret.html", &data); err != nil { - panic(err) - } + tpl.MustExecuteTemplate(w, "client-secret.html", &data) } func validateAllowedRedirectURIs(rawRedirectURIs string) error { diff --git a/config.go b/config.go index 2d3067b1a4e1146c315dc5f4cb4932ac9ff160a3..6fb7bc68b139d296d03cebd330169e92ac38ccf2 100644 --- a/config.go +++ b/config.go @@ -7,8 +7,9 @@ "git.sr.ht/~emersion/go-scfg" ) type Config struct { - Listen string `scfg:"listen"` - Database string `scfg:"database"` + Listen string `scfg:"listen"` + Database string `scfg:"database"` + ServerName string `scfg:"server-name"` } func loadConfig(filename string) (*Config, error) { diff --git a/config.in b/config.in index 553d581940f6aee43f62285a3ef11ced9401af75..4a230b50954c003ac53269cdfbb5fccf0689cb01 100644 --- a/config.in +++ b/config.in @@ -1,2 +1,3 @@ listen localhost:8080 database /var/lib/sinwon/main.db +server-name sinwon diff --git a/main.go b/main.go index 11997a10f89c21321ecb48d55d88b07fe0852bd7..f03843566a59f1193f30a11671a51822c698352b 100644 --- a/main.go +++ b/main.go @@ -4,7 +4,6 @@ import ( "context" "embed" "flag" - "html/template" "log" "net" "net/http" @@ -46,7 +45,16 @@ if err != nil { log.Fatalf("Failed to open DB: %v", err) } - tpl := template.Must(template.ParseFS(templateFS, "template/*.html")) + tplBaseData := &TemplateBaseData{ + ServerName: cfg.ServerName, + } + if tplBaseData.ServerName == "" { + tplBaseData.ServerName = "sinwon" + } + tpl, err := loadTemplate(templateFS, "template/*.html", tplBaseData) + if err != nil { + log.Fatalf("Failed to load template: %v", err) + } mux := chi.NewRouter() mux.Handle("/static/*", http.FileServer(http.FS(staticFS))) diff --git a/middleware.go b/middleware.go index 2d313b9c4b3e14f17dba52ee7bd79b1ed2e41243..09810b6e71ec1878a8173a68ba709cfd18f2f3f6 100644 --- a/middleware.go +++ b/middleware.go @@ -4,6 +4,8 @@ import ( "context" "fmt" "html/template" + "io" + "io/fs" "mime" "net/http" ) @@ -25,8 +27,8 @@ func dbFromContext(ctx context.Context) *DB { return ctx.Value(contextKeyDB).(*DB) } -func templateFromContext(ctx context.Context) *template.Template { - return ctx.Value(contextKeyTemplate).(*template.Template) +func templateFromContext(ctx context.Context) *Template { + return ctx.Value(contextKeyTemplate).(*Template) } func loginTokenFromContext(ctx context.Context) *AccessToken { @@ -37,7 +39,7 @@ } return v.(*AccessToken) } -func newBaseContext(db *DB, tpl *template.Template) context.Context { +func newBaseContext(db *DB, tpl *Template) context.Context { ctx := context.Background() ctx = context.WithValue(ctx, contextKeyDB, db) ctx = context.WithValue(ctx, contextKeyTemplate, tpl) @@ -109,3 +111,39 @@ req = req.WithContext(ctx) next.ServeHTTP(w, req) }) } + +type TemplateBaseData struct { + ServerName string +} + +func (data *TemplateBaseData) Base() *TemplateBaseData { + return data +} + +type TemplateData interface { + Base() *TemplateBaseData +} + +type Template struct { + tpl *template.Template + baseData *TemplateBaseData +} + +func loadTemplate(fs fs.FS, pattern string, baseData *TemplateBaseData) (*Template, error) { + tpl, err := template.ParseFS(fs, pattern) + if err != nil { + return nil, err + } + return &Template{tpl: tpl, baseData: baseData}, nil +} + +func (tpl *Template) MustExecuteTemplate(w io.Writer, filename string, data TemplateData) { + if data == nil { + data = tpl.baseData + } else { + *data.Base() = *tpl.baseData + } + if err := tpl.tpl.ExecuteTemplate(w, filename, data); err != nil { + panic(err) + } +} diff --git a/oauth2.go b/oauth2.go index df37a6a9a4a00f719714517dce2e1e777bdd9406..20e8d25484f675bb1924834394884c225de308d7 100644 --- a/oauth2.go +++ b/oauth2.go @@ -148,13 +148,12 @@ return } if _, ok := req.PostForm["authorize"]; !ok { data := struct { + TemplateBaseData Client *Client }{ Client: client, } - if err := tpl.ExecuteTemplate(w, "authorize.html", data); err != nil { - panic(err) - } + tpl.MustExecuteTemplate(w, "authorize.html", &data) return } diff --git a/template/authorize.html b/template/authorize.html index 53be65bc66b71fd3dd174e3ff6e1a4703e5193b9..7c0f525dacb582e2843d317f2acaba9e5a59fba9 100644 --- a/template/authorize.html +++ b/template/authorize.html @@ -1,8 +1,8 @@ -{{ template "head.html" }} +{{ template "head.html" .Base }}
-

sinwon

+

{{ .ServerName }}

Authorize diff --git a/template/client-secret.html b/template/client-secret.html index d354b0e24aace063af3c9c6d8c43b4529dd056c2..c0f79bbb903b219cdad1f8c0b1bb5cf7334ba536 100644 --- a/template/client-secret.html +++ b/template/client-secret.html @@ -1,8 +1,8 @@ -{{ template "head.html" }} +{{ template "head.html" .Base }}

-

sinwon

+

{{ .ServerName }}

Client ID: {{ .ClientID }}
diff --git a/template/head.html b/template/head.html index 4e67adfceb075951639c24ee864f07857f08bcbe..a36f23450c00bee71bba1c80d9883e155ef8025f 100644 --- a/template/head.html +++ b/template/head.html @@ -2,7 +2,7 @@ - sinwon + {{ .ServerName }} diff --git a/template/index.html b/template/index.html index da8b6b68d94449bbd66bcb8612fdb592e08cbd49..1b27564b32a0df2cff9ecd5d946b75fd44aca382 100644 --- a/template/index.html +++ b/template/index.html @@ -1,8 +1,8 @@ -{{ template "head.html" }} +{{ template "head.html" .Base }}

-

sinwon

+

{{ .ServerName }}

Welcome, {{ .Me.Username }}!

diff --git a/template/login.html b/template/login.html index 9f93f2a41a411a6a8a237c84906d2084360177b0..ab88c5ca0b9086d49fd8a26519a07e4ca398e7fa 100644 --- a/template/login.html +++ b/template/login.html @@ -1,8 +1,8 @@ -{{ template "head.html" }} +{{ template "head.html" .Base }}
-

sinwon

+

{{ .ServerName }}

Username:
diff --git a/template/manage-client.html b/template/manage-client.html index 082eb9bfebf2fb602cc50b9777249bb95bac03ae..0a78e7620775468d6e3c498e49646a41dc2b8ad3 100644 --- a/template/manage-client.html +++ b/template/manage-client.html @@ -1,8 +1,8 @@ -{{ template "head.html" }} +{{ template "head.html" .Base }}
-

sinwon

+

{{ .ServerName }}

{{ if .Client.ClientID }} diff --git a/template/manage-user.html b/template/manage-user.html index 9d599ded2523fa41b79d8bce43b748dfcfe48312..83954eec0efe7d044edce76ec228f60ab8955e59 100644 --- a/template/manage-user.html +++ b/template/manage-user.html @@ -1,8 +1,8 @@ -{{ template "head.html" }} +{{ template "head.html" .Base }}
-

sinwon

+

{{ .ServerName }}

Username:
diff --git a/user.go b/user.go index 6b9c9b44217c38a369e00b0fa15d060c20dfbe7a..e91e64e58363ce84356717d8b18eb6b40b0162e5 100644 --- a/user.go +++ b/user.go @@ -49,6 +49,7 @@ } } data := struct { + TemplateBaseData Me *User AuthorizedClients []AuthorizedClient Clients []Client @@ -59,9 +60,7 @@ AuthorizedClients: authorizedClients, Clients: clients, Users: users, } - if err := tpl.ExecuteTemplate(w, "index.html", &data); err != nil { - panic(err) - } + tpl.MustExecuteTemplate(w, "index.html", &data) } func login(w http.ResponseWriter, req *http.Request) { @@ -89,9 +88,7 @@ username := req.PostFormValue("username") password := req.PostFormValue("password") if username == "" { - if err := tpl.ExecuteTemplate(w, "login.html", nil); err != nil { - panic(err) - } + tpl.MustExecuteTemplate(w, "login.html", nil) return } @@ -106,9 +103,7 @@ } if err != nil { log.Printf("login failed for user %q: %v", username, err) // TODO: show error message - if err := tpl.ExecuteTemplate(w, "login.html", nil); err != nil { - panic(err) - } + tpl.MustExecuteTemplate(w, "login.html", nil) return } @@ -186,15 +181,14 @@ password := req.PostFormValue("password") admin := req.PostFormValue("admin") == "on" if username == "" { data := struct { + TemplateBaseData User *User Me *User }{ User: user, Me: me, } - if err := tpl.ExecuteTemplate(w, "manage-user.html", &data); err != nil { - panic(err) - } + tpl.MustExecuteTemplate(w, "manage-user.html", &data) return } -- 2.48.1