From b4fc33c8fae4ca4369509bea8e99c76b2d4e3963 Mon Sep 17 00:00:00 2001 From: William Grant Date: Mon, 3 Apr 2023 14:09:05 +0200 Subject: [PATCH] fix: prevent duplicate expire timer updates while keeping backwards compatibility --- ts/models/conversation.ts | 11 +++++++++++ ts/models/message.ts | 12 +++++++++++- ts/receiver/dataMessage.ts | 5 ----- ts/receiver/queuedJob.ts | 39 +++++++++++++++++++------------------- 4 files changed, 42 insertions(+), 25 deletions(-) diff --git a/ts/models/conversation.ts b/ts/models/conversation.ts index 5eae49ccb..47f9d4aaa 100644 --- a/ts/models/conversation.ts +++ b/ts/models/conversation.ts @@ -1053,6 +1053,17 @@ export class ConversationModel extends Backbone.Model { expireTimer = 0; } + // TODO does this actually work? + if ( + isEqual(expirationType, this.get('expirationType')) && + isEqual(expireTimer, this.get('expireTimer')) + ) { + window.log.info( + 'WIP: Dropping ExpireTimerUpdate message as we already have the same one set.' + ); + return; + } + const isOutgoing = Boolean(!receivedAt); source = source || UserUtils.getOurPubKeyStrFromCache(); diff --git a/ts/models/message.ts b/ts/models/message.ts index ff7c397ba..3ff611fa3 100644 --- a/ts/models/message.ts +++ b/ts/models/message.ts @@ -247,8 +247,18 @@ export class MessageModel extends Backbone.Model { return window.i18n('mediaMessage'); } if (this.isExpirationTimerUpdate()) { + // Backwards compatibility for Disappearing Messages in old clients const expireTimerUpdate = this.get('expirationTimerUpdate'); - if (!expireTimerUpdate || !expireTimerUpdate.expireTimer) { + const expirationType = this.get('expirationType'); + const expireTimer = this.get('expireTimer'); + if ( + !expireTimerUpdate || + expireTimerUpdate.expirationType === 'off' || + !expireTimerUpdate.expireTimer || + expirationType === 'off' || + !expireTimer || + expireTimer === 0 + ) { return window.i18n('disappearingMessagesDisabled'); } diff --git a/ts/receiver/dataMessage.ts b/ts/receiver/dataMessage.ts index 8100bba82..40cd43780 100644 --- a/ts/receiver/dataMessage.ts +++ b/ts/receiver/dataMessage.ts @@ -253,11 +253,6 @@ export async function handleSwarmDataMessage( msgModel.get('sent_at') ); msgModel.set('expirationStartTimestamp', expirationStartTimestamp); - console.log( - `WIP: handleSwarmDataMessage msgModel expirationStartTimestamp`, - msgModel.get('expirationStartTimestamp'), - msgModel.get('sent_at') - ); } } diff --git a/ts/receiver/queuedJob.ts b/ts/receiver/queuedJob.ts index c3b40594a..d6d666e32 100644 --- a/ts/receiver/queuedJob.ts +++ b/ts/receiver/queuedJob.ts @@ -226,8 +226,6 @@ async function handleRegularMessage( } handleLinkPreviews(rawDataMessage.body, rawDataMessage.preview, message); - const existingExpireTimer = conversation.get('expireTimer'); - message.set({ flags: rawDataMessage.flags, // quote: rawDataMessage.quote, // do not do this copy here, it must be done only in copyFromQuotedMessage() @@ -238,10 +236,6 @@ async function handleRegularMessage( errors: [], }); - if (existingExpireTimer) { - message.set({ expireTimer: existingExpireTimer }); - } - const ourIdInThisConversation = getUsBlindedInThatServer(conversation.id) || UserUtils.getOurPubKeyStrFromCache(); @@ -322,12 +316,6 @@ async function handleExpirationTimerUpdateNoCommit( } message.set({ - expirationTimerUpdate: { - source, - expirationType: expirationType !== 'off' ? expirationType : null, - expireTimer, - lastDisappearingMessageChangeTimestamp: providedChangeTimestamp, - }, unread: 0, // mark the message as read. }); @@ -361,20 +349,32 @@ export async function handleMessageJob( ConversationTypeEnum.PRIVATE ); try { - console.log(`WIP: handleMessageJob expireUpdate`, expireUpdate, regularDataMessage); messageModel.set({ flags: regularDataMessage.flags }); - // TODO remove 2 weeks after release + if (messageModel.isExpirationTimerUpdate()) { - console.log(`WIP: isExpirationTimerUpdate`, messageModel); // TODO account for lastDisappearingMessageChangeTimestamp - const { expireTimer: oldExpireTimer } = regularDataMessage; - const expirationType = expireUpdate.expirationType; - const expireTimer = expireUpdate.expireTimer || oldExpireTimer; + + // TODO in the future we will remove the dataMessage expireTimer and the expirationTimerUpdate + let expirationType = expireUpdate.expirationType; + let expireTimer = expireUpdate.expireTimer; + + if (!expirationType) { + expirationType = conversation.isPrivate() ? 'deleteAfterRead' : 'deleteAfterSend'; + } + + // Backwards compatibility for Disappearing Messages in old clients + if (regularDataMessage.expireTimer) { + const expirationTimerUpdate = messageModel.get('expirationTimerUpdate'); + if (!isEmpty(expirationTimerUpdate)) { + expirationType = expirationTimerUpdate?.expirationType; + expireTimer = expirationTimerUpdate?.expireTimer; + } + } // TODO compare types and change timestamps const oldTypeValue = conversation.get('expirationType'); const oldTimerValue = conversation.get('expireTimer'); - if (isEqual(expirationType, oldTypeValue) && expireTimer === oldTimerValue) { + if (isEqual(expirationType, oldTypeValue) && isEqual(expireTimer, oldTimerValue)) { confirm?.(); window?.log?.info( 'WIP: Dropping ExpireTimerUpdate message as we already have the same one set.' @@ -390,6 +390,7 @@ export async function handleMessageJob( expireTimer ); } else { + // NOTE this is a disappearing message NOT a expiration timer update if (!isEmpty(expireUpdate)) { messageModel.set({ expirationType: expireUpdate.expirationType,