From 00ef4a47a2d49b9bdafbc9533b6eeb642aa07cb4 Mon Sep 17 00:00:00 2001 From: William Grant Date: Tue, 19 Sep 2023 15:36:59 +1000 Subject: [PATCH] fix: outgoing content messages can have an equal changetimestamp --- ts/models/message.ts | 5 ++++- ts/receiver/contentMessage.ts | 19 ++++++++++++------- ts/util/expiringMessages.ts | 26 ++++++++++++++++++-------- 3 files changed, 34 insertions(+), 16 deletions(-) diff --git a/ts/models/message.ts b/ts/models/message.ts index 1a48166b4..14814df25 100644 --- a/ts/models/message.ts +++ b/ts/models/message.ts @@ -1023,7 +1023,10 @@ export class MessageModel extends Backbone.Model { throw new Error('Cannot trigger syncMessage with unknown convo.'); } - const expireUpdate = await checkForExpireUpdateInContentMessage(content, conversation); + // window.log.debug( + // `WIP: sendSyncMessage: running checkForExpireUpdateInContentMessage for ${this.id}` + // ); + const expireUpdate = await checkForExpireUpdateInContentMessage(content, conversation, true); if ( !isEmpty(expireUpdate) && diff --git a/ts/receiver/contentMessage.ts b/ts/receiver/contentMessage.ts index 621c52a6f..8bf776029 100644 --- a/ts/receiver/contentMessage.ts +++ b/ts/receiver/contentMessage.ts @@ -474,18 +474,23 @@ export async function innerHandleSwarmContentMessage( if (isEmpty(content.dataMessage.profileKey)) { content.dataMessage.profileKey = null; } + + // window.log.debug( + // `WIP: innerHandleSwarmContentMessage: running checkForExpireUpdateInContentMessage for ${envelope.id}` + // ); + const expireUpdate = await checkForExpireUpdateInContentMessage( content, conversationModelForUIUpdate ); - window.log.debug( - `WIP:innerHandleSwarmContentMessage: ${ - content.dataMessage.syncTarget ? 'This is a sync message.\n' : '' - } content: ${JSON.stringify(content)} ${ - expireUpdate ? `\n\nexpireUpdate: ${JSON.stringify(expireUpdate)}` : '' - }` - ); + // window.log.debug( + // `WIP:innerHandleSwarmContentMessage: ${ + // content.dataMessage.syncTarget ? 'This is a sync message.\n' : '' + // } content: ${JSON.stringify(content)} ${ + // expireUpdate ? `\n\nexpireUpdate: ${JSON.stringify(expireUpdate)}` : '' + // }` + // ); if (expireUpdate?.isOutdated) { // window.log.debug( diff --git a/ts/util/expiringMessages.ts b/ts/util/expiringMessages.ts index 1f1322a27..32fc7d116 100644 --- a/ts/util/expiringMessages.ts +++ b/ts/util/expiringMessages.ts @@ -403,7 +403,8 @@ export function checkIsLegacyDisappearingDataMessage( // TODO legacy messages support will be removed in a future release export async function checkForExpireUpdateInContentMessage( content: SignalService.Content, - convoToUpdate: ConversationModel + convoToUpdate: ConversationModel, + isOutgoing?: boolean ): Promise { const dataMessage = content.dataMessage as SignalService.DataMessage; // We will only support legacy disappearing messages for a short period before disappearing messages v2 is unlocked @@ -436,17 +437,26 @@ export async function checkForExpireUpdateInContentMessage( ? Number(content.lastDisappearingMessageChangeTimestamp) : undefined; + // NOTE if we are checking an outgoing content message then the conversation's lastDisappearingMessageChangeTimestamp has just been set to match the content message so it can't be outdated if equal if ( convoToUpdate.get('lastDisappearingMessageChangeTimestamp') && lastDisappearingMessageChangeTimestamp && - convoToUpdate.get('lastDisappearingMessageChangeTimestamp') >= - lastDisappearingMessageChangeTimestamp + ((isOutgoing && + convoToUpdate.get('lastDisappearingMessageChangeTimestamp') > + lastDisappearingMessageChangeTimestamp) || + (!isOutgoing && + convoToUpdate.get('lastDisappearingMessageChangeTimestamp') >= + lastDisappearingMessageChangeTimestamp)) ) { - // window.log.info( - // `WIP: checkForExpireUpdateInContentMessage() This is an outdated disappearing message setting. So we will ignore it.\ncontent: ${JSON.stringify( - // content - // )} - // ); + window.log.info( + `WIP: checkForExpireUpdateInContentMessage() This is an outdated ${ + isOutgoing ? 'outgoing' : 'incoming' + } disappearing message setting. So we will ignore it.\nconvoToUpdate.get('lastDisappearingMessageChangeTimestamp'): ${convoToUpdate.get( + 'lastDisappearingMessageChangeTimestamp' + )}\nlastDisappearingMessageChangeTimestamp: ${lastDisappearingMessageChangeTimestamp}\n\ncontent: ${JSON.stringify( + content + )}` + ); return { expirationType: changeToDisappearingMessageType(