From d74ea25df8083f3443b3c3c182d9735aa0597cb6 Mon Sep 17 00:00:00 2001 From: Manuel Alejandro de Brito Fontes Date: Mon, 19 Oct 2020 19:40:06 -0300 Subject: [PATCH] Add validation for wildcard server names --- .../ingress/controller/template/template.go | 13 ++++++++++++ .../controller/template/template_test.go | 21 +++++++++++++++++++ rootfs/etc/nginx/template/nginx.tmpl | 2 +- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/internal/ingress/controller/template/template.go b/internal/ingress/controller/template/template.go index 8a1a7fee7..2cc778ac1 100644 --- a/internal/ingress/controller/template/template.go +++ b/internal/ingress/controller/template/template.go @@ -182,6 +182,7 @@ var ( "buildMirrorLocations": buildMirrorLocations, "shouldLoadAuthDigestModule": shouldLoadAuthDigestModule, "shouldLoadInfluxDBModule": shouldLoadInfluxDBModule, + "buildServerName": buildServerName, } ) @@ -1459,3 +1460,15 @@ func shouldLoadInfluxDBModule(s interface{}) bool { return false } + +// buildServerName ensures wildcard hostnames are valid +func buildServerName(hostname string) string { + if !strings.HasPrefix(hostname, "*") { + return hostname + } + + hostname = strings.Replace(hostname, "*.", "", 1) + parts := strings.Split(hostname, ".") + + return `~^(?[\w-]+)\.` + strings.Join(parts, "\\.") + `$` +} diff --git a/internal/ingress/controller/template/template_test.go b/internal/ingress/controller/template/template_test.go index b5c85c1ec..d8c9a44a6 100644 --- a/internal/ingress/controller/template/template_test.go +++ b/internal/ingress/controller/template/template_test.go @@ -1448,3 +1448,24 @@ func TestModSecurityForLocation(t *testing.T) { } } } + +func TestBuildServerName(t *testing.T) { + + testCases := []struct { + title string + hostname string + expected string + }{ + {"simple domain", "foo.bar", "foo.bar"}, + {"simple www domain", "www.foo.bar", "www.foo.bar"}, + {"wildcard domain", "*.foo.bar", "~^(?[\\w-]+)\\.foo\\.bar$"}, + {"wildcard two levels domain", "*.sub.foo.bar", "~^(?[\\w-]+)\\.sub\\.foo\\.bar$"}, + } + + for _, testCase := range testCases { + result := buildServerName(testCase.hostname) + if result != testCase.expected { + t.Errorf("%v: expected '%v' but returned '%v'", testCase.title, testCase.expected, result) + } + } +} diff --git a/rootfs/etc/nginx/template/nginx.tmpl b/rootfs/etc/nginx/template/nginx.tmpl index ee0a5af44..642db7c00 100755 --- a/rootfs/etc/nginx/template/nginx.tmpl +++ b/rootfs/etc/nginx/template/nginx.tmpl @@ -577,7 +577,7 @@ http { ## start server {{ $server.Hostname }} server { - server_name {{ $server.Hostname }} {{range $server.Aliases }}{{ . }} {{ end }}; + server_name {{ buildServerName $server.Hostname }} {{range $server.Aliases }}{{ . }} {{ end }}; {{ if gt (len $cfg.BlockUserAgents) 0 }} if ($block_ua) {