From 129a22e91d134a635abd24524a282e4b7b854da8 Mon Sep 17 00:00:00 2001 From: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com> Date: Wed, 21 Aug 2024 14:48:24 -0700 Subject: [PATCH] Only increment timer version once --- .../sendDirectExpirationTimerUpdate.ts | 2 +- ts/models/conversations.ts | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/ts/jobs/helpers/sendDirectExpirationTimerUpdate.ts b/ts/jobs/helpers/sendDirectExpirationTimerUpdate.ts index 2b7411271c..ebbe8e941d 100644 --- a/ts/jobs/helpers/sendDirectExpirationTimerUpdate.ts +++ b/ts/jobs/helpers/sendDirectExpirationTimerUpdate.ts @@ -81,7 +81,7 @@ export async function sendDirectExpirationTimerUpdate( expireTimer === undefined ? undefined : DurationInSeconds.fromSeconds(expireTimer), - expireTimerVersion: await conversation.incrementAndGetExpireTimerVersion(), + expireTimerVersion: conversation.getExpireTimerVersion(), flags, profileKey, recipients: conversation.getRecipients(), diff --git a/ts/models/conversations.ts b/ts/models/conversations.ts index 7a8f04a2b2..25f837a704 100644 --- a/ts/models/conversations.ts +++ b/ts/models/conversations.ts @@ -224,6 +224,8 @@ const ATTRIBUTES_THAT_DONT_INVALIDATE_PROPS_CACHE = new Set([ 'storageUnknownFields', ]); +const MAX_EXPIRE_TIMER_VERSION = 0xffffffff; + type CachedIdenticon = { readonly color: AvatarColorType; readonly text?: string; @@ -4520,6 +4522,7 @@ export class ConversationModel extends window.Backbone log.info(`${logId}: queuing send job`); // if change wasn't made remotely, send it to the number/group try { + await this.incrementExpireTimerVersion(); await conversationJobQueue.add({ type: conversationQueueJobEnum.enum.DirectExpirationTimerUpdate, conversationId: this.id, @@ -5157,33 +5160,32 @@ export class ConversationModel extends window.Backbone getExpireTimerVersion(): number | undefined { return isDirectConversation(this.attributes) - ? this.get('expireTimerVersion') + ? Math.min(this.get('expireTimerVersion') || 0, MAX_EXPIRE_TIMER_VERSION) : undefined; } - async incrementAndGetExpireTimerVersion(): Promise { - const logId = `incrementAndGetExpireTimerVersion(${this.idForLogging()})`; + async incrementExpireTimerVersion(): Promise { + const logId = `incrementExpireTimerVersion(${this.idForLogging()})`; if (!isDirectConversation(this.attributes)) { - return undefined; + return; } const { expireTimerVersion, capabilities } = this.attributes; // This should not happen in practice, but be ready to handle - const MAX_EXPIRE_TIMER_VERSION = 0xffffffff; if (expireTimerVersion >= MAX_EXPIRE_TIMER_VERSION) { log.warn(`${logId}: expire version overflow`); - return MAX_EXPIRE_TIMER_VERSION; + return; } if (expireTimerVersion <= 2) { if (!capabilities?.versionedExpirationTimer) { log.warn(`${logId}: missing recipient capability`); - return expireTimerVersion; + return; } const me = window.ConversationController.getOurConversationOrThrow(); if (!me.get('capabilities')?.versionedExpirationTimer) { log.warn(`${logId}: missing sender capability`); - return expireTimerVersion; + return; } // Increment only if sender and receiver are both capable @@ -5194,7 +5196,6 @@ export class ConversationModel extends window.Backbone const newVersion = expireTimerVersion + 1; this.set('expireTimerVersion', newVersion); await DataWriter.updateConversation(this.attributes); - return newVersion; } // Set of items to captureChanges on: