From fcd7bf7e47108ab4d08f75ef35aba851344c8d81 Mon Sep 17 00:00:00 2001 From: automated-signal <37887102+automated-signal@users.noreply.github.com> Date: Tue, 10 Sep 2024 16:47:42 -0500 Subject: [PATCH] Drop messages earlier in backup import Co-authored-by: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com> --- ts/services/backups/import.ts | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/ts/services/backups/import.ts b/ts/services/backups/import.ts index 11480c9dec..7f47817ddb 100644 --- a/ts/services/backups/import.ts +++ b/ts/services/backups/import.ts @@ -54,6 +54,7 @@ import type { import { assertDev, strictAssert } from '../../util/assert'; import { getTimestampFromLong } from '../../util/timestampLongUtils'; import { DurationInSeconds, SECOND } from '../../util/durations'; +import { calculateExpirationTimestamp } from '../../util/expirationTimer'; import { dropNull } from '../../util/dropNull'; import { deriveGroupID, @@ -247,6 +248,7 @@ function addressToContactAddressType( } export class BackupImportStream extends Writable { + private now = Date.now(); private parsedBackupInfo = false; private logId = 'BackupImportStream(unknown)'; private aboutMe: AboutMe | undefined; @@ -784,7 +786,7 @@ export class BackupImportStream extends Writable { if (contact.notRegistered) { const timestamp = - contact.notRegistered.unregisteredTimestamp?.toNumber() ?? Date.now(); + contact.notRegistered.unregisteredTimestamp?.toNumber() ?? this.now; attrs.discoveredUnregisteredAt = timestamp; attrs.firstUnregisteredAt = timestamp; } else { @@ -1189,6 +1191,25 @@ export class BackupImportStream extends Writable { chatConvo.unreadCount = (chatConvo.unreadCount ?? 0) + 1; } + const expirationStartTimestamp = + item.expireStartDate && !item.expireStartDate.isZero() + ? getTimestampFromLong(item.expireStartDate) + : undefined; + const expireTimer = + item.expiresInMs && !item.expiresInMs.isZero() + ? DurationInSeconds.fromMillis(item.expiresInMs.toNumber()) + : undefined; + + const expirationTimestamp = calculateExpirationTimestamp({ + expireTimer, + expirationStartTimestamp, + }); + + if (expirationTimestamp != null && expirationTimestamp < this.now) { + // Drop expired messages + return; + } + let attributes: MessageAttributesType = { id: generateUuid(), conversationId: chatConvo.id, @@ -1198,14 +1219,8 @@ export class BackupImportStream extends Writable { sourceServiceId: authorConvo?.serviceId, timestamp, type: item.outgoing != null ? 'outgoing' : 'incoming', - expirationStartTimestamp: - item.expireStartDate && !item.expireStartDate.isZero() - ? getTimestampFromLong(item.expireStartDate) - : undefined, - expireTimer: - item.expiresInMs && !item.expiresInMs.isZero() - ? DurationInSeconds.fromMillis(item.expiresInMs.toNumber()) - : undefined, + expirationStartTimestamp, + expireTimer, sms: item.sms === true ? true : undefined, ...directionDetails, }; @@ -1407,7 +1422,7 @@ export class BackupImportStream extends Writable { }; } if (incoming) { - const receivedAtMs = incoming.dateReceived?.toNumber() ?? Date.now(); + const receivedAtMs = incoming.dateReceived?.toNumber() ?? this.now; const unidentifiedDeliveryReceived = incoming.sealedSender === true;