From e3fe852a347a326ddbed8d3a439abecdc0a326e2 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 2 Feb 2024 11:49:06 -0500 Subject: [PATCH] Do not backup past revision if latest revision is soon-to-expire. --- .../securesms/backup/FullBackupExporter.java | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.java b/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.java index d8fca48c20..9aab505225 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.java @@ -160,7 +160,7 @@ public class FullBackupExporter extends FullBackupBase { for (String table : tables) { throwIfCanceled(cancellationSignal); if (table.equals(MessageTable.TABLE_NAME)) { - count = exportTable(table, input, outputStream, cursor -> isNonExpiringMessage(cursor), null, count, estimatedCount, cancellationSignal); + count = exportTable(table, input, outputStream, cursor -> isNonExpiringMessage(input, cursor), null, count, estimatedCount, cancellationSignal); } else if (table.equals(ReactionTable.TABLE_NAME)) { count = exportTable(table, input, outputStream, cursor -> isForNonExpiringMessage(input, CursorUtil.requireLong(cursor, ReactionTable.MESSAGE_ID)), null, count, estimatedCount, cancellationSignal); } else if (table.equals(MentionTable.TABLE_NAME)) { @@ -579,28 +579,38 @@ public class FullBackupExporter extends FullBackupBase { return count; } - private static boolean isNonExpiringMessage(@NonNull Cursor cursor) { - long expireStarted = CursorUtil.requireLong(cursor, MessageTable.EXPIRE_STARTED); - long expiresIn = CursorUtil.requireLong(cursor, MessageTable.EXPIRES_IN); - - if (expireStarted == 0 || expiresIn == 0) { - return true; - } + private static boolean isNonExpiringMessage(@NonNull SQLiteDatabase db, @NonNull Cursor cursor) { + long expireStarted = CursorUtil.requireLong(cursor, MessageTable.EXPIRE_STARTED); + long expiresIn = CursorUtil.requireLong(cursor, MessageTable.EXPIRES_IN); + long originalMessageId = CursorUtil.requireLong(cursor, MessageTable.ORIGINAL_MESSAGE_ID); + long latestRevisionId = CursorUtil.requireLong(cursor, MessageTable.LATEST_REVISION_ID); long expiresAt = expireStarted + expiresIn; long timeRemaining = expiresAt - System.currentTimeMillis(); - return timeRemaining > EXPIRATION_BACKUP_THRESHOLD; + if (expireStarted > 0 && timeRemaining <= EXPIRATION_BACKUP_THRESHOLD) { + return false; + } + + if (originalMessageId > 0 && !isForNonExpiringMessage(db, originalMessageId)) { + return false; + } + + if (latestRevisionId > 0 && !isForNonExpiringMessage(db, latestRevisionId)) { + return false; + } + + return true; } private static boolean isForNonExpiringMessage(@NonNull SQLiteDatabase db, long messageId) { - String[] columns = new String[] { MessageTable.EXPIRE_STARTED, MessageTable.EXPIRES_IN }; + String[] columns = new String[] { MessageTable.EXPIRE_STARTED, MessageTable.EXPIRES_IN, MessageTable.LATEST_REVISION_ID, MessageTable.ORIGINAL_MESSAGE_ID }; String where = MessageTable.ID + " = ?"; String[] args = SqlUtil.buildArgs(messageId); try (Cursor mmsCursor = db.query(MessageTable.TABLE_NAME, columns, where, args, null, null, null)) { if (mmsCursor != null && mmsCursor.moveToFirst()) { - return isNonExpiringMessage(mmsCursor); + return isNonExpiringMessage(db, mmsCursor); } }