git.iko.soy/typeable/oauth2-proxy
on master help sign in
typeable/oauth2-proxy/providers/internal_util_test.go
157 lines 4.7 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/v7/pkg/apis/sessions"
12 "github.com/stretchr/testify/assert"
15func updateURL(url *url.URL, hostname string) {
16 if url == nil {
17 return
18 }
19 url.Scheme = "http"
20 url.Host = hostname
23type ValidateSessionTestProvider struct {
24 *ProviderData
27var _ Provider = (*ValidateSessionTestProvider)(nil)
29func (tp *ValidateSessionTestProvider) GetEmailAddress(_ context.Context, _ *sessions.SessionState) (string, error) {
30 return "", errors.New("not implemented")
33// Note that we're testing the internal validateToken() used to implement
34// several Provider's ValidateSession() implementations
35func (tp *ValidateSessionTestProvider) ValidateSession(_ context.Context, _ *sessions.SessionState) bool {
36 return false
39type ValidateSessionStateTest struct {
40 backend *httptest.Server
41 responseCode int
42 provider *ValidateSessionTestProvider
43 header http.Header
46func NewValidateSessionTest() *ValidateSessionStateTest {
47 var vtTest ValidateSessionStateTest
49 vtTest.backend = httptest.NewServer(
50 http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
51 if r.URL.Path != "/oauth/tokeninfo" {
52 w.WriteHeader(500)
53 w.Write([]byte("unknown URL"))
54 }
55 tokenParam := r.FormValue("access_token")
56 if tokenParam == "" {
57 missing := false
58 receivedHeaders := r.Header
59 for k := range vtTest.header {
60 received := receivedHeaders.Get(k)
61 expected := vtTest.header.Get(k)
62 if received == "" || received != expected {
63 missing = true
64 }
65 }
66 if missing {
67 w.WriteHeader(500)
68 w.Write([]byte("no token param and missing or incorrect headers"))
69 }
70 }
71 w.WriteHeader(vtTest.responseCode)
72 w.Write([]byte("only code matters; contents disregarded"))
74 }))
75 backendURL, _ := url.Parse(vtTest.backend.URL)
76 vtTest.provider = &ValidateSessionTestProvider{
77 ProviderData: &ProviderData{
78 ValidateURL: &url.URL{
79 Scheme: "http",
80 Host: backendURL.Host,
81 Path: "/oauth/tokeninfo",
82 },
83 },
84 }
85 vtTest.responseCode = 200
86 return &vtTest
89func (vtTest *ValidateSessionStateTest) Close() {
90 vtTest.backend.Close()
93func TestValidateSessionValidToken(t *testing.T) {
94 vtTest := NewValidateSessionTest()
95 defer vtTest.Close()
96 assert.Equal(t, true, validateToken(context.Background(), vtTest.provider, "foobar", nil))
99func TestValidateSessionValidTokenWithHeaders(t *testing.T) {
100 vtTest := NewValidateSessionTest()
101 defer vtTest.Close()
102 vtTest.header = make(http.Header)
103 vtTest.header.Set("Authorization", "Bearer foobar")
104 assert.Equal(t, true,
105 validateToken(context.Background(), vtTest.provider, "foobar", vtTest.header))
108func TestValidateSessionEmptyToken(t *testing.T) {
109 vtTest := NewValidateSessionTest()
110 defer vtTest.Close()
111 assert.Equal(t, false, validateToken(context.Background(), vtTest.provider, "", nil))
114func TestValidateSessionEmptyValidateURL(t *testing.T) {
115 vtTest := NewValidateSessionTest()
116 defer vtTest.Close()
117 vtTest.provider.Data().ValidateURL = nil
118 assert.Equal(t, false, validateToken(context.Background(), vtTest.provider, "foobar", nil))
121func TestValidateSessionRequestNetworkFailure(t *testing.T) {
122 vtTest := NewValidateSessionTest()
123 // Close immediately to simulate a network failure
124 vtTest.Close()
125 assert.Equal(t, false, validateToken(context.Background(), vtTest.provider, "foobar", nil))
128func TestValidateSessionExpiredToken(t *testing.T) {
129 vtTest := NewValidateSessionTest()
130 defer vtTest.Close()
131 vtTest.responseCode = 401
132 assert.Equal(t, false, validateToken(context.Background(), vtTest.provider, "foobar", nil))
135func TestValidateSessionValidateURLWithQueryParams(t *testing.T) {
136 vtTest := NewValidateSessionTest()
137 defer vtTest.Close()
138 vtTest.provider.Data().ValidateURL, _ = url.Parse(vtTest.provider.Data().ValidateURL.String() + "?query_param1=true&query_param2=test")
139 assert.Equal(t, true, validateToken(context.Background(), vtTest.provider, "foobar", nil))
142func TestStripTokenNotPresent(t *testing.T) {
143 test := "http://local.test/api/test?a=1&b=2"
144 assert.Equal(t, test, stripToken(test))
147func TestStripToken(t *testing.T) {
148 test := "http://local.test/api/test?access_token=deadbeef&b=1&c=2"
149 expected := "http://local.test/api/test?access_token=dead...&b=1&c=2"
150 assert.Equal(t, expected, stripToken(test))
153func TestStripLongToken(t *testing.T) {
154 test := "http://local.test/api/test?access_token=deadbeefwithsupersecret&b=1&c=2"
155 expected := "http://local.test/api/test?access_token=deadb...&b=1&c=2"
156 assert.Equal(t, expected, stripToken(test))