From 6e1258e3d16cf03d277108a32a63296976d0af64 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 19 Jun 2020 14:29:01 +1000 Subject: [PATCH] expirationTimerUpdate uses new sending pipeline --- js/models/conversations.js | 40 ++++++------ libtextsecure/sendmessage.js | 65 ------------------- ts/receiver/groups.ts | 5 +- .../data/ExpirationTimerUpdateMessage.ts | 49 ++++++++++++++ .../data/group/ClosedGroupLeaveMessage.ts | 7 +- .../content/data/group/ClosedGroupMessage.ts | 4 +- .../group/ClosedGroupRequestInfoMessage.ts | 7 +- 7 files changed, 78 insertions(+), 99 deletions(-) create mode 100644 ts/session/messages/outgoing/content/data/ExpirationTimerUpdateMessage.ts diff --git a/js/models/conversations.js b/js/models/conversations.js index 181fb2a2c..17797e4c6 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -1681,7 +1681,6 @@ if (this.get('profileSharing')) { profileKey = storage.get('profileKey'); } - let promise; if (this.isMe()) { const flags = @@ -1699,29 +1698,28 @@ ); return message.sendSyncMessageOnly(dataMessage); } + const expireUpdate = { + timestamp: message.get('sent_at'), + expireTimer, + profileKey, + }; if (this.get('type') === 'private') { - promise = textsecure.messaging.sendExpirationTimerUpdateToNumber( - this.get('id'), - expireTimer, - message.get('sent_at'), - profileKey, - {} - ); - } else { - promise = textsecure.messaging.sendExpirationTimerUpdateToGroup( - this.get('id'), - this.getRecipients(), - expireTimer, - message.get('sent_at'), - profileKey, - {} - ); - } + const expirationTimerMessage = new new libsession.Messages.Outgoing.ExpirationTimerUpdateMessage( + expireUpdate + )(); - await message.send(this.wrapSend(promise)); + await libsession + .getMessageQueue() + .sendUsingMultiDevice(this.get('id'), expirationTimerMessage); + } else { + expireUpdate.groupId = this.get('id'); + const expirationTimerMessage = new new libsession.Messages.Outgoing.ExpirationTimerUpdateMessage( + expireUpdate + )(); - return message; + await libsession.getMessageQueue().sendToGroup(expirationTimerMessage); + } }, isSearchable() { @@ -1950,7 +1948,7 @@ }; const quitGroupMessage = new new libsession.Messages.Outgoing.ClosedGroupLeaveMessage( quitGroup - ); + )(); await libsession.getMessageQueue().sendToGroup(quitGroupMessage); diff --git a/libtextsecure/sendmessage.js b/libtextsecure/sendmessage.js index 5577cd943..f815ed227 100644 --- a/libtextsecure/sendmessage.js +++ b/libtextsecure/sendmessage.js @@ -1222,64 +1222,6 @@ MessageSender.prototype = { textsecure.messaging.updateMediumGroup([sender], proto); }, - async sendExpirationTimerUpdateToGroup( - groupId, - groupNumbers, - expireTimer, - timestamp, - profileKey, - options - ) { - // We always assume that only primary device is a member in the group - const primaryDeviceKey = - window.storage.get('primaryDevicePubKey') || - textsecure.storage.user.getNumber(); - const numbers = groupNumbers.filter(number => number !== primaryDeviceKey); - - const attrs = { - recipients: numbers, - timestamp, - needsSync: true, - expireTimer, - profileKey, - flags: textsecure.protobuf.DataMessage.Flags.EXPIRATION_TIMER_UPDATE, - group: { - id: groupId, - type: textsecure.protobuf.GroupContext.Type.DELIVER, - }, - }; - - if (numbers.length === 0) { - return Promise.resolve({ - successfulNumbers: [], - failoverNumbers: [], - errors: [], - unidentifiedDeliveries: [], - dataMessage: await this.getMessageProtoObj(attrs), - }); - } - - return this.sendMessage(attrs, options); - }, - sendExpirationTimerUpdateToNumber( - number, - expireTimer, - timestamp, - profileKey, - options - ) { - return this.sendMessage( - { - recipients: [number], - timestamp, - needsSync: true, - expireTimer, - profileKey, - flags: textsecure.protobuf.DataMessage.Flags.EXPIRATION_TIMER_UPDATE, - }, - options - ); - }, makeProxiedRequest(url, options) { return this.server.makeProxiedRequest(url, options); }, @@ -1292,13 +1234,6 @@ window.textsecure = window.textsecure || {}; textsecure.MessageSender = function MessageSenderWrapper(username, password) { const sender = new MessageSender(username, password); - - this.sendExpirationTimerUpdateToNumber = sender.sendExpirationTimerUpdateToNumber.bind( - sender - ); - this.sendExpirationTimerUpdateToGroup = sender.sendExpirationTimerUpdateToGroup.bind( - sender - ); this.sendRequestGroupSyncMessage = sender.sendRequestGroupSyncMessage.bind( sender ); diff --git a/ts/receiver/groups.ts b/ts/receiver/groups.ts index 3dfa98655..7709eeb0f 100644 --- a/ts/receiver/groups.ts +++ b/ts/receiver/groups.ts @@ -118,11 +118,8 @@ export async function preprocessGroupMessage( timestamp: Date.now(), groupId: conversationId, }; - const requestInfoMessage = new ClosedGroupRequestInfoMessage( - requestInfo - ); + const requestInfoMessage = new ClosedGroupRequestInfoMessage(requestInfo); await getMessageQueue().sendToGroup(requestInfoMessage); - } return false; } diff --git a/ts/session/messages/outgoing/content/data/ExpirationTimerUpdateMessage.ts b/ts/session/messages/outgoing/content/data/ExpirationTimerUpdateMessage.ts new file mode 100644 index 000000000..7b2044487 --- /dev/null +++ b/ts/session/messages/outgoing/content/data/ExpirationTimerUpdateMessage.ts @@ -0,0 +1,49 @@ +import { ContentMessage } from '../ContentMessage'; +import { SignalService } from '../../../../../protobuf'; +import { MessageParams } from '../../Message'; +import { StringUtils } from '../../../../utils'; +import { DataMessage } from './DataMessage'; + +interface ExpirationTimerUpdateMessageParams extends MessageParams { + groupId?: string; + expireTimer: number | null; + profileKey?: Uint8Array; +} + +export class ExpirationTimerUpdateMessage extends DataMessage { + private readonly groupId?: string; + private readonly expireTimer: number | null; + private readonly profileKey?: Uint8Array; + + constructor(params: ExpirationTimerUpdateMessageParams) { + super({ timestamp: params.timestamp, identifier: params.identifier }); + this.groupId = params.groupId; + this.expireTimer = params.expireTimer; + this.profileKey = params.profileKey; + } + + public ttl(): number { + return this.getDefaultTTL(); + } + + protected dataProto(): SignalService.DataMessage { + const data = new SignalService.DataMessage(); + + const groupMessage = new SignalService.GroupContext(); + if (this.groupId) { + groupMessage.id = new Uint8Array( + StringUtils.encode(this.groupId, 'utf8') + ); + groupMessage.type = SignalService.GroupContext.Type.DELIVER; + } + data.flags = SignalService.DataMessage.Flags.EXPIRATION_TIMER_UPDATE; + if (this.expireTimer) { + data.expireTimer = this.expireTimer; + } + if (this.profileKey) { + data.profileKey = this.profileKey; + } + + return data; + } +} diff --git a/ts/session/messages/outgoing/content/data/group/ClosedGroupLeaveMessage.ts b/ts/session/messages/outgoing/content/data/group/ClosedGroupLeaveMessage.ts index 353fd2db2..5c471dfba 100644 --- a/ts/session/messages/outgoing/content/data/group/ClosedGroupLeaveMessage.ts +++ b/ts/session/messages/outgoing/content/data/group/ClosedGroupLeaveMessage.ts @@ -1,9 +1,10 @@ import { SignalService } from '../../../../../../protobuf'; -import { ClosedGroupMessage, ClosedGroupMessageParams } from './ClosedGroupMessage'; - +import { + ClosedGroupMessage, + ClosedGroupMessageParams, +} from './ClosedGroupMessage'; export class ClosedGroupLeaveMessage extends ClosedGroupMessage { - constructor(params: ClosedGroupMessageParams) { super({ timestamp: params.timestamp, diff --git a/ts/session/messages/outgoing/content/data/group/ClosedGroupMessage.ts b/ts/session/messages/outgoing/content/data/group/ClosedGroupMessage.ts index 976f58cea..01cfb9a6f 100644 --- a/ts/session/messages/outgoing/content/data/group/ClosedGroupMessage.ts +++ b/ts/session/messages/outgoing/content/data/group/ClosedGroupMessage.ts @@ -22,9 +22,7 @@ export abstract class ClosedGroupMessage extends DataMessage { protected abstract groupContextType(): SignalService.GroupContext.Type; protected groupContext(): SignalService.GroupContext { - const id = new Uint8Array( - StringUtils.encode(this.groupId, 'utf8') - ); + const id = new Uint8Array(StringUtils.encode(this.groupId, 'utf8')); const type = this.groupContextType(); return new SignalService.GroupContext({ id, type }); diff --git a/ts/session/messages/outgoing/content/data/group/ClosedGroupRequestInfoMessage.ts b/ts/session/messages/outgoing/content/data/group/ClosedGroupRequestInfoMessage.ts index ddc99abf4..e52dcbe45 100644 --- a/ts/session/messages/outgoing/content/data/group/ClosedGroupRequestInfoMessage.ts +++ b/ts/session/messages/outgoing/content/data/group/ClosedGroupRequestInfoMessage.ts @@ -1,9 +1,10 @@ import { SignalService } from '../../../../../../protobuf'; -import { ClosedGroupMessage, ClosedGroupMessageParams } from './ClosedGroupMessage'; - +import { + ClosedGroupMessage, + ClosedGroupMessageParams, +} from './ClosedGroupMessage'; export class ClosedGroupRequestInfoMessage extends ClosedGroupMessage { - constructor(params: ClosedGroupMessageParams) { super({ timestamp: params.timestamp,