From 6de7c5c405e7a9d1214056dda99f45960628f1b9 Mon Sep 17 00:00:00 2001 From: William Grant Date: Mon, 3 Apr 2023 14:09:06 +0200 Subject: [PATCH] fix: legacy message checks must look for the ExpirationTimerUpdate flag explicitly use correct model for a message in a closed group --- ts/models/message.ts | 6 +- ts/receiver/contentMessage.ts | 57 ++++++++++++------- ts/receiver/dataMessage.ts | 6 +- .../ClosedGroupVisibleMessage.ts | 2 +- 4 files changed, 44 insertions(+), 27 deletions(-) diff --git a/ts/models/message.ts b/ts/models/message.ts index 3fe396891..33cc68506 100644 --- a/ts/models/message.ts +++ b/ts/models/message.ts @@ -1098,7 +1098,11 @@ export class MessageModel extends Backbone.Model { } // TODO legacy messages support will be removed in a future release - const isLegacyMessage = Boolean(dataMessage.expireTimer && dataMessage.expireTimer > -1); + const isLegacyMessage = Boolean( + (dataMessage.expireTimer && dataMessage.expireTimer > -1) || + (!content.expirationTimer && + dataMessage.flags === SignalService.DataMessage.Flags.EXPIRATION_TIMER_UPDATE) + ); const expirationType = content.expirationType ? DisappearingMessageConversationSetting[content.expirationType] diff --git a/ts/receiver/contentMessage.ts b/ts/receiver/contentMessage.ts index 4f5462a8c..65e0d7162 100644 --- a/ts/receiver/contentMessage.ts +++ b/ts/receiver/contentMessage.ts @@ -382,18 +382,21 @@ export async function innerHandleSwarmContentMessage( * For a closed group message, this holds the conversation with that specific user outside of the closed group. * For a private conversation message, this is just the conversation with that user */ - let conversationModel = await getConversationController().getOrCreateAndWait( + const senderConversationModel = await getConversationController().getOrCreateAndWait( isPrivateConversationMessage ? envelope.source : envelope.senderIdentity, ConversationTypeEnum.PRIVATE ); + // We need to make sure that we trigger the banner ui on the correct model for the conversation and not the author (for closed groups) + let conversationModelForUIUpdate = senderConversationModel; + /** * For a closed group message, this holds the closed group's conversation. * For a private conversation message, this is just the conversation with that user */ if (!isPrivateConversationMessage) { // this is a closed group message, we have a second conversation to make sure exists - conversationModel = await getConversationController().getOrCreateAndWait( + conversationModelForUIUpdate = await getConversationController().getOrCreateAndWait( envelope.source, ConversationTypeEnum.GROUP ); @@ -413,22 +416,30 @@ export async function innerHandleSwarmContentMessage( const isDisappearingMessagesV2Released = await checkIsFeatureReleased( 'Disappearing Messages V2' ); - const isLegacyMessage = Boolean(dataMessage.expireTimer && dataMessage.expireTimer > -1); + const isLegacyMessage = Boolean( + (dataMessage.expireTimer && dataMessage.expireTimer > -1) || + (!content.expirationTimer && + dataMessage.flags === SignalService.DataMessage.Flags.EXPIRATION_TIMER_UPDATE) + ); + + const expireTimer = isDisappearingMessagesV2Released + ? content.expirationTimer + : isLegacyMessage + ? Number(dataMessage.expireTimer) + : 0; + const expirationType = isDisappearingMessagesV2Released + ? DisappearingMessageConversationSetting[content.expirationType] + : isLegacyMessage && expireTimer > 0 + ? DisappearingMessageConversationSetting[3] + : 'off'; + const lastDisappearingMessageChangeTimestamp = content.lastDisappearingMessageChangeTimestamp + ? Number(content.lastDisappearingMessageChangeTimestamp) + : undefined; const expireUpdate: DisappearingMessageUpdate = { - expirationType: isDisappearingMessagesV2Released - ? DisappearingMessageConversationSetting[content.expirationType] - : isLegacyMessage - ? DisappearingMessageConversationSetting[3] - : 'off', - expireTimer: isDisappearingMessagesV2Released - ? content.expirationTimer - : isLegacyMessage - ? Number(dataMessage.expireTimer) - : 0, - lastDisappearingMessageChangeTimestamp: content.lastDisappearingMessageChangeTimestamp - ? Number(content.lastDisappearingMessageChangeTimestamp) - : undefined, + expirationType, + expireTimer, + lastDisappearingMessageChangeTimestamp, isLegacyMessage, isDisappearingMessagesV2Released, }; @@ -439,18 +450,20 @@ export async function innerHandleSwarmContentMessage( content, `${ !isPrivateConversationMessage - ? ` in closed group ${conversationModel.get('displayNameInProfile')}` + ? `in closed group ${conversationModelForUIUpdate.get('displayNameInProfile')}` : '' }` ); // trigger notice banner - if (!conversationModel.get('hasOutdatedClient')) { - conversationModel.set({ hasOutdatedClient: true }); + if (!conversationModelForUIUpdate.get('hasOutdatedClient')) { + conversationModelForUIUpdate.set({ hasOutdatedClient: true }); + conversationModelForUIUpdate.commit(); } } else { - if (conversationModel.get('hasOutdatedClient')) { - conversationModel.set({ hasOutdatedClient: false }); + if (conversationModelForUIUpdate.get('hasOutdatedClient')) { + conversationModelForUIUpdate.set({ hasOutdatedClient: false }); + conversationModelForUIUpdate.commit(); } } @@ -459,7 +472,7 @@ export async function innerHandleSwarmContentMessage( sentAtTimestamp, dataMessage as SignalService.DataMessage, messageHash, - conversationModel, + senderConversationModel, expireUpdate ); perfEnd(`handleSwarmDataMessage-${envelope.id}`, 'handleSwarmDataMessage'); diff --git a/ts/receiver/dataMessage.ts b/ts/receiver/dataMessage.ts index 1354d42b5..11b7426fb 100644 --- a/ts/receiver/dataMessage.ts +++ b/ts/receiver/dataMessage.ts @@ -259,11 +259,11 @@ export async function handleSwarmDataMessage( // if it is a legacy message and disappearing messages v2 is released then we ignore it and use the local client's conversation settings expirationType = isDisappearingMessagesV2Released && isLegacyMessage - ? senderConversationModel.get('expirationType') + ? convoToAddMessageTo.get('expirationType') : expirationType; expireTimer = isDisappearingMessagesV2Released && isLegacyMessage - ? senderConversationModel.get('expireTimer') + ? convoToAddMessageTo.get('expireTimer') : expireTimer; msgModel.set({ @@ -283,7 +283,7 @@ export async function handleSwarmDataMessage( expireTimer, lastDisappearingMessageChangeTimestamp: isLegacyMessage ? isDisappearingMessagesV2Released - ? senderConversationModel.get('lastDisappearingMessageChangeTimestamp') + ? convoToAddMessageTo.get('lastDisappearingMessageChangeTimestamp') : Date.now() : Number(lastDisappearingMessageChangeTimestamp), source: msgModel.get('source'), diff --git a/ts/session/messages/outgoing/visibleMessage/ClosedGroupVisibleMessage.ts b/ts/session/messages/outgoing/visibleMessage/ClosedGroupVisibleMessage.ts index d40853112..6016f08cb 100644 --- a/ts/session/messages/outgoing/visibleMessage/ClosedGroupVisibleMessage.ts +++ b/ts/session/messages/outgoing/visibleMessage/ClosedGroupVisibleMessage.ts @@ -33,7 +33,7 @@ export class ClosedGroupVisibleMessage extends ClosedGroupMessage { } public dataProto(): SignalService.DataMessage { - //expireTimer is set in the dataProto in this call directly + // expireTimer is set in the dataProto in this call directly const dataProto = this.chatMessage.dataProto(); const groupMessage = new SignalService.GroupContext();