Skip to content

Commit cf8b4e0

Browse files
committed
Add plumbing to make CSRF token testable
1 parent 78051ff commit cf8b4e0

File tree

2 files changed

+27
-27
lines changed

2 files changed

+27
-27
lines changed

site/embed.go

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ import (
2828
//go:embed out/bin/*
2929
var site embed.FS
3030

31+
// HTMLTemplateHandler is a function that defines how `htmlState` is populated
32+
type HTMLTemplateHandler func(*http.Request) HtmlState
33+
3134
// DefaultHandler returns an HTTP handler for serving the static site,
3235
// based on the `embed.FS` compiled into the binary.
3336
func DefaultHandler(logger slog.Logger) http.Handler {
@@ -37,23 +40,21 @@ func DefaultHandler(logger slog.Logger) http.Handler {
3740
panic(err)
3841
}
3942

40-
return Handler(filesystem, logger)
43+
templateFunc := func(r *http.Request) HtmlState {
44+
return HtmlState{
45+
// CSP nonce for the given request (if there is one present)
46+
CSPNonce: secure.CSPNonce(r.Context()),
47+
// CSRF token for the given request
48+
CSRFToken: nosurf.Token(r),
49+
}
50+
}
51+
52+
return Handler(filesystem, logger, templateFunc)
4153
}
4254

4355
// Handler returns an HTTP handler for serving the static site.
4456
// This takes a filesystem as a parameter.
45-
func Handler(filesystem fs.FS, logger slog.Logger) http.Handler {
46-
// Render CSP and CSRF in the served pages
47-
// TODO: Bring back templates
48-
_ = func(r *http.Request) interface{} {
49-
return htmlState{
50-
// Nonce is the CSP nonce for the given request (if there is one present)
51-
CSP: cspState{Nonce: secure.CSPNonce(r.Context())},
52-
// Token is the CSRF token for the given request
53-
CSRF: csrfState{Token: nosurf.Token(r)},
54-
}
55-
}
56-
57+
func Handler(filesystem fs.FS, logger slog.Logger, templateFunc HTMLTemplateHandler) http.Handler {
5758
router := chi.NewRouter()
5859

5960
staticFileHandler, err := serveFiles(filesystem, logger)
@@ -137,17 +138,9 @@ func serveFiles(fileSystem fs.FS, logger slog.Logger) (http.HandlerFunc, error)
137138
return serveFunc, nil
138139
}
139140

140-
type htmlState struct {
141-
CSP cspState
142-
CSRF csrfState
143-
}
144-
145-
type cspState struct {
146-
Nonce string
147-
}
148-
149-
type csrfState struct {
150-
Token string
141+
type HtmlState struct {
142+
CSPNonce string
143+
CSRFToken string
151144
}
152145

153146
// cspDirectives is a map of all csp fetch directives to their values.

site/embed_test.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func TestIndexPageRenders(t *testing.T) {
2828
},
2929
}
3030

31-
srv := httptest.NewServer(site.Handler(rootFS, slog.Logger{}))
31+
srv := httptest.NewServer(site.Handler(rootFS, slog.Logger{}, defaultTemplateFunc))
3232

3333
req, err := http.NewRequestWithContext(context.Background(), "GET", srv.URL, nil)
3434
require.NoError(t, err)
@@ -48,7 +48,7 @@ func TestNestedPathsRenderIndex(t *testing.T) {
4848
},
4949
}
5050

51-
srv := httptest.NewServer(site.Handler(rootFS, slog.Logger{}))
51+
srv := httptest.NewServer(site.Handler(rootFS, slog.Logger{}, defaultTemplateFunc))
5252

5353
path := srv.URL + "/some/nested/path"
5454

@@ -77,7 +77,7 @@ func TestCacheHeaderseAreCorrect(t *testing.T) {
7777
},
7878
}
7979

80-
srv := httptest.NewServer(site.Handler(rootFS, slog.Logger{}))
80+
srv := httptest.NewServer(site.Handler(rootFS, slog.Logger{}, defaultTemplateFunc))
8181

8282
dynamicPaths := []string{
8383
"/",
@@ -123,6 +123,13 @@ func TestCacheHeaderseAreCorrect(t *testing.T) {
123123

124124
}
125125

126+
func defaultTemplateFunc(r *http.Request) site.HtmlState {
127+
return site.HtmlState{
128+
CSPNonce: "test-csp-none",
129+
CSRFToken: "test-csrf-token",
130+
}
131+
}
132+
126133
/*func TestNestedPageRenders(t *testing.T) {
127134
t.Parallel()
128135

0 commit comments

Comments
 (0)