1package discordgo
2
3import (
4	"bytes"
5	"crypto/ed25519"
6	"encoding/hex"
7	"net/http/httptest"
8	"strconv"
9	"strings"
10	"testing"
11	"time"
12)
13
14func TestVerifyInteraction(t *testing.T) {
15	pubkey, privkey, err := ed25519.GenerateKey(nil)
16	if err != nil {
17		t.Errorf("error generating signing keypair: %s", err)
18	}
19	timestamp := "1608597133"
20
21	t.Run("success", func(t *testing.T) {
22		body := "body"
23		request := httptest.NewRequest("POST", "http://localhost/interaction", strings.NewReader(body))
24		request.Header.Set("X-Signature-Timestamp", timestamp)
25
26		var msg bytes.Buffer
27		msg.WriteString(timestamp)
28		msg.WriteString(body)
29		signature := ed25519.Sign(privkey, msg.Bytes())
30		request.Header.Set("X-Signature-Ed25519", hex.EncodeToString(signature[:ed25519.SignatureSize]))
31
32		if !VerifyInteraction(request, pubkey) {
33			t.Error("expected true, got false")
34		}
35	})
36
37	t.Run("failure/modified body", func(t *testing.T) {
38		body := "body"
39		request := httptest.NewRequest("POST", "http://localhost/interaction", strings.NewReader("WRONG"))
40		request.Header.Set("X-Signature-Timestamp", timestamp)
41
42		var msg bytes.Buffer
43		msg.WriteString(timestamp)
44		msg.WriteString(body)
45		signature := ed25519.Sign(privkey, msg.Bytes())
46		request.Header.Set("X-Signature-Ed25519", hex.EncodeToString(signature[:ed25519.SignatureSize]))
47
48		if VerifyInteraction(request, pubkey) {
49			t.Error("expected false, got true")
50		}
51	})
52
53	t.Run("failure/modified timestamp", func(t *testing.T) {
54		body := "body"
55		request := httptest.NewRequest("POST", "http://localhost/interaction", strings.NewReader("WRONG"))
56		request.Header.Set("X-Signature-Timestamp", strconv.FormatInt(time.Now().Add(time.Minute).Unix(), 10))
57
58		var msg bytes.Buffer
59		msg.WriteString(timestamp)
60		msg.WriteString(body)
61		signature := ed25519.Sign(privkey, msg.Bytes())
62		request.Header.Set("X-Signature-Ed25519", hex.EncodeToString(signature[:ed25519.SignatureSize]))
63
64		if VerifyInteraction(request, pubkey) {
65			t.Error("expected false, got true")
66		}
67	})
68}
69