Fix remote delete for edit messages.

This commit is contained in:
Clark
2023-06-20 10:29:47 -04:00
committed by GitHub
parent 62d5f61a0b
commit 86cd4c5c30
2 changed files with 42 additions and 2 deletions

View File

@@ -1941,6 +1941,18 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
return mmsReaderFor(cursor)
}
private fun getPreviousEditIds(id: Long): List<Long> {
return readableDatabase
.select(ID)
.from(TABLE_NAME)
.where("$LATEST_REVISION_ID = ?", id)
.orderBy("$DATE_SENT ASC")
.run()
.readToList {
it.requireLong(ID)
}
}
private fun updateMailboxBitmask(id: Long, maskOff: Long, maskOn: Long, threadId: Optional<Long>) {
writableDatabase.withinTransaction { db ->
db.execSQL(
@@ -2011,7 +2023,33 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
ApplicationDependencies.getDatabaseObserver().notifyConversationListListeners()
}
fun markAsRemoteDelete(targetMessage: MessageRecord) {
writableDatabase.withinTransaction { db ->
if (targetMessage.isEditMessage) {
val latestRevisionId = (targetMessage as? MediaMmsMessageRecord)?.latestRevisionId?.id ?: targetMessage.id
markAsRemoteDeleteInternal(latestRevisionId)
getPreviousEditIds(latestRevisionId).map { id ->
db.update(TABLE_NAME)
.values(
ORIGINAL_MESSAGE_ID to null,
LATEST_REVISION_ID to null
)
.where("$ID = ?", id)
.run()
deleteMessage(id)
}
} else {
markAsRemoteDeleteInternal(targetMessage.id)
}
}
}
fun markAsRemoteDelete(messageId: Long) {
val targetMessage: MessageRecord = getMessageRecord(messageId)
markAsRemoteDelete(targetMessage)
}
private fun markAsRemoteDeleteInternal(messageId: Long) {
var deletedAttachments = false
writableDatabase.withinTransaction { db ->
db.update(TABLE_NAME)
@@ -2023,7 +2061,9 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
QUOTE_TYPE to null,
QUOTE_ID to null,
LINK_PREVIEWS to null,
SHARED_CONTACTS to null
SHARED_CONTACTS to null,
ORIGINAL_MESSAGE_ID to null,
LATEST_REVISION_ID to null
)
.where("$ID = ?", messageId)
.run()

View File

@@ -522,7 +522,7 @@ object DataMessageProcessor {
val targetMessage: MessageRecord? = SignalDatabase.messages.getMessageFor(targetSentTimestamp, senderRecipientId)
return if (targetMessage != null && MessageConstraintsUtil.isValidRemoteDeleteReceive(targetMessage, senderRecipientId, envelope.serverTimestamp)) {
SignalDatabase.messages.markAsRemoteDelete(targetMessage.id)
SignalDatabase.messages.markAsRemoteDelete(targetMessage)
if (targetMessage.isStory()) {
SignalDatabase.messages.deleteRemotelyDeletedStory(targetMessage.id)
}