From b5e5b3856dfc7de0ce0a36db7615ecdcc34ef77f Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 10 Jul 2020 14:42:15 +1000 Subject: [PATCH 1/2] handle sync for closed groups update as we do for regular messages --- js/models/conversations.js | 17 ++++------------- js/models/messages.js | 2 +- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/js/models/conversations.js b/js/models/conversations.js index d02400e72..6a459c595 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -1890,6 +1890,7 @@ const updateParams = { // if we do set an identifier here, be sure to not sync the message two times in msg.handleMessageSentSuccess() + identifier: messageId, timestamp: now, groupId: id, name: name || this.getName(), @@ -1901,7 +1902,7 @@ updateParams ); - await this.sendClosedGroupMessageWithSync(groupUpdateMessage, recipients); + await this.sendClosedGroupMessage(groupUpdateMessage, recipients); if (groupUpdate.joined && groupUpdate.joined.length) { const expireUpdate = { @@ -2010,13 +2011,13 @@ quitGroup ); - await this.sendClosedGroupMessageWithSync(quitGroupMessage); + await this.sendClosedGroupMessage(quitGroupMessage); this.updateTextInputState(); } }, - async sendClosedGroupMessageWithSync(message, recipients) { + async sendClosedGroupMessage(message, recipients) { const { ClosedGroupMessage, ClosedGroupChatMessage, @@ -2050,16 +2051,6 @@ .sendUsingMultiDevice(memberPubKey, message); }); await Promise.all(sendPromises); - - // Send the sync message to our devices - const syncMessage = new libsession.Messages.Outgoing.SentSyncMessage({ - timestamp: Date.now(), - identifier: message.identifier, - destination: message.groupId, - dataMessage: message.dataProto(), - }); - - await libsession.getMessageQueue().sendSyncMessage(syncMessage); } catch (e) { window.log.error(e); } diff --git a/js/models/messages.js b/js/models/messages.js index 00efaed58..16fc7ea78 100644 --- a/js/models/messages.js +++ b/js/models/messages.js @@ -1245,7 +1245,7 @@ ); const { dataMessage } = contentDecoded; if (dataMessage) { - this.sendSyncMessage(dataMessage); + await this.sendSyncMessage(dataMessage); } } else if (shouldMarkMessageAsSynced) { this.set({ synced: true }); From d58408fed0ac2b5e0b321e542644c6f1e5f32b05 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 13 Jul 2020 10:47:20 +1000 Subject: [PATCH 2/2] handle sync of closed group updates message on an empty closed group --- js/models/conversations.js | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/js/models/conversations.js b/js/models/conversations.js index 6a459c595..60e70460e 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -1704,7 +1704,17 @@ const expirationTimerMessage = new libsession.Messages.Outgoing.ExpirationTimerUpdateMessage( expireUpdate ); - + // special case when we are the only member of a closed group + const ourNumber = textsecure.storage.user.getNumber(); + const primary = await libsession.Protocols.MultiDeviceProtocol.getPrimaryDevice( + ourNumber + ); + if ( + this.get('members').length === 1 && + this.get('members')[0] === primary.key + ) { + return message.sendSyncMessageOnly(expirationTimerMessage); + } await libsession.getMessageQueue().sendToGroup(expirationTimerMessage); } return message; @@ -1902,7 +1912,11 @@ updateParams ); - await this.sendClosedGroupMessage(groupUpdateMessage, recipients); + await this.sendClosedGroupMessage( + groupUpdateMessage, + recipients, + message + ); if (groupUpdate.joined && groupUpdate.joined.length) { const expireUpdate = { @@ -2003,6 +2017,7 @@ // FIXME what about public groups? const quitGroup = { + identifier: id, timestamp: now, groupId: this.id, // if we do set an identifier here, be sure to not sync it a second time in handleMessageSentSuccess() @@ -2011,13 +2026,13 @@ quitGroup ); - await this.sendClosedGroupMessage(quitGroupMessage); + await this.sendClosedGroupMessage(quitGroupMessage, undefined, message); this.updateTextInputState(); } }, - async sendClosedGroupMessage(message, recipients) { + async sendClosedGroupMessage(message, recipients, dbMessage) { const { ClosedGroupMessage, ClosedGroupChatMessage, @@ -2044,6 +2059,11 @@ const otherMembers = (members || []).filter( member => !primary.isEqual(member) ); + // we are the only member in here + if (members.length === 1 && members[0] === primary.key) { + dbMessage.sendSyncMessageOnly(message); + return; + } const sendPromises = otherMembers.map(member => { const memberPubKey = libsession.Types.PubKey.cast(member); return libsession