diff --git a/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java b/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java index 69ce6a08a6..15532460f3 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,33 @@ 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); + 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 +1136,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/SessionManagementProtocol.kt b/src/org/thoughtcrime/securesms/loki/protocol/SessionManagementProtocol.kt index 4e986fcf59..073af39aff 100644 --- a/src/org/thoughtcrime/securesms/loki/protocol/SessionManagementProtocol.kt +++ b/src/org/thoughtcrime/securesms/loki/protocol/SessionManagementProtocol.kt @@ -28,7 +28,6 @@ object SessionManagementProtocol { val recipient = recipient(context, publicKey) if (recipient.isGroupRecipient) { return } val lokiThreadDB = DatabaseFactory.getLokiThreadDatabase(context) - if (lokiThreadDB.getSessionResetStatus(publicKey) != SessionResetStatus.NONE) { return } val threadID = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipient) val devices = lokiThreadDB.getSessionRestoreDevices(threadID) for (device in devices) { 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