github.com/keys-pub/mattermost-server@v4.10.10+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  }