git.iko.soy/typeable/oauth2-proxy
on request-rules help sign in
typeable/oauth2-proxy/providers/internal_util_test.go
141 lines 4.1 kB history raw
1package providers
3import (
4 "context"
5 "errors"
6 "net/http"
7 "net/http/httptest"
8 "net/url"
9 "testing"
11 "github.com/oauth2-proxy/oauth2-proxy/pkg/apis/sessions"
12 "github.com/stretchr/testify/assert"
15func updateURL(url *url.URL, hostname string) {
16 url.Scheme = "http"
17 url.Host = hostname
20type ValidateSessionStateTestProvider struct {
21 *ProviderData
24var _ Provider = (*ValidateSessionStateTestProvider)(nil)
26func (tp *ValidateSessionStateTestProvider) GetEmailAddress(ctx context.Context, s *sessions.SessionState) (string, error) {
27 return "", errors.New("not implemented")
30// Note that we're testing the internal validateToken() used to implement
31// several Provider's ValidateSessionState() implementations
32func (tp *ValidateSessionStateTestProvider) ValidateSessionState(ctx context.Context, s *sessions.SessionState) bool {
33 return false
36type ValidateSessionStateTest struct {
37 backend *httptest.Server
38 responseCode int
39 provider *ValidateSessionStateTestProvider
40 header http.Header
43func NewValidateSessionStateTest() *ValidateSessionStateTest {
44 var vtTest ValidateSessionStateTest
46 vtTest.backend = httptest.NewServer(
47 http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
48 if r.URL.Path != "/oauth/tokeninfo" {
49 w.WriteHeader(500)
50 w.Write([]byte("unknown URL"))
51 }
52 tokenParam := r.FormValue("access_token")
53 if tokenParam == "" {
54 missing := false
55 receivedHeaders := r.Header
56 for k := range vtTest.header {
57 received := receivedHeaders.Get(k)
58 expected := vtTest.header.Get(k)
59 if received == "" || received != expected {
60 missing = true
61 }
62 }
63 if missing {
64 w.WriteHeader(500)
65 w.Write([]byte("no token param and missing or incorrect headers"))
66 }
67 }
68 w.WriteHeader(vtTest.responseCode)
69 w.Write([]byte("only code matters; contents disregarded"))
71 }))
72 backendURL, _ := url.Parse(vtTest.backend.URL)
73 vtTest.provider = &ValidateSessionStateTestProvider{
74 ProviderData: &ProviderData{
75 ValidateURL: &url.URL{
76 Scheme: "http",
77 Host: backendURL.Host,
78 Path: "/oauth/tokeninfo",
79 },
80 },
81 }
82 vtTest.responseCode = 200
83 return &vtTest
86func (vtTest *ValidateSessionStateTest) Close() {
87 vtTest.backend.Close()
90func TestValidateSessionStateValidToken(t *testing.T) {
91 vtTest := NewValidateSessionStateTest()
92 defer vtTest.Close()
93 assert.Equal(t, true, validateToken(context.Background(), vtTest.provider, "foobar", nil))
96func TestValidateSessionStateValidTokenWithHeaders(t *testing.T) {
97 vtTest := NewValidateSessionStateTest()
98 defer vtTest.Close()
99 vtTest.header = make(http.Header)
100 vtTest.header.Set("Authorization", "Bearer foobar")
101 assert.Equal(t, true,
102 validateToken(context.Background(), vtTest.provider, "foobar", vtTest.header))
105func TestValidateSessionStateEmptyToken(t *testing.T) {
106 vtTest := NewValidateSessionStateTest()
107 defer vtTest.Close()
108 assert.Equal(t, false, validateToken(context.Background(), vtTest.provider, "", nil))
111func TestValidateSessionStateEmptyValidateURL(t *testing.T) {
112 vtTest := NewValidateSessionStateTest()
113 defer vtTest.Close()
114 vtTest.provider.Data().ValidateURL = nil
115 assert.Equal(t, false, validateToken(context.Background(), vtTest.provider, "foobar", nil))
118func TestValidateSessionStateRequestNetworkFailure(t *testing.T) {
119 vtTest := NewValidateSessionStateTest()
120 // Close immediately to simulate a network failure
121 vtTest.Close()
122 assert.Equal(t, false, validateToken(context.Background(), vtTest.provider, "foobar", nil))
125func TestValidateSessionStateExpiredToken(t *testing.T) {
126 vtTest := NewValidateSessionStateTest()
127 defer vtTest.Close()
128 vtTest.responseCode = 401
129 assert.Equal(t, false, validateToken(context.Background(), vtTest.provider, "foobar", nil))
132func TestStripTokenNotPresent(t *testing.T) {
133 test := "http://local.test/api/test?a=1&b=2"
134 assert.Equal(t, test, stripToken(test))
137func TestStripToken(t *testing.T) {
138 test := "http://local.test/api/test?access_token=deadbeef&b=1&c=2"
139 expected := "http://local.test/api/test?access_token=dead...&b=1&c=2"
140 assert.Equal(t, expected, stripToken(test))