From f735a9cfa7981157d8330bd48f8e542f7dbc956a Mon Sep 17 00:00:00 2001 From: Evan Hahn <69474926+EvanHahn-Signal@users.noreply.github.com> Date: Fri, 5 Aug 2022 11:05:30 -0500 Subject: [PATCH] Always respect DOE from your own devices --- ts/util/deleteForEveryone.ts | 39 +++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/ts/util/deleteForEveryone.ts b/ts/util/deleteForEveryone.ts index 67782f4ed94..fb0e3b7aedd 100644 --- a/ts/util/deleteForEveryone.ts +++ b/ts/util/deleteForEveryone.ts @@ -1,25 +1,24 @@ -// Copyright 2020 Signal Messenger, LLC +// Copyright 2020-2022 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import type { DeleteModel } from '../messageModifiers/Deletes'; import type { MessageModel } from '../models/messages'; import * as log from '../logging/log'; import { DAY } from './durations'; +import { getContactId } from '../messages/helpers'; export async function deleteForEveryone( message: MessageModel, doe: DeleteModel, shouldPersist = true ): Promise { - const messageTimestamp = - message.get('serverTimestamp') || message.get('sent_at') || 0; - - // Make sure the server timestamps for the DOE and the matching message - // are less than one day apart - const delta = Math.abs(doe.get('serverTimestamp') - messageTimestamp); + if (isDeletionByMe(message, doe)) { + await message.handleDeleteForEveryone(doe, shouldPersist); + return; + } - if (delta > DAY) { - log.info('Received late DOE. Dropping.', { + if (isDeletionTooOld(message, doe)) { + log.warn('Received late DOE. Dropping.', { fromId: doe.get('fromId'), targetSentTimestamp: doe.get('targetSentTimestamp'), messageServerTimestamp: message.get('serverTimestamp'), @@ -31,3 +30,25 @@ export async function deleteForEveryone( await message.handleDeleteForEveryone(doe, shouldPersist); } + +function isDeletionByMe( + message: Readonly, + doe: Readonly +): boolean { + const ourConversationId = + window.ConversationController.getOurConversationIdOrThrow(); + return ( + getContactId(message.attributes) === ourConversationId && + doe.get('fromId') === ourConversationId + ); +} + +function isDeletionTooOld( + message: Readonly, + doe: Readonly +): boolean { + const messageTimestamp = + message.get('serverTimestamp') || message.get('sent_at') || 0; + const delta = Math.abs(doe.get('serverTimestamp') - messageTimestamp); + return delta > DAY; +}