package validation import ( . "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo/extensions/table" . "github.com/onsi/gomega" "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/options" ) var _ = Describe("Allowlist", func() { type validateRoutesTableInput struct { routes []string errStrings []string } type validateRegexesTableInput struct { regexes []string errStrings []string } type validateTrustedIPsTableInput struct { trustedIPs []string errStrings []string } DescribeTable("validateRoutes", func(r *validateRoutesTableInput) { opts := &options.Options{ SkipAuthRoutes: r.routes, } Expect(validateRoutes(opts)).To(ConsistOf(r.errStrings)) }, Entry("Valid regex routes", &validateRoutesTableInput{ routes: []string{ "/foo", "POST=/foo/bar", "PUT=^/foo/bar$", "DELETE=/crazy/(?:regex)?/[^/]+/stuff$", }, errStrings: []string{}, }), Entry("Bad regexes do not compile", &validateRoutesTableInput{ routes: []string{ "POST=/(foo", "OPTIONS=/foo/bar)", "GET=^]/foo/bar[$", "GET=^]/foo/bar[$", }, errStrings: []string{ "error compiling regex //(foo/: error parsing regexp: missing closing ): `/(foo`", "error compiling regex //foo/bar)/: error parsing regexp: unexpected ): `/foo/bar)`", "error compiling regex /^]/foo/bar[$/: error parsing regexp: missing closing ]: `[$`", "error compiling regex /^]/foo/bar[$/: error parsing regexp: missing closing ]: `[$`", }, }), ) DescribeTable("validateRegexes", func(r *validateRegexesTableInput) { opts := &options.Options{ SkipAuthRegex: r.regexes, } Expect(validateRegexes(opts)).To(ConsistOf(r.errStrings)) }, Entry("Valid regex routes", &validateRegexesTableInput{ regexes: []string{ "/foo", "/foo/bar", "^/foo/bar$", "/crazy/(?:regex)?/[^/]+/stuff$", }, errStrings: []string{}, }), Entry("Bad regexes do not compile", &validateRegexesTableInput{ regexes: []string{ "/(foo", "/foo/bar)", "^]/foo/bar[$", "^]/foo/bar[$", }, errStrings: []string{ "error compiling regex //(foo/: error parsing regexp: missing closing ): `/(foo`", "error compiling regex //foo/bar)/: error parsing regexp: unexpected ): `/foo/bar)`", "error compiling regex /^]/foo/bar[$/: error parsing regexp: missing closing ]: `[$`", "error compiling regex /^]/foo/bar[$/: error parsing regexp: missing closing ]: `[$`", }, }), ) DescribeTable("validateTrustedIPs", func(t *validateTrustedIPsTableInput) { opts := &options.Options{ TrustedIPs: t.trustedIPs, } Expect(validateTrustedIPs(opts)).To(ConsistOf(t.errStrings)) }, Entry("Non-overlapping valid IPs", &validateTrustedIPsTableInput{ trustedIPs: []string{ "127.0.0.1", "10.32.0.1/32", "43.36.201.0/24", "::1", "2a12:105:ee7:9234:0:0:0:0/64", }, errStrings: []string{}, }), Entry("Overlapping valid IPs", &validateTrustedIPsTableInput{ trustedIPs: []string{ "135.180.78.199", "135.180.78.199/32", "d910:a5a1:16f8:ddf5:e5b9:5cef:a65e:41f4", "d910:a5a1:16f8:ddf5:e5b9:5cef:a65e:41f4/128", }, errStrings: []string{}, }), Entry("Invalid IPs", &validateTrustedIPsTableInput{ trustedIPs: []string{"[::1]", "alkwlkbn/32"}, errStrings: []string{ "trusted_ips[0] ([::1]) could not be recognized", "trusted_ips[1] (alkwlkbn/32) could not be recognized", }, }), ) })