From 9e0a984297500c9c53f848fd577ca18664e2c9b5 Mon Sep 17 00:00:00 2001
From: Audric Ackermann <audric@loki.network>
Date: Wed, 20 Dec 2023 13:30:52 +1100
Subject: [PATCH] fix: make DataExtractionNotification msg stay in swarm for
 14d

---
 ts/models/conversation.ts                 |  1 +
 ts/receiver/contentMessage.ts             | 38 +++++++++++++++++------
 ts/session/disappearing_messages/index.ts |  1 +
 3 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/ts/models/conversation.ts b/ts/models/conversation.ts
index 087d2c2d5..54f4faf93 100644
--- a/ts/models/conversation.ts
+++ b/ts/models/conversation.ts
@@ -1113,6 +1113,7 @@ export class ConversationModel extends Backbone.Model<ConversationAttributes> {
     }
 
     const toBeAddedAttributes: MessageAttributesOptionals = {
+      unread: READ_MESSAGE_STATE.unread, // an incoming is by default unread, unless  messageAttributes or markAttributesAsReadIfNeeded marks it as read
       ...messageAttributes,
       conversationId: this.id,
       type: 'incoming',
diff --git a/ts/receiver/contentMessage.ts b/ts/receiver/contentMessage.ts
index 50d83658f..51e1406f1 100644
--- a/ts/receiver/contentMessage.ts
+++ b/ts/receiver/contentMessage.ts
@@ -15,6 +15,7 @@ import {
 } from '../interactions/conversations/unsendingInteractions';
 import { CONVERSATION_PRIORITIES, ConversationTypeEnum } from '../models/conversationAttributes';
 import { findCachedBlindedMatchOrLookupOnAllServers } from '../session/apis/open_group_api/sogsv3/knownBlindedkeys';
+import { GetNetworkTime } from '../session/apis/snode_api/getNetworkTime';
 import { getConversationController } from '../session/conversations';
 import { concatUInt8Array, getSodiumRenderer } from '../session/crypto';
 import { removeMessagePadding } from '../session/crypto/BufferPadding';
@@ -556,11 +557,19 @@ export async function innerHandleSwarmContentMessage({
         senderConversationModel.getExpirationMode()
       );
 
-      await handleDataExtractionNotification(
+      await handleDataExtractionNotification({
         envelope,
-        content.dataExtractionNotification as SignalService.DataExtractionNotification,
-        { expirationTimer, expirationType, messageExpirationFromRetrieve }
-      );
+        dataExtractionNotification: content.dataExtractionNotification as SignalService.DataExtractionNotification,
+        expireUpdate: {
+          expirationTimer,
+          expirationType,
+          messageExpirationFromRetrieve:
+            expirationType === 'unknown'
+              ? null
+              : GetNetworkTime.getNowWithNetworkOffset() + expirationTimer * 1000,
+        },
+        messageHash,
+      });
       perfEnd(
         `handleDataExtractionNotification-${envelope.id}`,
         'handleDataExtractionNotification'
@@ -844,13 +853,20 @@ async function handleMessageRequestResponse(
  *
  * We drop them if the convo is not a 1o1 conversation.
  */
-export async function handleDataExtractionNotification(
-  envelope: EnvelopePlus,
-  dataNotificationMessage: SignalService.DataExtractionNotification,
-  expireUpdate: ReadyToDisappearMsgUpdate
-): Promise<void> {
+
+export async function handleDataExtractionNotification({
+  envelope,
+  expireUpdate,
+  messageHash,
+  dataExtractionNotification,
+}: {
+  envelope: EnvelopePlus;
+  dataExtractionNotification: SignalService.DataExtractionNotification;
+  expireUpdate: ReadyToDisappearMsgUpdate;
+  messageHash: string;
+}): Promise<void> {
   // we currently don't care about the timestamp included in the field itself, just the timestamp of the envelope
-  const { type, timestamp: referencedAttachment } = dataNotificationMessage;
+  const { type, timestamp: referencedAttachment } = dataExtractionNotification;
 
   const { source, timestamp } = envelope;
   await removeFromCache(envelope);
@@ -873,6 +889,7 @@ export async function handleDataExtractionNotification(
 
   let created = await convo.addSingleIncomingMessage({
     source,
+    messageHash,
     sent_at: envelopeTimestamp,
     dataExtractionNotification: {
       type,
@@ -888,5 +905,6 @@ export async function handleDataExtractionNotification(
     expireUpdate || undefined
   );
   await created.commit();
+  await convo.commit();
   convo.updateLastMessage();
 }
diff --git a/ts/session/disappearing_messages/index.ts b/ts/session/disappearing_messages/index.ts
index 3ae068867..6fea2f4b9 100644
--- a/ts/session/disappearing_messages/index.ts
+++ b/ts/session/disappearing_messages/index.ts
@@ -509,6 +509,7 @@ function getMessageReadyToDisappear(
     messageExpirationFromRetrieve &&
     messageExpirationFromRetrieve > 0
   ) {
+
     const expirationStartTimestamp = messageExpirationFromRetrieve - expireTimer * 1000;
     const expires_at = messageExpirationFromRetrieve;
     messageModel.set({