83 lines
2.2 KiB
Go
83 lines
2.2 KiB
Go
package postgres
|
|
|
|
import (
|
|
"bytes"
|
|
"testing"
|
|
|
|
"telesrv/internal/domain"
|
|
"telesrv/internal/store"
|
|
)
|
|
|
|
func TestPrivateSendRequestFingerprintUsesImmutableIntent(t *testing.T) {
|
|
req := domain.SendPrivateTextRequest{
|
|
SenderUserID: 1001,
|
|
RecipientUserID: 1002,
|
|
RandomID: 99,
|
|
Message: "hello",
|
|
Silent: true,
|
|
Date: 1700000000,
|
|
OriginSessionID: 7,
|
|
RecipientBlocked: true,
|
|
}
|
|
fingerprint := func(in domain.SendPrivateTextRequest) []byte {
|
|
t.Helper()
|
|
got, err := store.PrivateSendFingerprint(in)
|
|
if err != nil {
|
|
t.Fatalf("privateSendRequestFingerprint: %v", err)
|
|
}
|
|
return got
|
|
}
|
|
|
|
first := fingerprint(req)
|
|
replay := req
|
|
replay.Date++
|
|
replay.OriginSessionID++
|
|
replay.OriginAuthKeyID[0] = 9
|
|
replay.RecipientBlocked = false
|
|
if got := fingerprint(replay); !bytes.Equal(first, got) {
|
|
t.Fatalf("execution-context-only changes altered fingerprint: %x != %x", got, first)
|
|
}
|
|
|
|
changedPeer := req
|
|
changedPeer.RecipientUserID++
|
|
if got := fingerprint(changedPeer); bytes.Equal(first, got) {
|
|
t.Fatal("changed recipient retained fingerprint")
|
|
}
|
|
changedBody := req
|
|
changedBody.Message = "different"
|
|
if got := fingerprint(changedBody); bytes.Equal(first, got) {
|
|
t.Fatal("changed body retained fingerprint")
|
|
}
|
|
changedMedia := req
|
|
changedMedia.Media = &domain.MessageMedia{
|
|
Kind: domain.MessageMediaKindContact,
|
|
Contact: &domain.MessageContact{
|
|
PhoneNumber: "+10000000000",
|
|
FirstName: "Changed",
|
|
},
|
|
}
|
|
if got := fingerprint(changedMedia); bytes.Equal(first, got) {
|
|
t.Fatal("changed media retained fingerprint")
|
|
}
|
|
}
|
|
|
|
func TestPrivateSendRequestFingerprintPrefersRPCFingerprint(t *testing.T) {
|
|
want := bytes.Repeat([]byte{0x5a}, 32)
|
|
req := domain.SendPrivateTextRequest{IdempotencyFingerprint: want}
|
|
got, err := store.PrivateSendFingerprint(req)
|
|
if err != nil {
|
|
t.Fatalf("privateSendRequestFingerprint: %v", err)
|
|
}
|
|
if !bytes.Equal(got, want) {
|
|
t.Fatalf("fingerprint = %x, want %x", got, want)
|
|
}
|
|
got[0] ^= 0xff
|
|
if got[0] == want[0] {
|
|
t.Fatal("returned fingerprint aliases caller storage")
|
|
}
|
|
|
|
req.IdempotencyFingerprint = []byte{1, 2, 3}
|
|
if _, err := store.PrivateSendFingerprint(req); err == nil {
|
|
t.Fatal("short caller fingerprint accepted")
|
|
}
|
|
}
|