@@ -93,6 +93,57 @@ func TestRobotsTxt(t *testing.T) {
9393 assert.Equal(t, "User-agent: *\nDisallow: /", rw.Body.String())
9494}
9595
96+func TestIsValidRedirect(t *testing.T) {
97+ opts := NewOptions()
98+ opts.ClientID = "bazquux"
99+ opts.ClientSecret = "foobar"
100+ opts.CookieSecret = "xyzzyplugh"
101+ // Should match domains that are exactly foo.bar and any subdomain of bar.foo
102+ opts.WhitelistDomains = []string{"foo.bar", ".bar.foo"}
103+ opts.Validate()
104+
105+ proxy := NewOAuthProxy(opts, func(string) bool { return true })
106+
107+ noRD := proxy.IsValidRedirect("")
108+ assert.Equal(t, false, noRD)
109+
110+ singleSlash := proxy.IsValidRedirect("/redirect")
111+ assert.Equal(t, true, singleSlash)
112+
113+ doubleSlash := proxy.IsValidRedirect("//redirect")
114+ assert.Equal(t, false, doubleSlash)
115+
116+ validHTTP := proxy.IsValidRedirect("http://foo.bar/redirect")
117+ assert.Equal(t, true, validHTTP)
118+
119+ validHTTPS := proxy.IsValidRedirect("https://foo.bar/redirect")
120+ assert.Equal(t, true, validHTTPS)
121+
122+ invalidHTTPSubdomain := proxy.IsValidRedirect("http://baz.foo.bar/redirect")
123+ assert.Equal(t, false, invalidHTTPSubdomain)
124+
125+ invalidHTTPSSubdomain := proxy.IsValidRedirect("https://baz.foo.bar/redirect")
126+ assert.Equal(t, false, invalidHTTPSSubdomain)
127+
128+ validHTTPSubdomain := proxy.IsValidRedirect("http://baz.bar.foo/redirect")
129+ assert.Equal(t, true, validHTTPSubdomain)
130+
131+ validHTTPSSubdomain := proxy.IsValidRedirect("https://baz.bar.foo/redirect")
132+ assert.Equal(t, true, validHTTPSSubdomain)
133+
134+ invalidHTTP1 := proxy.IsValidRedirect("http://foo.bar.evil.corp/redirect")
135+ assert.Equal(t, false, invalidHTTP1)
136+
137+ invalidHTTPS1 := proxy.IsValidRedirect("https://foo.bar.evil.corp/redirect")
138+ assert.Equal(t, false, invalidHTTPS1)
139+
140+ invalidHTTP2 := proxy.IsValidRedirect("http://evil.corp/redirect?rd=foo.bar")
141+ assert.Equal(t, false, invalidHTTP2)
142+
143+ invalidHTTPS2 := proxy.IsValidRedirect("https://evil.corp/redirect?rd=foo.bar")
144+ assert.Equal(t, false, invalidHTTPS2)
145+}
146+
96147type TestProvider struct {
97148 *providers.ProviderData
98149 EmailAddress string