From ff807249e149f45832b7a4b0f144c8febb7699ac Mon Sep 17 00:00:00 2001 From: ThomasSession Date: Tue, 21 Oct 2025 14:20:17 +1100 Subject: [PATCH] Forced to add back message lookup by timestamp for unsend requests --- .../libsession/database/StorageProtocol.kt | 2 ++ .../messaging/jobs/BatchMessageReceiveJob.kt | 2 +- .../ReceivedMessageHandler.kt | 6 ++--- .../securesms/database/MmsSmsDatabase.java | 23 +++++++++++++++++++ .../securesms/database/Storage.kt | 6 +++++ 5 files changed, 35 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/session/libsession/database/StorageProtocol.kt b/app/src/main/java/org/session/libsession/database/StorageProtocol.kt index 8b3dcd632e..a4171a6678 100644 --- a/app/src/main/java/org/session/libsession/database/StorageProtocol.kt +++ b/app/src/main/java/org/session/libsession/database/StorageProtocol.kt @@ -93,6 +93,8 @@ interface StorageProtocol { fun removeReceivedMessageTimestamps(timestamps: Set) fun getAttachmentsForMessage(mmsMessageId: Long): List fun getMessageBy(threadId: Long, timestamp: Long, author: String): MessageRecord? + @Deprecated("We shouldn't be querying messages by timestamp alone. Use `getMessageBy` when possible ") + fun getMessageByTimestamp(timestamp: Long, author: String, getQuote: Boolean): MessageRecord? fun updateSentTimestamp(messageId: MessageId, newTimestamp: Long) fun markAsResyncing(messageId: MessageId) fun markAsSyncing(messageId: MessageId) diff --git a/app/src/main/java/org/session/libsession/messaging/jobs/BatchMessageReceiveJob.kt b/app/src/main/java/org/session/libsession/messaging/jobs/BatchMessageReceiveJob.kt index 484a95ca64..fc1bbfac42 100644 --- a/app/src/main/java/org/session/libsession/messaging/jobs/BatchMessageReceiveJob.kt +++ b/app/src/main/java/org/session/libsession/messaging/jobs/BatchMessageReceiveJob.kt @@ -253,7 +253,7 @@ class BatchMessageReceiveJob @AssistedInject constructor( } is UnsendRequest -> { - val deletedMessage = receivedMessageHandler.handleUnsendRequest(message, threadId) + val deletedMessage = receivedMessageHandler.handleUnsendRequest(message) // If we removed a message then ensure it isn't in the 'messageIds' if (deletedMessage != null) { diff --git a/app/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt b/app/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt index 85cd48902b..3954404ac3 100644 --- a/app/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt +++ b/app/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt @@ -128,7 +128,7 @@ class ReceivedMessageHandler @Inject constructor( } } is DataExtractionNotification -> handleDataExtractionNotification(message) - is UnsendRequest -> handleUnsendRequest(message, threadId) + is UnsendRequest -> handleUnsendRequest(message) is MessageRequestResponse -> messageRequestResponseHandler.get().handleExplicitRequestResponseMessage(message) is VisibleMessage -> handleVisibleMessage( message = message, @@ -221,7 +221,7 @@ class ReceivedMessageHandler @Inject constructor( } - fun handleUnsendRequest(message: UnsendRequest, threadId: Long): MessageId? { + fun handleUnsendRequest(message: UnsendRequest): MessageId? { val userPublicKey = storage.getUserPublicKey() val userAuth = storage.userAuth ?: return null val isLegacyGroupAdmin: Boolean = message.groupPublicKey?.let { key -> @@ -244,7 +244,7 @@ class ReceivedMessageHandler @Inject constructor( val timestamp = message.timestamp ?: return null val author = message.author ?: return null - val messageToDelete = storage.getMessageBy(threadId, timestamp, author) ?: return null + val messageToDelete = storage.getMessageByTimestamp(timestamp, author, false) ?: return null val messageIdToDelete = messageToDelete.messageId val messageType = messageToDelete.individualRecipient?.getType() diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java index a87e4fb822..652b053e82 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java @@ -149,6 +149,29 @@ public MmsSmsDatabase(Context context, Provider databaseHel return null; } + /** + * @deprecated We shouldn't be querying messages by timestamp alone. Use `getMessageFor` when possible + */ + @Deprecated(forRemoval = true) + public @Nullable MessageRecord getMessageByTimestamp(long timestamp, String serializedAuthor, boolean getQuote) { + try (Cursor cursor = queryTables(PROJECTION, MmsSmsColumns.NORMALIZED_DATE_SENT + " = " + timestamp, true, null, null, null)) { + MmsSmsDatabase.Reader reader = readerFor(cursor, getQuote); + + MessageRecord messageRecord; + boolean isOwnNumber = Util.isOwnNumber(context, serializedAuthor); + + while ((messageRecord = reader.getNext()) != null) { + if ((isOwnNumber && messageRecord.isOutgoing()) || + (!isOwnNumber && messageRecord.getIndividualRecipient().getAddress().toString().equals(serializedAuthor))) + { + return messageRecord; + } + } + } + + return null; + } + @Nullable public MessageId getLastSentMessageID(long threadId) { String order = MmsSmsColumns.NORMALIZED_DATE_SENT + " DESC"; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt index d356cfb19b..652440761f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt @@ -487,6 +487,12 @@ open class Storage @Inject constructor( return database.getMessageFor(threadId, timestamp, address) } + @Deprecated("We shouldn't be querying messages by timestamp alone. Use `getMessageBy` when possible ") + override fun getMessageByTimestamp(timestamp: Long, author: String, getQuote: Boolean): MessageRecord? { + val database = mmsSmsDatabase + return database.getMessageByTimestamp(timestamp, author, getQuote) + } + override fun updateSentTimestamp( messageId: MessageId, newTimestamp: Long