mirror of
https://github.com/coder/coder.git
synced 2025-07-03 16:13:58 +00:00
chore: add deployment config option to append custom csp directives (#15596)
Allows adding custom static CSP directives to Coder. Niche use case but makes this easier then creating a reverse proxy that has to replace the header. We want to preserve our directives, so having an append option is preferred to a "replace" option via a reverse proxy. Closes https://github.com/coder/coder/issues/15118
This commit is contained in:
@ -5,6 +5,7 @@ import (
|
||||
"crypto/tls"
|
||||
"crypto/x509"
|
||||
"database/sql"
|
||||
"errors"
|
||||
"expvar"
|
||||
"flag"
|
||||
"fmt"
|
||||
@ -1378,6 +1379,26 @@ func New(options *Options) *API {
|
||||
r.Get("/swagger/*", swaggerDisabled)
|
||||
}
|
||||
|
||||
additionalCSPHeaders := make(map[httpmw.CSPFetchDirective][]string, len(api.DeploymentValues.AdditionalCSPPolicy))
|
||||
var cspParseErrors error
|
||||
for _, v := range api.DeploymentValues.AdditionalCSPPolicy {
|
||||
// Format is "<directive> <value> <value> ..."
|
||||
v = strings.TrimSpace(v)
|
||||
parts := strings.Split(v, " ")
|
||||
if len(parts) < 2 {
|
||||
cspParseErrors = errors.Join(cspParseErrors, xerrors.Errorf("invalid CSP header %q, not enough parts to be valid", v))
|
||||
continue
|
||||
}
|
||||
additionalCSPHeaders[httpmw.CSPFetchDirective(strings.ToLower(parts[0]))] = parts[1:]
|
||||
}
|
||||
|
||||
if cspParseErrors != nil {
|
||||
// Do not fail Coder deployment startup because of this. Just log an error
|
||||
// and continue
|
||||
api.Logger.Error(context.Background(),
|
||||
"parsing additional CSP headers", slog.Error(cspParseErrors))
|
||||
}
|
||||
|
||||
// Add CSP headers to all static assets and pages. CSP headers only affect
|
||||
// browsers, so these don't make sense on api routes.
|
||||
cspMW := httpmw.CSPHeaders(options.Telemetry.Enabled(), func() []string {
|
||||
@ -1390,7 +1411,7 @@ func New(options *Options) *API {
|
||||
}
|
||||
// By default we do not add extra websocket connections to the CSP
|
||||
return []string{}
|
||||
})
|
||||
}, additionalCSPHeaders)
|
||||
|
||||
// Static file handler must be wrapped with HSTS handler if the
|
||||
// StrictTransportSecurityAge is set. We only need to set this header on
|
||||
|
Reference in New Issue
Block a user