You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
202 lines
8.5 KiB
TypeScript
202 lines
8.5 KiB
TypeScript
/* eslint-disable no-unused-expressions */
|
|
import chai from 'chai';
|
|
import chaiAsPromised from 'chai-as-promised';
|
|
import Sinon from 'sinon';
|
|
|
|
import { ClosedGroupVisibleMessage } from '../../../../session/messages/outgoing/visibleMessage/ClosedGroupVisibleMessage';
|
|
import { PubKey } from '../../../../session/types';
|
|
import { MessageUtils } from '../../../../session/utils';
|
|
import { TestUtils } from '../../../test-utils';
|
|
|
|
import { SignalService } from '../../../../protobuf';
|
|
import { SnodeNamespaces } from '../../../../session/apis/snode_api/namespaces';
|
|
import { ClosedGroupAddedMembersMessage } from '../../../../session/messages/outgoing/controlMessage/group/ClosedGroupAddedMembersMessage';
|
|
import { ClosedGroupEncryptionPairMessage } from '../../../../session/messages/outgoing/controlMessage/group/ClosedGroupEncryptionPairMessage';
|
|
import { ClosedGroupEncryptionPairReplyMessage } from '../../../../session/messages/outgoing/controlMessage/group/ClosedGroupEncryptionPairReplyMessage';
|
|
import { ClosedGroupNameChangeMessage } from '../../../../session/messages/outgoing/controlMessage/group/ClosedGroupNameChangeMessage';
|
|
import { ClosedGroupNewMessage } from '../../../../session/messages/outgoing/controlMessage/group/ClosedGroupNewMessage';
|
|
import { ClosedGroupRemovedMembersMessage } from '../../../../session/messages/outgoing/controlMessage/group/ClosedGroupRemovedMembersMessage';
|
|
|
|
chai.use(chaiAsPromised as any);
|
|
|
|
const { expect } = chai;
|
|
|
|
describe('Message Utils', () => {
|
|
afterEach(() => {
|
|
Sinon.restore();
|
|
});
|
|
|
|
describe('toRawMessage', () => {
|
|
it('can convert to raw message', async () => {
|
|
const device = TestUtils.generateFakePubKey();
|
|
const message = TestUtils.generateVisibleMessage();
|
|
|
|
const rawMessage = await MessageUtils.toRawMessage(
|
|
device,
|
|
message,
|
|
SnodeNamespaces.UserContacts
|
|
);
|
|
|
|
expect(Object.keys(rawMessage)).to.have.length(6);
|
|
|
|
expect(rawMessage.identifier).to.exist;
|
|
expect(rawMessage.namespace).to.exist;
|
|
expect(rawMessage.device).to.exist;
|
|
expect(rawMessage.encryption).to.exist;
|
|
expect(rawMessage.plainTextBuffer).to.exist;
|
|
expect(rawMessage.ttl).to.exist;
|
|
|
|
expect(rawMessage.identifier).to.equal(message.identifier);
|
|
expect(rawMessage.device).to.equal(device.key);
|
|
expect(rawMessage.plainTextBuffer).to.deep.equal(message.plainTextBuffer());
|
|
expect(rawMessage.ttl).to.equal(message.ttl());
|
|
expect(rawMessage.namespace).to.equal(3);
|
|
});
|
|
|
|
it('should generate valid plainTextBuffer', async () => {
|
|
const device = TestUtils.generateFakePubKey();
|
|
const message = TestUtils.generateVisibleMessage();
|
|
|
|
const rawMessage = await MessageUtils.toRawMessage(device, message, SnodeNamespaces.Default);
|
|
|
|
const rawBuffer = rawMessage.plainTextBuffer;
|
|
const rawBufferJSON = JSON.stringify(rawBuffer);
|
|
const messageBufferJSON = JSON.stringify(message.plainTextBuffer());
|
|
|
|
expect(rawBuffer instanceof Uint8Array).to.equal(
|
|
true,
|
|
'raw message did not contain a plainTextBuffer'
|
|
);
|
|
expect(rawBufferJSON).to.equal(
|
|
messageBufferJSON,
|
|
'plainTextBuffer was not converted correctly'
|
|
);
|
|
});
|
|
|
|
it('should maintain pubkey', async () => {
|
|
const device = TestUtils.generateFakePubKey();
|
|
const message = TestUtils.generateVisibleMessage();
|
|
|
|
const rawMessage = await MessageUtils.toRawMessage(device, message, SnodeNamespaces.Default);
|
|
const derivedPubKey = PubKey.from(rawMessage.device);
|
|
|
|
expect(derivedPubKey).to.not.be.eq(undefined, 'should maintain pubkey');
|
|
expect(derivedPubKey?.isEqual(device)).to.equal(
|
|
true,
|
|
'pubkey of message was not converted correctly'
|
|
);
|
|
});
|
|
|
|
it('should set encryption to ClosedGroup if a ClosedGroupVisibleMessage is passed in', async () => {
|
|
const device = TestUtils.generateFakePubKey();
|
|
const groupId = TestUtils.generateFakePubKeyStr();
|
|
const chatMessage = TestUtils.generateVisibleMessage();
|
|
const message = new ClosedGroupVisibleMessage({ chatMessage, groupId });
|
|
|
|
const rawMessage = await MessageUtils.toRawMessage(device, message, SnodeNamespaces.Default);
|
|
expect(rawMessage.encryption).to.equal(SignalService.Envelope.Type.CLOSED_GROUP_MESSAGE);
|
|
});
|
|
|
|
it('should set encryption to Fallback on other messages', async () => {
|
|
const device = TestUtils.generateFakePubKey();
|
|
const message = TestUtils.generateVisibleMessage();
|
|
const rawMessage = await MessageUtils.toRawMessage(device, message, SnodeNamespaces.Default);
|
|
|
|
expect(rawMessage.encryption).to.equal(SignalService.Envelope.Type.SESSION_MESSAGE);
|
|
});
|
|
|
|
it('passing ClosedGroupNewMessage returns Fallback', async () => {
|
|
const device = TestUtils.generateFakePubKey();
|
|
const member = TestUtils.generateFakePubKey().key;
|
|
|
|
const msg = new ClosedGroupNewMessage({
|
|
timestamp: Date.now(),
|
|
name: 'df',
|
|
members: [member],
|
|
admins: [member],
|
|
groupId: TestUtils.generateFakePubKey().key,
|
|
keypair: TestUtils.generateFakeECKeyPair(),
|
|
expireTimer: 0,
|
|
});
|
|
const rawMessage = await MessageUtils.toRawMessage(device, msg, SnodeNamespaces.Default);
|
|
expect(rawMessage.encryption).to.equal(SignalService.Envelope.Type.SESSION_MESSAGE);
|
|
});
|
|
|
|
it('passing ClosedGroupNameChangeMessage returns ClosedGroup', async () => {
|
|
const device = TestUtils.generateFakePubKey();
|
|
|
|
const msg = new ClosedGroupNameChangeMessage({
|
|
timestamp: Date.now(),
|
|
name: 'df',
|
|
groupId: TestUtils.generateFakePubKey().key,
|
|
});
|
|
const rawMessage = await MessageUtils.toRawMessage(device, msg, SnodeNamespaces.Default);
|
|
expect(rawMessage.encryption).to.equal(SignalService.Envelope.Type.CLOSED_GROUP_MESSAGE);
|
|
});
|
|
|
|
it('passing ClosedGroupAddedMembersMessage returns ClosedGroup', async () => {
|
|
const device = TestUtils.generateFakePubKey();
|
|
|
|
const msg = new ClosedGroupAddedMembersMessage({
|
|
timestamp: Date.now(),
|
|
addedMembers: [TestUtils.generateFakePubKey().key],
|
|
groupId: TestUtils.generateFakePubKey().key,
|
|
});
|
|
const rawMessage = await MessageUtils.toRawMessage(device, msg, SnodeNamespaces.Default);
|
|
expect(rawMessage.encryption).to.equal(SignalService.Envelope.Type.CLOSED_GROUP_MESSAGE);
|
|
});
|
|
|
|
it('passing ClosedGroupRemovedMembersMessage returns ClosedGroup', async () => {
|
|
const device = TestUtils.generateFakePubKey();
|
|
|
|
const msg = new ClosedGroupRemovedMembersMessage({
|
|
timestamp: Date.now(),
|
|
removedMembers: [TestUtils.generateFakePubKey().key],
|
|
groupId: TestUtils.generateFakePubKey().key,
|
|
});
|
|
const rawMessage = await MessageUtils.toRawMessage(device, msg, SnodeNamespaces.Default);
|
|
expect(rawMessage.encryption).to.equal(SignalService.Envelope.Type.CLOSED_GROUP_MESSAGE);
|
|
});
|
|
|
|
it('passing ClosedGroupEncryptionPairMessage returns ClosedGroup', async () => {
|
|
const device = TestUtils.generateFakePubKey();
|
|
|
|
const fakeWrappers =
|
|
new Array<SignalService.DataMessage.ClosedGroupControlMessage.KeyPairWrapper>();
|
|
fakeWrappers.push(
|
|
new SignalService.DataMessage.ClosedGroupControlMessage.KeyPairWrapper({
|
|
publicKey: new Uint8Array(8),
|
|
encryptedKeyPair: new Uint8Array(8),
|
|
})
|
|
);
|
|
const msg = new ClosedGroupEncryptionPairMessage({
|
|
timestamp: Date.now(),
|
|
groupId: TestUtils.generateFakePubKey().key,
|
|
encryptedKeyPairs: fakeWrappers,
|
|
});
|
|
const rawMessage = await MessageUtils.toRawMessage(device, msg, SnodeNamespaces.Default);
|
|
expect(rawMessage.encryption).to.equal(SignalService.Envelope.Type.CLOSED_GROUP_MESSAGE);
|
|
});
|
|
|
|
it('passing ClosedGroupEncryptionKeyPairReply returns Fallback', async () => {
|
|
const device = TestUtils.generateFakePubKey();
|
|
|
|
const fakeWrappers =
|
|
new Array<SignalService.DataMessage.ClosedGroupControlMessage.KeyPairWrapper>();
|
|
fakeWrappers.push(
|
|
new SignalService.DataMessage.ClosedGroupControlMessage.KeyPairWrapper({
|
|
publicKey: new Uint8Array(8),
|
|
encryptedKeyPair: new Uint8Array(8),
|
|
})
|
|
);
|
|
const msg = new ClosedGroupEncryptionPairReplyMessage({
|
|
timestamp: Date.now(),
|
|
groupId: TestUtils.generateFakePubKey().key,
|
|
encryptedKeyPairs: fakeWrappers,
|
|
});
|
|
const rawMessage = await MessageUtils.toRawMessage(device, msg, SnodeNamespaces.Default);
|
|
expect(rawMessage.encryption).to.equal(SignalService.Envelope.Type.SESSION_MESSAGE);
|
|
});
|
|
});
|
|
});
|