More protobufjs migration
This commit is contained in:
parent
cf06e6638e
commit
ddbbe3a6b1
70 changed files with 3967 additions and 3369 deletions
|
@ -20,8 +20,6 @@ module.exports = {
|
|||
dcodeIO: true,
|
||||
getString: true,
|
||||
hexToArrayBuffer: true,
|
||||
MockServer: true,
|
||||
MockSocket: true,
|
||||
PROTO_ROOT: true,
|
||||
stringToArrayBuffer: true,
|
||||
},
|
||||
|
|
|
@ -60,8 +60,6 @@ window.hexToArrayBuffer = str => {
|
|||
return ret;
|
||||
};
|
||||
|
||||
window.MockSocket.prototype.addEventListener = () => null;
|
||||
|
||||
window.Whisper = window.Whisper || {};
|
||||
window.Whisper.events = {
|
||||
on() {},
|
||||
|
|
|
@ -1,118 +0,0 @@
|
|||
// Copyright 2015-2020 Signal Messenger, LLC
|
||||
// SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
describe('ContactBuffer', () => {
|
||||
function getTestBuffer() {
|
||||
const buffer = new dcodeIO.ByteBuffer();
|
||||
const avatarBuffer = new dcodeIO.ByteBuffer();
|
||||
const avatarLen = 255;
|
||||
for (let i = 0; i < avatarLen; i += 1) {
|
||||
avatarBuffer.writeUint8(i);
|
||||
}
|
||||
avatarBuffer.limit = avatarBuffer.offset;
|
||||
avatarBuffer.offset = 0;
|
||||
const contactInfo = new window.textsecure.protobuf.ContactDetails({
|
||||
name: 'Zero Cool',
|
||||
number: '+10000000000',
|
||||
uuid: '7198E1BD-1293-452A-A098-F982FF201902',
|
||||
avatar: { contentType: 'image/jpeg', length: avatarLen },
|
||||
});
|
||||
const contactInfoBuffer = contactInfo.encode().toArrayBuffer();
|
||||
|
||||
for (let i = 0; i < 3; i += 1) {
|
||||
buffer.writeVarint32(contactInfoBuffer.byteLength);
|
||||
buffer.append(contactInfoBuffer);
|
||||
buffer.append(avatarBuffer.clone());
|
||||
}
|
||||
|
||||
buffer.limit = buffer.offset;
|
||||
buffer.offset = 0;
|
||||
return buffer.toArrayBuffer();
|
||||
}
|
||||
|
||||
it('parses an array buffer of contacts', () => {
|
||||
const arrayBuffer = getTestBuffer();
|
||||
const contactBuffer = new window.textsecure.ContactBuffer(arrayBuffer);
|
||||
let contact = contactBuffer.next();
|
||||
let count = 0;
|
||||
while (contact !== undefined) {
|
||||
count += 1;
|
||||
assert.strictEqual(contact.name, 'Zero Cool');
|
||||
assert.strictEqual(contact.number, '+10000000000');
|
||||
assert.strictEqual(contact.uuid, '7198e1bd-1293-452a-a098-f982ff201902');
|
||||
assert.strictEqual(contact.avatar.contentType, 'image/jpeg');
|
||||
assert.strictEqual(contact.avatar.length, 255);
|
||||
assert.strictEqual(contact.avatar.data.byteLength, 255);
|
||||
const avatarBytes = new Uint8Array(contact.avatar.data);
|
||||
for (let j = 0; j < 255; j += 1) {
|
||||
assert.strictEqual(avatarBytes[j], j);
|
||||
}
|
||||
contact = contactBuffer.next();
|
||||
}
|
||||
assert.strictEqual(count, 3);
|
||||
});
|
||||
});
|
||||
|
||||
describe('GroupBuffer', () => {
|
||||
function getTestBuffer() {
|
||||
const buffer = new dcodeIO.ByteBuffer();
|
||||
const avatarBuffer = new dcodeIO.ByteBuffer();
|
||||
const avatarLen = 255;
|
||||
for (let i = 0; i < avatarLen; i += 1) {
|
||||
avatarBuffer.writeUint8(i);
|
||||
}
|
||||
avatarBuffer.limit = avatarBuffer.offset;
|
||||
avatarBuffer.offset = 0;
|
||||
const groupInfo = new window.textsecure.protobuf.GroupDetails({
|
||||
id: window.Signal.Crypto.typedArrayToArrayBuffer(
|
||||
new Uint8Array([1, 3, 3, 7])
|
||||
),
|
||||
name: 'Hackers',
|
||||
membersE164: ['cereal', 'burn', 'phreak', 'joey'],
|
||||
avatar: { contentType: 'image/jpeg', length: avatarLen },
|
||||
});
|
||||
const groupInfoBuffer = groupInfo.encode().toArrayBuffer();
|
||||
|
||||
for (let i = 0; i < 3; i += 1) {
|
||||
buffer.writeVarint32(groupInfoBuffer.byteLength);
|
||||
buffer.append(groupInfoBuffer);
|
||||
buffer.append(avatarBuffer.clone());
|
||||
}
|
||||
|
||||
buffer.limit = buffer.offset;
|
||||
buffer.offset = 0;
|
||||
return buffer.toArrayBuffer();
|
||||
}
|
||||
|
||||
it('parses an array buffer of groups', () => {
|
||||
const arrayBuffer = getTestBuffer();
|
||||
const groupBuffer = new window.textsecure.GroupBuffer(arrayBuffer);
|
||||
let group = groupBuffer.next();
|
||||
let count = 0;
|
||||
while (group !== undefined) {
|
||||
count += 1;
|
||||
assert.strictEqual(group.name, 'Hackers');
|
||||
assertEqualArrayBuffers(
|
||||
group.id.toArrayBuffer(),
|
||||
window.Signal.Crypto.typedArrayToArrayBuffer(
|
||||
new Uint8Array([1, 3, 3, 7])
|
||||
)
|
||||
);
|
||||
assert.sameMembers(group.membersE164, [
|
||||
'cereal',
|
||||
'burn',
|
||||
'phreak',
|
||||
'joey',
|
||||
]);
|
||||
assert.strictEqual(group.avatar.contentType, 'image/jpeg');
|
||||
assert.strictEqual(group.avatar.length, 255);
|
||||
assert.strictEqual(group.avatar.data.byteLength, 255);
|
||||
const avatarBytes = new Uint8Array(group.avatar.data);
|
||||
for (let j = 0; j < 255; j += 1) {
|
||||
assert.strictEqual(avatarBytes[j], j);
|
||||
}
|
||||
group = groupBuffer.next();
|
||||
}
|
||||
assert.strictEqual(count, 3);
|
||||
});
|
||||
});
|
|
@ -39,11 +39,9 @@
|
|||
|
||||
<script type="text/javascript" src="helpers_test.js"></script>
|
||||
<script type="text/javascript" src="crypto_test.js"></script>
|
||||
<script type="text/javascript" src="contacts_parser_test.js"></script>
|
||||
<script type="text/javascript" src="generate_keys_test.js"></script>
|
||||
<script type="text/javascript" src="task_with_timeout_test.js"></script>
|
||||
<script type="text/javascript" src="account_manager_test.js"></script>
|
||||
<script type="text/javascript" src="message_receiver_test.js"></script>
|
||||
<script type="text/javascript" src="sendmessage_test.js"></script>
|
||||
|
||||
<!-- Comment out to turn off code coverage. Useful for getting real callstacks. -->
|
||||
|
|
|
@ -1,95 +0,0 @@
|
|||
// Copyright 2015-2020 Signal Messenger, LLC
|
||||
// SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
/* global textsecure */
|
||||
|
||||
describe('MessageReceiver', () => {
|
||||
const { WebSocket } = window;
|
||||
const number = '+19999999999';
|
||||
const uuid = 'AAAAAAAA-BBBB-4CCC-9DDD-EEEEEEEEEEEE';
|
||||
const deviceId = 1;
|
||||
const signalingKey = window.Signal.Crypto.getRandomBytes(32 + 20);
|
||||
|
||||
before(() => {
|
||||
localStorage.clear();
|
||||
window.WebSocket = MockSocket;
|
||||
textsecure.storage.user.setNumberAndDeviceId(number, deviceId, 'name');
|
||||
textsecure.storage.user.setUuidAndDeviceId(uuid, deviceId);
|
||||
textsecure.storage.put('password', 'password');
|
||||
textsecure.storage.put('signaling_key', signalingKey);
|
||||
});
|
||||
after(() => {
|
||||
localStorage.clear();
|
||||
window.WebSocket = WebSocket;
|
||||
});
|
||||
|
||||
describe('connecting', () => {
|
||||
let attrs;
|
||||
let websocketmessage;
|
||||
|
||||
before(() => {
|
||||
attrs = {
|
||||
type: textsecure.protobuf.Envelope.Type.CIPHERTEXT,
|
||||
source: number,
|
||||
sourceUuid: uuid,
|
||||
sourceDevice: deviceId,
|
||||
timestamp: Date.now(),
|
||||
content: window.Signal.Crypto.getRandomBytes(200),
|
||||
};
|
||||
const body = new textsecure.protobuf.Envelope(attrs).toArrayBuffer();
|
||||
|
||||
websocketmessage = new textsecure.protobuf.WebSocketMessage({
|
||||
type: textsecure.protobuf.WebSocketMessage.Type.REQUEST,
|
||||
request: { verb: 'PUT', path: '/api/v1/message', body },
|
||||
});
|
||||
});
|
||||
|
||||
it('generates decryption-error event when it cannot decrypt', done => {
|
||||
const mockServer = new MockServer('ws://localhost:8081/');
|
||||
|
||||
mockServer.on('connection', server => {
|
||||
setTimeout(() => {
|
||||
server.send(new Blob([websocketmessage.toArrayBuffer()]));
|
||||
}, 1);
|
||||
});
|
||||
|
||||
const messageReceiver = new textsecure.MessageReceiver(
|
||||
'oldUsername.2',
|
||||
'username.2',
|
||||
'password',
|
||||
'signalingKey',
|
||||
{
|
||||
serverTrustRoot: 'AAAAAAAA',
|
||||
}
|
||||
);
|
||||
|
||||
messageReceiver.addEventListener('decrytion-error', done());
|
||||
});
|
||||
});
|
||||
|
||||
// For when we start testing individual MessageReceiver methods
|
||||
|
||||
// describe('methods', () => {
|
||||
// let messageReceiver;
|
||||
// let mockServer;
|
||||
|
||||
// beforeEach(() => {
|
||||
// // Necessary to populate the server property inside of MockSocket. Without it, we
|
||||
// // crash when doing any number of things to a MockSocket instance.
|
||||
// mockServer = new MockServer('ws://localhost:8081');
|
||||
|
||||
// messageReceiver = new textsecure.MessageReceiver(
|
||||
// 'oldUsername.3',
|
||||
// 'username.3',
|
||||
// 'password',
|
||||
// 'signalingKey',
|
||||
// {
|
||||
// serverTrustRoot: 'AAAAAAAA',
|
||||
// }
|
||||
// );
|
||||
// });
|
||||
// afterEach(() => {
|
||||
// mockServer.close();
|
||||
// });
|
||||
// });
|
||||
});
|
|
@ -1,40 +0,0 @@
|
|||
// Copyright 2015-2020 Signal Messenger, LLC
|
||||
// SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
/* global textsecure */
|
||||
|
||||
describe('Protocol', () => {
|
||||
describe('Unencrypted PushMessageProto "decrypt"', () => {
|
||||
// exclusive
|
||||
it('works', done => {
|
||||
localStorage.clear();
|
||||
|
||||
const textMessage = new textsecure.protobuf.DataMessage();
|
||||
textMessage.body = 'Hi Mom';
|
||||
const serverMessage = {
|
||||
type: 4, // unencrypted
|
||||
source: '+19999999999',
|
||||
timestamp: 42,
|
||||
message: textMessage.encode(),
|
||||
};
|
||||
|
||||
return textsecure.protocol_wrapper
|
||||
.handleEncryptedMessage(
|
||||
serverMessage.source,
|
||||
serverMessage.source_device,
|
||||
serverMessage.type,
|
||||
serverMessage.message
|
||||
)
|
||||
.then(message => {
|
||||
assert.equal(message.body, textMessage.body);
|
||||
assert.equal(
|
||||
message.attachments.length,
|
||||
textMessage.attachments.length
|
||||
);
|
||||
assert.equal(textMessage.attachments.length, 0);
|
||||
})
|
||||
.then(done)
|
||||
.catch(done);
|
||||
});
|
||||
});
|
||||
});
|
|
@ -1,69 +0,0 @@
|
|||
// Copyright 2015-2020 Signal Messenger, LLC
|
||||
// SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
/* global TextSecureWebSocket */
|
||||
|
||||
describe('TextSecureWebSocket', () => {
|
||||
const RealWebSocket = window.WebSocket;
|
||||
before(() => {
|
||||
window.WebSocket = MockSocket;
|
||||
});
|
||||
after(() => {
|
||||
window.WebSocket = RealWebSocket;
|
||||
});
|
||||
it('connects and disconnects', done => {
|
||||
const mockServer = new MockServer('ws://localhost:8080');
|
||||
mockServer.on('connection', server => {
|
||||
socket.close();
|
||||
server.close();
|
||||
done();
|
||||
});
|
||||
const socket = new TextSecureWebSocket('ws://localhost:8080');
|
||||
});
|
||||
|
||||
it('sends and receives', done => {
|
||||
const mockServer = new MockServer('ws://localhost:8080');
|
||||
mockServer.on('connection', server => {
|
||||
server.on('message', () => {
|
||||
server.send('ack');
|
||||
server.close();
|
||||
});
|
||||
});
|
||||
const socket = new TextSecureWebSocket('ws://localhost:8080');
|
||||
socket.onmessage = response => {
|
||||
assert.strictEqual(response.data, 'ack');
|
||||
socket.close();
|
||||
done();
|
||||
};
|
||||
socket.send('syn');
|
||||
});
|
||||
|
||||
it('exposes the socket status', done => {
|
||||
const mockServer = new MockServer('ws://localhost:8082');
|
||||
mockServer.on('connection', server => {
|
||||
assert.strictEqual(socket.getStatus(), WebSocket.OPEN);
|
||||
server.close();
|
||||
socket.close();
|
||||
});
|
||||
const socket = new TextSecureWebSocket('ws://localhost:8082');
|
||||
socket.onclose = () => {
|
||||
assert.strictEqual(socket.getStatus(), WebSocket.CLOSING);
|
||||
done();
|
||||
};
|
||||
});
|
||||
|
||||
it('reconnects', function thisNeeded(done) {
|
||||
this.timeout(60000);
|
||||
const mockServer = new MockServer('ws://localhost:8082');
|
||||
const socket = new TextSecureWebSocket('ws://localhost:8082');
|
||||
socket.onclose = () => {
|
||||
const secondServer = new MockServer('ws://localhost:8082');
|
||||
secondServer.on('connection', server => {
|
||||
socket.close();
|
||||
server.close();
|
||||
done();
|
||||
});
|
||||
};
|
||||
mockServer.close();
|
||||
});
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue