From c1dc2e5a6cb1fe84aaf06b79b85b4fa7a4a9ec82 Mon Sep 17 00:00:00 2001 From: William Grant Date: Tue, 26 Sep 2023 15:14:59 +1000 Subject: [PATCH] fix: hit expire endpoint when send is successful we need the returned messageHash from the swarm --- ts/models/message.ts | 30 ------------------ ts/receiver/queuedJob.ts | 3 -- ts/session/sending/MessageSender.ts | 36 +++++++++++++++++++-- ts/util/expiringMessages.ts | 49 +++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 35 deletions(-) diff --git a/ts/models/message.ts b/ts/models/message.ts index dbfcbd3a7..610be597b 100644 --- a/ts/models/message.ts +++ b/ts/models/message.ts @@ -42,7 +42,6 @@ import { Data } from '../data/data'; import { OpenGroupData } from '../data/opengroups'; import { SettingsKey } from '../data/settings-key'; import { isUsAnySogsFromCache } from '../session/apis/open_group_api/sogsv3/knownBlindedkeys'; -import { expireMessageOnSnode } from '../session/apis/snode_api/expireRequest'; import { GetNetworkTime } from '../session/apis/snode_api/getNetworkTime'; import { SnodeNamespaces } from '../session/apis/snode_api/namespaces'; import { DURATION } from '../session/constants'; @@ -1179,35 +1178,6 @@ export class MessageModel extends Backbone.Model { expiresAt, sentAt: this.get('sent_at'), }); - - const messageHash = this.get('messageHash'); - if (messageHash) { - const newTTL = await expireMessageOnSnode({ - messageHash, - expireTimer: this.get('expireTimer') * 1000, - shorten: true, - }); - - if (newTTL) { - window.log.debug( - `WIP: [setToExpire] messageHash ${messageHash} has a new TTL of ${newTTL} which expires at ${new Date( - newTTL - ).toUTCString()}` - ); - this.set({ - expires_at: newTTL, - }); - if (id) { - await this.commit(); - } - } else { - window.log.warn( - `WIP: [setToExpire]\nmessageHash ${messageHash} has no new TTL.\n Keeping the old one ${expiresAt} which expires at ${new Date( - expiresAt - ).toUTCString()}` - ); - } - } } } diff --git a/ts/receiver/queuedJob.ts b/ts/receiver/queuedJob.ts index 984027b70..f17ca966c 100644 --- a/ts/receiver/queuedJob.ts +++ b/ts/receiver/queuedJob.ts @@ -262,9 +262,6 @@ async function handleRegularMessage( await sendingDeviceConversation.updateBlocksSogsMsgReqsTimestamp(updateBlockTimestamp, false); } - // Expire timer updates are now explicit. - // We don't handle an expire timer from a incoming message except if it is an ExpireTimerUpdate message. - if (type === 'incoming') { if (conversation.isPrivate()) { const incomingMessageCount = await Data.getMessageCountByType( diff --git a/ts/session/sending/MessageSender.ts b/ts/session/sending/MessageSender.ts index 7312cbfa7..ec5a642cf 100644 --- a/ts/session/sending/MessageSender.ts +++ b/ts/session/sending/MessageSender.ts @@ -37,6 +37,10 @@ import { OpenGroupVisibleMessage } from '../messages/outgoing/visibleMessage/Ope import { ed25519Str } from '../onions/onionPath'; import { PubKey } from '../types'; import { RawMessage } from '../types/RawMessage'; +import { + changeToDisappearingMessageConversationType, + updateMessageExpiryOnSwarm, +} from '../../util/expiringMessages'; // ================ SNODE STORE ================ @@ -154,9 +158,37 @@ async function send( !isEmpty(batchResult[0].body.hash) ) { const messageSendHash = batchResult[0].body.hash; - const foundMessage = await Data.getMessageById(encryptedAndWrapped.identifier); + let foundMessage = await Data.getMessageById(encryptedAndWrapped.identifier); if (foundMessage) { await foundMessage.updateMessageHash(messageSendHash); + const convo = foundMessage.getConversation(); + const expireTimer = foundMessage.get('expireTimer'); + const expirationType = foundMessage.get('expirationType'); + + if ( + convo && + expirationType && + expireTimer > 0 && + // a message has started to disappear + foundMessage.get('expirationStartTimestamp') + ) { + const expirationMode = changeToDisappearingMessageConversationType( + convo, + expirationType, + expireTimer + ); + + const canBeDeleteAfterRead = convo && !convo.isMe() && convo.isPrivate(); + + // TODO legacy messages support will be removed in a future release + if ( + canBeDeleteAfterRead && + (expirationMode === 'legacy' || expirationMode === 'deleteAfterRead') + ) { + foundMessage = await updateMessageExpiryOnSwarm(foundMessage); + } + } + await foundMessage.commit(); window?.log?.info( `updated message ${foundMessage.get('id')} with hash: ${foundMessage.get( @@ -343,7 +375,7 @@ async function encryptMessagesAndWrap( /** * Send a list of messages to a single service node. - * Used currently only for sending SharedConfigMessage to multiple messages at a time. + * Used currently only for sending SharedConfigMessage for multiple messages at a time. * * @param params the messages to deposit * @param destination the pubkey we should deposit those message for diff --git a/ts/util/expiringMessages.ts b/ts/util/expiringMessages.ts index 9210aa6e3..c7f4c4905 100644 --- a/ts/util/expiringMessages.ts +++ b/ts/util/expiringMessages.ts @@ -12,6 +12,7 @@ import { ConversationModel } from '../models/conversation'; import { MessageModel } from '../models/message'; import { GetNetworkTime } from '../session/apis/snode_api/getNetworkTime'; import { ReleasedFeatures } from './releaseFeature'; +import { expireMessageOnSnode } from '../session/apis/snode_api/expireRequest'; // NOTE this must match Content.ExpirationType in the protobuf // TODO double check this @@ -635,3 +636,51 @@ export async function checkHasOutdatedDisappearingMessageClient( await convoToUpdate.commit(); } } + +export async function updateMessageExpiryOnSwarm(message: MessageModel, shouldCommit?: boolean) { + window.log.debug(`WIP: [updateMessageExpiryOnSwarm]\nmessage: ${JSON.stringify(message)}`); + + const messageHash = message.get('messageHash'); + const expiresAt = message.get('expires_at'); + + if (!messageHash) { + window.log.debug( + `WIP: [updateMessageExpiryOnSwarm] Missing messageHash message: ${JSON.stringify(message)}` + ); + return message; + } + + const newTTL = await expireMessageOnSnode({ + messageHash, + expireTimer: message.get('expireTimer') * 1000, + shorten: true, + }); + + if (newTTL && newTTL !== expiresAt) { + message.set({ + expires_at: newTTL, + }); + + window.log.debug( + `WIP: [updateMessageExpiryOnSwarm] messageHash ${messageHash} has a new TTL of ${newTTL} which expires at ${new Date( + newTTL + ).toUTCString()}` + ); + + if (shouldCommit) { + await message.commit(); + } + } else { + window.log.warn( + `WIP: [updateMessageExpiryOnSwarm]\nmessageHash ${messageHash} has no new TTL.${ + expiresAt + ? `\nKeeping the old one ${expiresAt}which expires at ${new Date( + expiresAt + ).toUTCString()}` + : '' + }` + ); + } + + return message; +}