github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/model/integration_action_test.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package model 5 6 import ( 7 "bytes" 8 "crypto/ecdsa" 9 "crypto/elliptic" 10 "crypto/rand" 11 "encoding/base64" 12 "strings" 13 "testing" 14 15 "github.com/stretchr/testify/assert" 16 "github.com/stretchr/testify/require" 17 ) 18 19 func TestTriggerIdDecodeAndVerification(t *testing.T) { 20 21 key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) 22 require.Nil(t, err) 23 24 t.Run("should succeed decoding and validation", func(t *testing.T) { 25 userId := NewId() 26 clientTriggerId, triggerId, err := GenerateTriggerId(userId, key) 27 require.Nil(t, err) 28 decodedClientTriggerId, decodedUserId, err := DecodeAndVerifyTriggerId(triggerId, key) 29 assert.Nil(t, err) 30 assert.Equal(t, clientTriggerId, decodedClientTriggerId) 31 assert.Equal(t, userId, decodedUserId) 32 }) 33 34 t.Run("should succeed decoding and validation through request structs", func(t *testing.T) { 35 actionReq := &PostActionIntegrationRequest{ 36 UserId: NewId(), 37 } 38 clientTriggerId, triggerId, err := actionReq.GenerateTriggerId(key) 39 require.Nil(t, err) 40 dialogReq := &OpenDialogRequest{TriggerId: triggerId} 41 decodedClientTriggerId, decodedUserId, err := dialogReq.DecodeAndVerifyTriggerId(key) 42 assert.Nil(t, err) 43 assert.Equal(t, clientTriggerId, decodedClientTriggerId) 44 assert.Equal(t, actionReq.UserId, decodedUserId) 45 }) 46 47 t.Run("should fail on base64 decode", func(t *testing.T) { 48 _, _, err := DecodeAndVerifyTriggerId("junk!", key) 49 require.NotNil(t, err) 50 assert.Equal(t, "interactive_message.decode_trigger_id.base64_decode_failed", err.Id) 51 }) 52 53 t.Run("should fail on trigger parsing", func(t *testing.T) { 54 _, _, err := DecodeAndVerifyTriggerId(base64.StdEncoding.EncodeToString([]byte("junk!")), key) 55 require.NotNil(t, err) 56 assert.Equal(t, "interactive_message.decode_trigger_id.missing_data", err.Id) 57 }) 58 59 t.Run("should fail on expired timestamp", func(t *testing.T) { 60 _, _, err := DecodeAndVerifyTriggerId(base64.StdEncoding.EncodeToString([]byte("some-trigger-id:some-user-id:1234567890:junksignature")), key) 61 require.NotNil(t, err) 62 assert.Equal(t, "interactive_message.decode_trigger_id.expired", err.Id) 63 }) 64 65 t.Run("should fail on base64 decoding signature", func(t *testing.T) { 66 _, _, err := DecodeAndVerifyTriggerId(base64.StdEncoding.EncodeToString([]byte("some-trigger-id:some-user-id:12345678900000:junk!")), key) 67 require.NotNil(t, err) 68 assert.Equal(t, "interactive_message.decode_trigger_id.base64_decode_failed_signature", err.Id) 69 }) 70 71 t.Run("should fail on bad signature", func(t *testing.T) { 72 _, _, err := DecodeAndVerifyTriggerId(base64.StdEncoding.EncodeToString([]byte("some-trigger-id:some-user-id:12345678900000:junk")), key) 73 require.NotNil(t, err) 74 assert.Equal(t, "interactive_message.decode_trigger_id.signature_decode_failed", err.Id) 75 }) 76 77 t.Run("should fail on bad key", func(t *testing.T) { 78 _, triggerId, err := GenerateTriggerId(NewId(), key) 79 newKey, keyErr := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) 80 require.Nil(t, keyErr) 81 _, _, err = DecodeAndVerifyTriggerId(triggerId, newKey) 82 require.NotNil(t, err) 83 assert.Equal(t, "interactive_message.decode_trigger_id.verify_signature_failed", err.Id) 84 }) 85 } 86 87 func TestPostActionIntegrationRequestToJson(t *testing.T) { 88 o := PostActionIntegrationRequest{UserId: NewId(), Context: StringInterface{"a": "abc"}} 89 j := o.ToJson() 90 ro := PostActionIntegrationRequestFromJson(bytes.NewReader(j)) 91 92 assert.NotNil(t, ro) 93 assert.Equal(t, o, *ro) 94 } 95 96 func TestPostActionIntegrationRequestFromJsonError(t *testing.T) { 97 ro := PostActionIntegrationRequestFromJson(strings.NewReader("")) 98 assert.Nil(t, ro) 99 } 100 101 func TestPostActionIntegrationResponseToJson(t *testing.T) { 102 o := PostActionIntegrationResponse{Update: &Post{Id: NewId(), Message: NewId()}, EphemeralText: NewId()} 103 j := o.ToJson() 104 ro := PostActionIntegrationResponseFromJson(bytes.NewReader(j)) 105 106 assert.NotNil(t, ro) 107 assert.Equal(t, o, *ro) 108 } 109 110 func TestPostActionIntegrationResponseFromJsonError(t *testing.T) { 111 ro := PostActionIntegrationResponseFromJson(strings.NewReader("")) 112 assert.Nil(t, ro) 113 } 114 115 func TestSubmitDialogRequestToJson(t *testing.T) { 116 t.Run("all fine", func(t *testing.T) { 117 request := SubmitDialogRequest{ 118 URL: "http://example.org", 119 CallbackId: NewId(), 120 State: "some state", 121 UserId: NewId(), 122 ChannelId: NewId(), 123 TeamId: NewId(), 124 Submission: map[string]interface{}{ 125 "text": "some text", 126 "float": 1.2, 127 "bool": true, 128 }, 129 Cancelled: true, 130 } 131 jsonRequest := request.ToJson() 132 r := SubmitDialogRequestFromJson(bytes.NewReader(jsonRequest)) 133 134 require.NotNil(t, r) 135 assert.Equal(t, request, *r) 136 }) 137 t.Run("error", func(t *testing.T) { 138 r := SubmitDialogRequestFromJson(strings.NewReader("")) 139 assert.Nil(t, r) 140 }) 141 } 142 143 func TestSubmitDialogResponseToJson(t *testing.T) { 144 t.Run("all fine", func(t *testing.T) { 145 request := SubmitDialogResponse{ 146 Error: "some generic error", 147 Errors: map[string]string{ 148 "text": "some text", 149 "float": "1.2", 150 "bool": "true", 151 }, 152 } 153 jsonRequest := request.ToJson() 154 r := SubmitDialogResponseFromJson(bytes.NewReader(jsonRequest)) 155 156 require.NotNil(t, r) 157 assert.Equal(t, request, *r) 158 }) 159 t.Run("error", func(t *testing.T) { 160 r := SubmitDialogResponseFromJson(strings.NewReader("")) 161 assert.Nil(t, r) 162 }) 163 }