From 71f54701d2673de8298a1c44c5263503a8a89a54 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 19 Jun 2020 07:17:23 -0700 Subject: [PATCH] Add additional safeguards around disappearing messages. --- .../securesms/backup/FullBackupExporter.java | 12 +++++++++--- .../thoughtcrime/securesms/database/MmsDatabase.java | 4 +++- .../thoughtcrime/securesms/database/SmsDatabase.java | 4 +++- 3 files changed, 15 insertions(+), 5 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 b7f7189f8d..594232b299 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.java @@ -30,6 +30,7 @@ import org.thoughtcrime.securesms.database.OneTimePreKeyDatabase; import org.thoughtcrime.securesms.database.SearchDatabase; import org.thoughtcrime.securesms.database.SessionDatabase; import org.thoughtcrime.securesms.database.SignedPreKeyDatabase; +import org.thoughtcrime.securesms.database.SmsDatabase; import org.thoughtcrime.securesms.database.StickerDatabase; import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.profiles.AvatarHelper; @@ -40,7 +41,6 @@ import org.whispersystems.libsignal.kdf.HKDFv3; import org.whispersystems.libsignal.util.ByteUtil; import java.io.File; -import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -96,7 +96,9 @@ public class FullBackupExporter extends FullBackupBase { for (String table : tables) { if (table.equals(MmsDatabase.TABLE_NAME)) { - count = exportTable(table, input, outputStream, FullBackupExporter::isNonExpiringMessage, null, count); + count = exportTable(table, input, outputStream, FullBackupExporter::isNonExpiringMmsMessage, null, count); + } else if (table.equals(SmsDatabase.TABLE_NAME)) { + count = exportTable(table, input, outputStream, FullBackupExporter::isNonExpiringSmsMessage, null, count); } else if (table.equals(GroupReceiptDatabase.TABLE_NAME)) { count = exportTable(table, input, outputStream, cursor -> isForNonExpiringMessage(input, cursor.getLong(cursor.getColumnIndexOrThrow(GroupReceiptDatabase.MMS_ID))), null, count); } else if (table.equals(AttachmentDatabase.TABLE_NAME)) { @@ -283,11 +285,15 @@ public class FullBackupExporter extends FullBackupBase { return result; } - private static boolean isNonExpiringMessage(@NonNull Cursor cursor) { + private static boolean isNonExpiringMmsMessage(@NonNull Cursor cursor) { return cursor.getInt(cursor.getColumnIndexOrThrow(MmsSmsColumns.EXPIRES_IN)) <= 0 && cursor.getInt(cursor.getColumnIndexOrThrow(MmsDatabase.VIEW_ONCE)) <= 0; } + private static boolean isNonExpiringSmsMessage(@NonNull Cursor cursor) { + return cursor.getInt(cursor.getColumnIndexOrThrow(MmsSmsColumns.EXPIRES_IN)) <= 0; + } + private static boolean isForNonExpiringMessage(@NonNull SQLiteDatabase db, long mmsId) { String[] columns = new String[] { MmsDatabase.EXPIRES_IN, MmsDatabase.VIEW_ONCE}; String where = MmsDatabase.ID + " = ?"; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java index e583740f6a..cbc675124f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java @@ -599,11 +599,13 @@ public class MmsDatabase extends MessagingDatabase { db.beginTransaction(); try { + String query = ID + " = ? AND (" + EXPIRE_STARTED + " = 0 OR " + EXPIRE_STARTED + " > ?)"; + for (long id : ids) { ContentValues contentValues = new ContentValues(); contentValues.put(EXPIRE_STARTED, startedAtTimestamp); - db.update(TABLE_NAME, contentValues, ID_WHERE, new String[]{String.valueOf(id)}); + db.update(TABLE_NAME, contentValues, query, new String[]{String.valueOf(id), String.valueOf(startedAtTimestamp)}); if (threadId < 0) { threadId = getThreadIdForMessage(id); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java index 3a47a65fb1..ed21b2a574 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java @@ -366,11 +366,13 @@ public class SmsDatabase extends MessagingDatabase { db.beginTransaction(); try { + String query = ID + " = ? AND (" + EXPIRE_STARTED + " = 0 OR " + EXPIRE_STARTED + " > ?)"; + for (long id : ids) { ContentValues contentValues = new ContentValues(); contentValues.put(EXPIRE_STARTED, startedAtTimestamp); - db.update(TABLE_NAME, contentValues, ID_WHERE, new String[]{String.valueOf(id)}); + db.update(TABLE_NAME, contentValues, query, new String[]{String.valueOf(id), String.valueOf(startedAtTimestamp)}); if (threadId < 0) { threadId = getThreadIdForMessage(id);