github.com/demisto/mattermost-server@v4.9.0-rc3+incompatible/utils/api_test.go (about) 1 // Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package utils 5 6 import ( 7 "crypto/ecdsa" 8 "crypto/elliptic" 9 "crypto/rand" 10 "crypto/sha256" 11 "encoding/asn1" 12 "encoding/base64" 13 "math/big" 14 "net/http" 15 "net/http/httptest" 16 "net/url" 17 "testing" 18 19 "github.com/stretchr/testify/assert" 20 "github.com/stretchr/testify/require" 21 ) 22 23 func TestRenderWebError(t *testing.T) { 24 r := httptest.NewRequest("GET", "http://foo", nil) 25 w := httptest.NewRecorder() 26 key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) 27 require.NoError(t, err) 28 RenderWebError(w, r, http.StatusTemporaryRedirect, url.Values{ 29 "foo": []string{"bar"}, 30 }, key) 31 32 resp := w.Result() 33 location, err := url.Parse(resp.Header.Get("Location")) 34 require.NoError(t, err) 35 require.NotEmpty(t, location.Query().Get("s")) 36 37 type ecdsaSignature struct { 38 R, S *big.Int 39 } 40 var rs ecdsaSignature 41 s, err := base64.URLEncoding.DecodeString(location.Query().Get("s")) 42 require.NoError(t, err) 43 _, err = asn1.Unmarshal(s, &rs) 44 require.NoError(t, err) 45 46 assert.Equal(t, "bar", location.Query().Get("foo")) 47 h := sha256.Sum256([]byte("/error?foo=bar")) 48 assert.True(t, ecdsa.Verify(&key.PublicKey, h[:], rs.R, rs.S)) 49 }