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.
151 lines
5.1 KiB
TypeScript
151 lines
5.1 KiB
TypeScript
import chai from 'chai';
|
|
import * as sinon from 'sinon';
|
|
import crypto from 'crypto';
|
|
import { TestUtils } from '../../../test-utils';
|
|
import { MessageUtils } from '../../../../session/utils';
|
|
import { EncryptionType, PubKey } from '../../../../session/types';
|
|
import { SessionProtocol } from '../../../../session/protocols';
|
|
import {
|
|
MediumGroupChatMessage,
|
|
SessionRequestMessage,
|
|
} from '../../../../session/messages/outgoing';
|
|
|
|
// tslint:disable-next-line: no-require-imports no-var-requires
|
|
const chaiAsPromised = require('chai-as-promised');
|
|
chai.use(chaiAsPromised);
|
|
|
|
const { expect } = chai;
|
|
|
|
describe('Message Utils', () => {
|
|
const sandbox = sinon.createSandbox();
|
|
|
|
afterEach(() => {
|
|
sandbox.restore();
|
|
});
|
|
|
|
describe('toRawMessage', () => {
|
|
let hasSessionStub: sinon.SinonStub<[PubKey], Promise<boolean>>;
|
|
|
|
beforeEach(() => {
|
|
hasSessionStub = sandbox
|
|
.stub(SessionProtocol, 'hasSession')
|
|
.resolves(true);
|
|
});
|
|
|
|
it('can convert to raw message', async () => {
|
|
const device = TestUtils.generateFakePubKey();
|
|
const message = TestUtils.generateChatMessage();
|
|
|
|
const rawMessage = await MessageUtils.toRawMessage(device, message);
|
|
|
|
expect(Object.keys(rawMessage)).to.have.length(6);
|
|
expect(rawMessage.identifier).to.exist;
|
|
expect(rawMessage.device).to.exist;
|
|
expect(rawMessage.encryption).to.exist;
|
|
expect(rawMessage.plainTextBuffer).to.exist;
|
|
expect(rawMessage.timestamp).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.timestamp).to.equal(message.timestamp);
|
|
expect(rawMessage.ttl).to.equal(message.ttl());
|
|
});
|
|
|
|
it('should generate valid plainTextBuffer', async () => {
|
|
const device = TestUtils.generateFakePubKey();
|
|
const message = TestUtils.generateChatMessage();
|
|
|
|
const rawMessage = await MessageUtils.toRawMessage(device, message);
|
|
|
|
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.generateChatMessage();
|
|
|
|
const rawMessage = await MessageUtils.toRawMessage(device, message);
|
|
const derivedPubKey = PubKey.from(rawMessage.device);
|
|
|
|
expect(derivedPubKey).to.exist;
|
|
expect(derivedPubKey?.isEqual(device)).to.equal(
|
|
true,
|
|
'pubkey of message was not converted correctly'
|
|
);
|
|
});
|
|
|
|
it('should set encryption to MediumGroup if a MediumGroupMessage is passed in', async () => {
|
|
hasSessionStub.resolves(true);
|
|
|
|
const device = TestUtils.generateFakePubKey();
|
|
const groupId = TestUtils.generateFakePubKey();
|
|
const chatMessage = TestUtils.generateChatMessage();
|
|
const message = new MediumGroupChatMessage({ chatMessage, groupId });
|
|
|
|
const rawMessage = await MessageUtils.toRawMessage(device, message);
|
|
expect(rawMessage.encryption).to.equal(EncryptionType.MediumGroup);
|
|
});
|
|
|
|
it('should set encryption to Fallback if a SessionRequestMessage is passed in', async () => {
|
|
hasSessionStub.resolves(true);
|
|
|
|
const device = TestUtils.generateFakePubKey();
|
|
const preKeyBundle = {
|
|
deviceId: 123456,
|
|
preKeyId: 654321,
|
|
signedKeyId: 111111,
|
|
preKey: crypto.randomBytes(16),
|
|
signature: crypto.randomBytes(16),
|
|
signedKey: crypto.randomBytes(16),
|
|
identityKey: crypto.randomBytes(16),
|
|
};
|
|
const sessionRequest = new SessionRequestMessage({
|
|
timestamp: Date.now(),
|
|
preKeyBundle,
|
|
});
|
|
|
|
const rawMessage = await MessageUtils.toRawMessage(
|
|
device,
|
|
sessionRequest
|
|
);
|
|
|
|
expect(rawMessage.encryption).to.equal(EncryptionType.Fallback);
|
|
});
|
|
|
|
it('should set encryption to Fallback on other messages if we do not have a session', async () => {
|
|
hasSessionStub.resolves(false);
|
|
|
|
const device = TestUtils.generateFakePubKey();
|
|
const message = TestUtils.generateChatMessage();
|
|
const rawMessage = await MessageUtils.toRawMessage(device, message);
|
|
|
|
expect(rawMessage.encryption).to.equal(EncryptionType.Fallback);
|
|
});
|
|
|
|
it('should set encryption to Signal on other messages if we have a session', async () => {
|
|
hasSessionStub.resolves(true);
|
|
|
|
const device = TestUtils.generateFakePubKey();
|
|
const message = TestUtils.generateChatMessage();
|
|
const rawMessage = await MessageUtils.toRawMessage(device, message);
|
|
|
|
expect(rawMessage.encryption).to.equal(EncryptionType.Signal);
|
|
});
|
|
});
|
|
});
|