From a0c903a3d3385df4913d2e4cf8bbe68adffbfc8a Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Fri, 4 Sep 2020 09:06:18 +1000 Subject: [PATCH] Clean up error handling --- .../securesms/jobs/PushDecryptJob.java | 28 ++++++++++++------- .../loki/protocol/SessionMetaProtocol.kt | 4 +-- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java b/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java index 69ce6a08a6..607a6597d6 100644 --- a/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java +++ b/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java @@ -1085,7 +1085,7 @@ public class PushDecryptJob extends BaseJob implements InjectableType { @NonNull Optional smsMessageId, @NonNull Throwable e) { SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); - if (SessionMetaProtocol.shouldErrorMessageShow(context, timestamp)) { + if (!SessionMetaProtocol.shouldIgnoreDecryptionException(context, timestamp)) { if (!smsMessageId.isPresent()) { Optional insertResult = insertPlaceholder(sender, senderDevice, timestamp); @@ -1098,29 +1098,35 @@ public class PushDecryptJob extends BaseJob implements InjectableType { } } - // FIXME: This is a temporary patch for bad mac issues. At least with this people will be able to message again. We have to figure out the root cause of the issue though. + if (canRecoverAutomatically(e)) { + SessionManagementProtocol.startSessionReset(context, sender); + } else { + SessionManagementProtocol.triggerSessionRestorationUI(context, sender, timestamp); + } + } + + private boolean canRecoverAutomatically(Throwable e) { + // Corrupt message exception if (e.getCause() != null) { Throwable e2 = e.getCause(); if (e2.getCause() != null) { Throwable e3 = e2.getCause(); if (e3 instanceof InvalidMessageException) { String message = e3.getMessage(); - if (message != null && message.startsWith("Bad Mac!")) { - SessionManagementProtocol.startSessionReset(context, sender); - return; // Don't trigger the session restoration UI - } + return (message != null && message.startsWith("Bad Mac!")); } } } - - SessionManagementProtocol.triggerSessionRestorationUI(context, sender, timestamp); + // Invalid metadata exception + // TODO + return false; } private void handleNoSessionMessage(@NonNull String sender, int senderDevice, long timestamp, @NonNull Optional smsMessageId) { SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); - if (SessionMetaProtocol.shouldErrorMessageShow(context, timestamp)) { + if (!SessionMetaProtocol.shouldIgnoreDecryptionException(context, timestamp)) { if (!smsMessageId.isPresent()) { Optional insertResult = insertPlaceholder(sender, senderDevice, timestamp); @@ -1132,7 +1138,9 @@ public class PushDecryptJob extends BaseJob implements InjectableType { smsDatabase.markAsNoSession(smsMessageId.get()); } } - SessionManagementProtocol.triggerSessionRestorationUI(context, sender, timestamp); + + // Attempt to recover automatically + ApplicationContext.getInstance(context).sendSessionRequestIfNeeded(sender); } private void handleLegacyMessage(@NonNull String sender, int senderDevice, long timestamp, diff --git a/src/org/thoughtcrime/securesms/loki/protocol/SessionMetaProtocol.kt b/src/org/thoughtcrime/securesms/loki/protocol/SessionMetaProtocol.kt index c3322f9a08..a7acaa25fe 100644 --- a/src/org/thoughtcrime/securesms/loki/protocol/SessionMetaProtocol.kt +++ b/src/org/thoughtcrime/securesms/loki/protocol/SessionMetaProtocol.kt @@ -30,9 +30,9 @@ object SessionMetaProtocol { } @JvmStatic - fun shouldErrorMessageShow(context: Context, timestamp: Long): Boolean { + fun shouldIgnoreDecryptionException(context: Context, timestamp: Long): Boolean { val restorationTimestamp = TextSecurePreferences.getRestorationTime(context) - return timestamp > restorationTimestamp + return timestamp <= restorationTimestamp } @JvmStatic