@@ -1,11 +1,13 @@
1−package sessions_test
1+package sessions
22
33import (
4+ "crypto/rand"
45 "fmt"
6+ "io"
7+ mathrand "math/rand"
58 "testing"
69 "time"
710
8− "github.com/oauth2-proxy/oauth2-proxy/pkg/apis/sessions"
911 "github.com/oauth2-proxy/oauth2-proxy/pkg/encryption"
1012 "github.com/stretchr/testify/assert"
1113)
@@ -26,7 +28,7 @@ func TestSessionStateSerialization(t *testing.T) {
2628 assert.Equal(t, nil, err)
2729 c2, err := newTestCipher([]byte(altSecret))
2830 assert.Equal(t, nil, err)
29− s := &sessions.SessionState{
31+ s := &SessionState{
3032 Email: "user@domain.com",
3133 PreferredUsername: "user",
3234 AccessToken: "token1234",
@@ -38,7 +40,7 @@ func TestSessionStateSerialization(t *testing.T) {
3840 encoded, err := s.EncodeSessionState(c)
3941 assert.Equal(t, nil, err)
4042
41− ss, err := sessions.DecodeSessionState(encoded, c)
43+ ss, err := DecodeSessionState(encoded, c)
4244 t.Logf("%#v", ss)
4345 assert.Equal(t, nil, err)
4446 assert.Equal(t, "", ss.User)
@@ -51,7 +53,7 @@ func TestSessionStateSerialization(t *testing.T) {
5153 assert.Equal(t, s.RefreshToken, ss.RefreshToken)
5254
5355 // ensure a different cipher can't decode properly (ie: it gets gibberish)
54− ss, err = sessions.DecodeSessionState(encoded, c2)
56+ ss, err = DecodeSessionState(encoded, c2)
5557 t.Logf("%#v", ss)
5658 assert.NotEqual(t, nil, err)
5759}
@@ -61,7 +63,7 @@ func TestSessionStateSerializationWithUser(t *testing.T) {
6163 assert.Equal(t, nil, err)
6264 c2, err := newTestCipher([]byte(altSecret))
6365 assert.Equal(t, nil, err)
64− s := &sessions.SessionState{
66+ s := &SessionState{
6567 User: "just-user",
6668 PreferredUsername: "ju",
6769 Email: "user@domain.com",
@@ -73,7 +75,7 @@ func TestSessionStateSerializationWithUser(t *testing.T) {
7375 encoded, err := s.EncodeSessionState(c)
7476 assert.Equal(t, nil, err)
7577
76− ss, err := sessions.DecodeSessionState(encoded, c)
78+ ss, err := DecodeSessionState(encoded, c)
7779 t.Logf("%#v", ss)
7880 assert.Equal(t, nil, err)
7981 assert.Equal(t, s.User, ss.User)
@@ -85,13 +87,13 @@ func TestSessionStateSerializationWithUser(t *testing.T) {
8587 assert.Equal(t, s.RefreshToken, ss.RefreshToken)
8688
8789 // ensure a different cipher can't decode properly (ie: it gets gibberish)
88− ss, err = sessions.DecodeSessionState(encoded, c2)
90+ ss, err = DecodeSessionState(encoded, c2)
8991 t.Logf("%#v", ss)
9092 assert.NotEqual(t, nil, err)
9193}
9294
9395func TestSessionStateSerializationNoCipher(t *testing.T) {
94− s := &sessions.SessionState{
96+ s := &SessionState{
9597 Email: "user@domain.com",
9698 PreferredUsername: "user",
9799 AccessToken: "token1234",
@@ -103,7 +105,7 @@ func TestSessionStateSerializationNoCipher(t *testing.T) {
103105 assert.Equal(t, nil, err)
104106
105107 // only email should have been serialized
106− ss, err := sessions.DecodeSessionState(encoded, nil)
108+ ss, err := DecodeSessionState(encoded, nil)
107109 assert.Equal(t, nil, err)
108110 assert.Equal(t, "", ss.User)
109111 assert.Equal(t, s.Email, ss.Email)
@@ -113,7 +115,7 @@ func TestSessionStateSerializationNoCipher(t *testing.T) {
113115}
114116
115117func TestSessionStateSerializationNoCipherWithUser(t *testing.T) {
116− s := &sessions.SessionState{
118+ s := &SessionState{
117119 User: "just-user",
118120 Email: "user@domain.com",
119121 PreferredUsername: "user",
@@ -126,7 +128,7 @@ func TestSessionStateSerializationNoCipherWithUser(t *testing.T) {
126128 assert.Equal(t, nil, err)
127129
128130 // only email should have been serialized
129− ss, err := sessions.DecodeSessionState(encoded, nil)
131+ ss, err := DecodeSessionState(encoded, nil)
130132 assert.Equal(t, nil, err)
131133 assert.Equal(t, s.User, ss.User)
132134 assert.Equal(t, s.Email, ss.Email)
@@ -136,18 +138,18 @@ func TestSessionStateSerializationNoCipherWithUser(t *testing.T) {
136138}
137139
138140func TestExpired(t *testing.T) {
139− s := &sessions.SessionState{ExpiresOn: timePtr(time.Now().Add(time.Duration(-1) * time.Minute))}
141+ s := &SessionState{ExpiresOn: timePtr(time.Now().Add(time.Duration(-1) * time.Minute))}
140142 assert.Equal(t, true, s.IsExpired())
141143
142− s = &sessions.SessionState{ExpiresOn: timePtr(time.Now().Add(time.Duration(1) * time.Minute))}
144+ s = &SessionState{ExpiresOn: timePtr(time.Now().Add(time.Duration(1) * time.Minute))}
143145 assert.Equal(t, false, s.IsExpired())
144146
145− s = &sessions.SessionState{}
147+ s = &SessionState{}
146148 assert.Equal(t, false, s.IsExpired())
147149}
148150
149151type testCase struct {
150− sessions.SessionState
152+ SessionState
151153 Encoded string
152154 Cipher encryption.Cipher
153155 Error bool
@@ -163,14 +165,14 @@ func TestEncodeSessionState(t *testing.T) {
163165
164166 testCases := []testCase{
165167 {
166− SessionState: sessions.SessionState{
168+ SessionState: SessionState{
167169 Email: "user@domain.com",
168170 User: "just-user",
169171 },
170172 Encoded: `{"Email":"user@domain.com","User":"just-user"}`,
171173 },
172174 {
173− SessionState: sessions.SessionState{
175+ SessionState: SessionState{
174176 Email: "user@domain.com",
175177 User: "just-user",
176178 AccessToken: "token1234",
@@ -185,7 +187,7 @@ func TestEncodeSessionState(t *testing.T) {
185187
186188 for i, tc := range testCases {
187189 encoded, err := tc.EncodeSessionState(tc.Cipher)
188− t.Logf("i:%d Encoded:%#vsessions.SessionState:%#v Error:%#v", i, encoded, tc.SessionState, err)
190+ t.Logf("i:%d Encoded:%#vSessionState:%#v Error:%#v", i, encoded, tc.SessionState, err)
189191 if tc.Error {
190192 assert.Error(t, err)
191193 assert.Empty(t, encoded)
@@ -210,34 +212,34 @@ func TestDecodeSessionState(t *testing.T) {
210212
211213 testCases := []testCase{
212214 {
213− SessionState: sessions.SessionState{
215+ SessionState: SessionState{
214216 Email: "user@domain.com",
215217 User: "just-user",
216218 },
217219 Encoded: `{"Email":"user@domain.com","User":"just-user"}`,
218220 },
219221 {
220− SessionState: sessions.SessionState{
222+ SessionState: SessionState{
221223 Email: "user@domain.com",
222224 User: "",
223225 },
224226 Encoded: `{"Email":"user@domain.com"}`,
225227 },
226228 {
227− SessionState: sessions.SessionState{
229+ SessionState: SessionState{
228230 User: "just-user",
229231 },
230232 Encoded: `{"User":"just-user"}`,
231233 },
232234 {
233− SessionState: sessions.SessionState{
235+ SessionState: SessionState{
234236 Email: "user@domain.com",
235237 User: "just-user",
236238 },
237239 Encoded: fmt.Sprintf(`{"Email":"user@domain.com","User":"just-user","AccessToken":"I6s+ml+/MldBMgHIiC35BTKTh57skGX24w==","IDToken":"xojNdyyjB1HgYWh6XMtXY/Ph5eCVxa1cNsklJw==","RefreshToken":"qEX0x6RmASxo4dhlBG6YuRs9Syn/e9sHu/+K","CreatedAt":%s,"ExpiresOn":%s}`, createdString, eString),
238240 },
239241 {
240− SessionState: sessions.SessionState{
242+ SessionState: SessionState{
241243 Email: "user@domain.com",
242244 User: "just-user",
243245 AccessToken: "token1234",
@@ -250,7 +252,7 @@ func TestDecodeSessionState(t *testing.T) {
250252 Cipher: c,
251253 },
252254 {
253− SessionState: sessions.SessionState{
255+ SessionState: SessionState{
254256 Email: "user@domain.com",
255257 User: "just-user",
256258 },
@@ -268,7 +270,7 @@ func TestDecodeSessionState(t *testing.T) {
268270 Error: true,
269271 },
270272 {
271− SessionState: sessions.SessionState{
273+ SessionState: SessionState{
272274 Email: "user@domain.com",
273275 User: "YmFzZTY0LWVuY29kZWQtdXNlcgo=", // Base64 encoding of base64-encoded-user
274276 },
@@ -278,8 +280,8 @@ func TestDecodeSessionState(t *testing.T) {
278280 }
279281
280282 for i, tc := range testCases {
281− ss, err := sessions.DecodeSessionState(tc.Encoded, tc.Cipher)
282− t.Logf("i:%d Encoded:%#vsessions.SessionState:%#v Error:%#v", i, tc.Encoded, ss, err)
283+ ss, err := DecodeSessionState(tc.Encoded, tc.Cipher)
284+ t.Logf("i:%d Encoded:%#vSessionState:%#v Error:%#v", i, tc.Encoded, ss, err)
283285 if tc.Error {
284286 assert.Error(t, err)
285287 assert.Nil(t, ss)
@@ -301,7 +303,7 @@ func TestDecodeSessionState(t *testing.T) {
301303}
302304
303305func TestSessionStateAge(t *testing.T) {
304− ss := &sessions.SessionState{}
306+ ss := &SessionState{}
305307
306308 // Created at unset so should be 0
307309 assert.Equal(t, time.Duration(0), ss.Age())
@@ -310,3 +312,44 @@ func TestSessionStateAge(t *testing.T) {
310312 ss.CreatedAt = timePtr(time.Now().Add(-1 * time.Hour))
311313 assert.Equal(t, time.Hour, ss.Age().Round(time.Minute))
312314}
315+
316+func TestIntoEncryptAndIntoDecrypt(t *testing.T) {
317+ const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
318+
319+ // Test all 3 valid AES sizes
320+ for _, secretSize := range []int{16, 24, 32} {
321+ t.Run(fmt.Sprintf("%d", secretSize), func(t *testing.T) {
322+ secret := make([]byte, secretSize)
323+ _, err := io.ReadFull(rand.Reader, secret)
324+ assert.Equal(t, nil, err)
325+
326+ c, err := newTestCipher(secret)
327+ assert.NoError(t, err)
328+
329+ // Check no errors with empty or nil strings
330+ empty := ""
331+ assert.Equal(t, nil, into(&empty, c.Encrypt))
332+ assert.Equal(t, nil, into(&empty, c.Decrypt))
333+ assert.Equal(t, nil, into(nil, c.Encrypt))
334+ assert.Equal(t, nil, into(nil, c.Decrypt))
335+
336+ // Test various sizes tokens might be
337+ for _, dataSize := range []int{10, 100, 1000, 5000, 10000} {
338+ t.Run(fmt.Sprintf("%d", dataSize), func(t *testing.T) {
339+ b := make([]byte, dataSize)
340+ for i := range b {
341+ b[i] = charset[mathrand.Intn(len(charset))]
342+ }
343+ data := string(b)
344+ originalData := data
345+
346+ assert.Equal(t, nil, into(&data, c.Encrypt))
347+ assert.NotEqual(t, originalData, data)
348+
349+ assert.Equal(t, nil, into(&data, c.Decrypt))
350+ assert.Equal(t, originalData, data)
351+ })
352+ }
353+ })
354+ }
355+}