Merge 76e566ef63 into 110d51d1d7
This commit is contained in:
commit
9b9f04beca
|
|
@ -1243,7 +1243,12 @@ func checkAllowedEmails(req *http.Request, s *sessionsapi.SessionState) bool {
|
|||
// encodeState builds the OAuth state param out of our nonce and
|
||||
// original application redirect
|
||||
func encodeState(nonce string, redirect string, encode bool) string {
|
||||
rawString := fmt.Sprintf("%v:%v", nonce, redirect)
|
||||
redirectPart := redirect
|
||||
if !encode {
|
||||
redirectPart = url.QueryEscape(redirectPart)
|
||||
}
|
||||
|
||||
rawString := fmt.Sprintf("%v:%v", nonce, redirectPart)
|
||||
if encode {
|
||||
return base64.RawURLEncoding.EncodeToString([]byte(rawString))
|
||||
}
|
||||
|
|
@ -1263,7 +1268,18 @@ func decodeState(state string, encode bool) (string, string, error) {
|
|||
if len(parsedState) != 2 {
|
||||
return "", "", errors.New("invalid length")
|
||||
}
|
||||
return parsedState[0], parsedState[1], nil
|
||||
nonce := parsedState[0]
|
||||
redirect := parsedState[1]
|
||||
|
||||
if !encode {
|
||||
unescapedRedirect, err := url.QueryUnescape(redirect)
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
}
|
||||
redirect = unescapedRedirect
|
||||
}
|
||||
|
||||
return nonce, redirect, nil
|
||||
}
|
||||
|
||||
// addHeadersForProxying adds the appropriate headers the request / response for proxying
|
||||
|
|
|
|||
|
|
@ -3292,26 +3292,45 @@ func TestAuthOnlyAllowedEmailDomains(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestStateEncodesCorrectly(t *testing.T) {
|
||||
state := "some_state_to_test"
|
||||
state := "https://example.com/callback?foo=bar&baz=qux"
|
||||
nonce := "some_nonce_to_test"
|
||||
|
||||
encodedResult := encodeState(nonce, state, true)
|
||||
assert.Equal(t, "c29tZV9ub25jZV90b190ZXN0OnNvbWVfc3RhdGVfdG9fdGVzdA", encodedResult)
|
||||
expectedEncoded := base64.RawURLEncoding.EncodeToString([]byte(fmt.Sprintf("%s:%s", nonce, state)))
|
||||
assert.Equal(t, expectedEncoded, encodedResult)
|
||||
|
||||
notEncodedResult := encodeState(nonce, state, false)
|
||||
assert.Equal(t, "some_nonce_to_test:some_state_to_test", notEncodedResult)
|
||||
expectedUnencoded := fmt.Sprintf("%s:%s", nonce, url.QueryEscape(state))
|
||||
assert.Equal(t, expectedUnencoded, notEncodedResult)
|
||||
assert.NotContains(t, notEncodedResult, "&")
|
||||
}
|
||||
|
||||
func TestStateDecodesCorrectly(t *testing.T) {
|
||||
nonce, redirect, _ := decodeState("c29tZV9ub25jZV90b190ZXN0OnNvbWVfc3RhdGVfdG9fdGVzdA", true)
|
||||
state := "https://example.com/callback?foo=bar&baz=qux"
|
||||
nonce := "some_nonce_to_test"
|
||||
|
||||
assert.Equal(t, "some_nonce_to_test", nonce)
|
||||
assert.Equal(t, "some_state_to_test", redirect)
|
||||
encodedState := base64.RawURLEncoding.EncodeToString([]byte(fmt.Sprintf("%s:%s", nonce, state)))
|
||||
decodedNonce, decodedRedirect, err := decodeState(encodedState, true)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, nonce, decodedNonce)
|
||||
assert.Equal(t, state, decodedRedirect)
|
||||
|
||||
nonce2, redirect2, _ := decodeState("some_nonce_to_test:some_state_to_test", false)
|
||||
rawState := fmt.Sprintf("%s:%s", nonce, url.QueryEscape(state))
|
||||
decodedNonce2, decodedRedirect2, err := decodeState(rawState, false)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, nonce, decodedNonce2)
|
||||
assert.Equal(t, state, decodedRedirect2)
|
||||
}
|
||||
|
||||
assert.Equal(t, "some_nonce_to_test", nonce2)
|
||||
assert.Equal(t, "some_state_to_test", redirect2)
|
||||
func TestStateRoundTripWithMultipleQueryParameters(t *testing.T) {
|
||||
state := "https://example.com/callback?foo=bar&baz=qux&zap=zazzle"
|
||||
nonce := "another_nonce"
|
||||
|
||||
encoded := encodeState(nonce, state, false)
|
||||
decodedNonce, decodedRedirect, err := decodeState(encoded, false)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, nonce, decodedNonce)
|
||||
assert.Equal(t, state, decodedRedirect)
|
||||
}
|
||||
|
||||
func TestAuthOnlyAllowedEmails(t *testing.T) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue