diff --git a/libtextsecure/sendmessage.js b/libtextsecure/sendmessage.js index f815ed227..b1669d104 100644 --- a/libtextsecure/sendmessage.js +++ b/libtextsecure/sendmessage.js @@ -1,4 +1,4 @@ -/* global _, textsecure, WebAPI, libsignal, OutgoingMessage, window, libloki */ +/* global _, textsecure, WebAPI, libsignal, OutgoingMessage, window, libloki, libsession */ /* eslint-disable more/no-then, no-bitwise */ @@ -417,27 +417,6 @@ MessageSender.prototype = { }); }, - sendMessageProtoAndWait(timestamp, numbers, message, silent, options = {}) { - return new Promise((resolve, reject) => { - const callback = result => { - if (result && result.errors && result.errors.length > 0) { - return reject(result); - } - - return resolve(result); - }; - - this.sendMessageProto( - timestamp, - numbers, - message, - callback, - silent, - options - ); - }); - }, - sendIndividualProto(number, proto, timestamp, silent, options = {}) { return new Promise((resolve, reject) => { const callback = res => { @@ -768,28 +747,19 @@ MessageSender.prototype = { ); }, - sendRequestContactSyncMessage(options) { + // Currently not in use under session (our device ID are always 1) + async sendRequestContactSyncMessage() { const myNumber = textsecure.storage.user.getNumber(); const myDevice = textsecure.storage.user.getDeviceId(); if (myDevice !== 1 && myDevice !== '1') { - const request = new textsecure.protobuf.SyncMessage.Request(); - request.type = textsecure.protobuf.SyncMessage.Request.Type.CONTACTS; - const syncMessage = this.createSyncMessage(); - syncMessage.request = request; - const contentMessage = new textsecure.protobuf.Content(); - contentMessage.syncMessage = syncMessage; + const user = libsession.Types.PubKey.from(myNumber); + const { RequestContactSyncMessage } = window.libsession.Messages.Outgoing; - const silent = true; - return this.sendIndividualProto( - myNumber, - contentMessage, - Date.now(), - silent, - options + const requestContactSyncMessage = new RequestContactSyncMessage( + { timestamp: Date.now() } ); + await libsession.getMessageQueue().send(user, requestContactSyncMessage); } - - return Promise.resolve(); }, sendDeliveryReceipt(recipientId, timestamp, options) { diff --git a/ts/session/messages/outgoing/content/sync/RequestContactSyncMessage.ts b/ts/session/messages/outgoing/content/sync/RequestContactSyncMessage.ts new file mode 100644 index 000000000..42364a12a --- /dev/null +++ b/ts/session/messages/outgoing/content/sync/RequestContactSyncMessage.ts @@ -0,0 +1,23 @@ +import { SyncMessage } from './SyncMessage'; +import { SignalService } from '../../../../../protobuf'; + +export abstract class RequestContactSyncMessage extends SyncMessage { + public ttl(): number { + return this.getDefaultTTL(); + } + + protected contentProto(): SignalService.Content { + return new SignalService.Content({ + syncMessage: this.syncProto(), + }); + } + + protected syncProto(): SignalService.SyncMessage { + const { CONTACTS } = SignalService.SyncMessage.Request.Type; + const syncMessage = this.createSyncMessage(); + syncMessage.request = new SignalService.SyncMessage.Request({type: CONTACTS}); + + + return syncMessage; + } +} diff --git a/ts/session/messages/outgoing/content/sync/SyncMessage.ts b/ts/session/messages/outgoing/content/sync/SyncMessage.ts index 3eb336dc6..360f32344 100644 --- a/ts/session/messages/outgoing/content/sync/SyncMessage.ts +++ b/ts/session/messages/outgoing/content/sync/SyncMessage.ts @@ -1,5 +1,6 @@ import { ContentMessage } from '../ContentMessage'; import { SignalService } from '../../../../../protobuf'; +import * as crypto from 'crypto'; export abstract class SyncMessage extends ContentMessage { public ttl(): number { @@ -12,5 +13,20 @@ export abstract class SyncMessage extends ContentMessage { }); } + protected createSyncMessage(): SignalService.SyncMessage { + const syncMessage = new SignalService.SyncMessage(); + + // Generate a random int from 1 and 512 + const buffer = crypto.randomBytes(1); + + // tslint:disable-next-line: no-bitwise + const paddingLength = (new Uint8Array(buffer)[0] & 0x1FF) + 1; + + // Generate a random padding buffer of the chosen size + syncMessage.padding = crypto.randomBytes(paddingLength); + + return syncMessage; + } + protected abstract syncProto(): SignalService.SyncMessage; } diff --git a/ts/session/utils/SyncMessageUtils.ts b/ts/session/utils/SyncMessageUtils.ts index afab775b0..655189787 100644 --- a/ts/session/utils/SyncMessageUtils.ts +++ b/ts/session/utils/SyncMessageUtils.ts @@ -49,14 +49,14 @@ export async function getSyncContacts(): Promise | undefined> { c.attributes.secondaryStatus ); - const seondaryContactsPromise = secondaryContactsPartial.map(async c => + const secondaryContactsPromise = secondaryContactsPartial.map(async c => window.ConversationController.getOrCreateAndWait( c.getPrimaryDevicePubKey(), 'private' ) ); - const secondaryContacts = (await Promise.all(seondaryContactsPromise)) + const secondaryContacts = (await Promise.all(secondaryContactsPromise)) // Filter out our primary key if it was added here .filter(c => c.id !== primaryDevice.key);