From 733ab06e709747f5de7a0d296be3a654dcac46ea Mon Sep 17 00:00:00 2001 From: Mikunj Date: Fri, 22 Nov 2019 09:35:15 +1100 Subject: [PATCH] Clear database on unpair. --- .../securesms/ApplicationContext.java | 13 ++++++++++- .../securesms/jobs/PushDecryptJob.java | 2 +- .../securesms/loki/MultiDeviceUtilities.kt | 11 ++++++---- .../securesms/util/TextSecurePreferences.java | 22 +++++++++++++++++++ 4 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/org/thoughtcrime/securesms/ApplicationContext.java b/src/org/thoughtcrime/securesms/ApplicationContext.java index bfa719a853..716d66a865 100644 --- a/src/org/thoughtcrime/securesms/ApplicationContext.java +++ b/src/org/thoughtcrime/securesms/ApplicationContext.java @@ -70,6 +70,7 @@ import org.thoughtcrime.securesms.loki.LokiAPIDatabase; import org.thoughtcrime.securesms.loki.LokiPublicChatManager; import org.thoughtcrime.securesms.loki.LokiRSSFeedPoller; import org.thoughtcrime.securesms.loki.LokiUserDatabase; +import org.thoughtcrime.securesms.loki.MultiDeviceUtilities; import org.thoughtcrime.securesms.notifications.MessageNotifier; import org.thoughtcrime.securesms.notifications.NotificationChannels; import org.thoughtcrime.securesms.providers.BlobProvider; @@ -202,6 +203,9 @@ public class ApplicationContext extends MultiDexApplication implements Dependenc // Loki - Update device mappings if (setUpStorageAPIIfNeeded()) { LokiStorageAPI.Companion.getShared().updateUserDeviceMappings(); + if (TextSecurePreferences.needsRevocationCheck(this)) { + checkNeedsRevocation(); + } } } @@ -595,13 +599,20 @@ public class ApplicationContext extends MultiDexApplication implements Dependenc } // endregion + public void checkNeedsRevocation() { + MultiDeviceUtilities.checkForRevocation(this); + } + public void checkNeedsDatabaseReset() { if (TextSecurePreferences.resetDatabase(this)) { - PreferenceManager.getDefaultSharedPreferences(this).edit().clear().commit(); + boolean wasUnlinked = TextSecurePreferences.databaseResetFromUnpair(this); + TextSecurePreferences.clearAll(this); MasterSecretUtil.clear(this); if (this.deleteDatabase("signal.db")) { Log.d("Loki", "Deleted database"); } + // Loki - Re-set the preference so we can use it in the starting screen to determine whether device was unlinked or not + TextSecurePreferences.setDatabaseResetFromUnpair(this, wasUnlinked); } } diff --git a/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java b/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java index 8888927b0b..419b7b7c97 100644 --- a/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java +++ b/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java @@ -331,7 +331,7 @@ public class PushDecryptJob extends BaseJob implements InjectableType { SignalServiceDataMessage message = content.getDataMessage().get(); boolean isMediaMessage = message.getAttachments().isPresent() || message.getQuote().isPresent() || message.getSharedContacts().isPresent() || message.getPreviews().isPresent() || message.getSticker().isPresent(); - if (message.isUnpairingRequest()) { + if (!envelope.isFriendRequest() && message.isUnpairingRequest()) { // Make sure we got the request from our primary device String ourPrimaryDevice = TextSecurePreferences.getMasterHexEncodedPublicKey(context); if (ourPrimaryDevice != null && ourPrimaryDevice.equals(content.getSender())) { diff --git a/src/org/thoughtcrime/securesms/loki/MultiDeviceUtilities.kt b/src/org/thoughtcrime/securesms/loki/MultiDeviceUtilities.kt index aae9a72a15..9b35ffe88b 100644 --- a/src/org/thoughtcrime/securesms/loki/MultiDeviceUtilities.kt +++ b/src/org/thoughtcrime/securesms/loki/MultiDeviceUtilities.kt @@ -8,6 +8,7 @@ import nl.komponents.kovenant.functional.bind import nl.komponents.kovenant.functional.map import nl.komponents.kovenant.then import nl.komponents.kovenant.toFailVoid +import nl.komponents.kovenant.ui.successUi import org.thoughtcrime.securesms.ApplicationContext import org.thoughtcrime.securesms.crypto.IdentityKeyUtil import org.thoughtcrime.securesms.database.Address @@ -35,13 +36,15 @@ fun checkForRevocation(context: Context) { LokiStorageAPI.shared.fetchDeviceMappings(primaryDevice).bind { mappings -> val ourMapping = mappings.find { it.secondaryDevicePublicKey == ourDevice } if (ourMapping != null) throw Error("Device has not been revoked") - // remove pairing auths for our device + // remove pairing authorisations for our device DatabaseFactory.getLokiAPIDatabase(context).removePairingAuthorisations(ourDevice) LokiStorageAPI.shared.updateUserDeviceMappings() - }.success { - // TODO: Revoke here + }.successUi { + TextSecurePreferences.setNeedsRevocationCheck(context, false) + ApplicationContext.getInstance(context).clearData() }.fail { error -> - Log.d("Loki", "Revocation check failed: $error") + TextSecurePreferences.setNeedsRevocationCheck(context, true) + Log.d("Loki", "Revocation check failed: ${error.message ?: error}") } } diff --git a/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java b/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java index c3c77a3b1f..c6025a3ec7 100644 --- a/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java +++ b/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java @@ -1187,11 +1187,33 @@ public class TextSecurePreferences { } public static void setResetDatabase(Context context, boolean resetDatabase) { + // We do it this way so that it gets persisted in storage straight away PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean("database_reset", resetDatabase).commit(); } public static boolean resetDatabase(Context context) { return getBooleanPreference(context, "database_reset", false); } + + public static void setDatabaseResetFromUnpair(Context context, boolean value) { + // We do it this way so that it gets persisted in storage straight away + PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean("database_reset_unpair", value).commit(); + } + + public static boolean databaseResetFromUnpair(Context context) { + return getBooleanPreference(context, "database_reset_unpair", false); + } + + public static void setNeedsRevocationCheck(Context context, boolean needsCheck) { + setBooleanPreference(context, "needs_revocation", needsCheck); + } + + public static boolean needsRevocationCheck(Context context) { + return getBooleanPreference(context, "needs_revocation", false); + } // endregion + + public static void clearAll(Context context) { + PreferenceManager.getDefaultSharedPreferences(context).edit().clear().commit(); + } }