mirror of
https://github.com/oxen-io/session-android.git
synced 2024-11-27 12:05:22 +00:00
Merge pull request #321 from loki-project/error-handling
Improved Error Handling
This commit is contained in:
commit
583c5a1d25
@ -1085,7 +1085,7 @@ public class PushDecryptJob extends BaseJob implements InjectableType {
|
|||||||
@NonNull Optional<Long> smsMessageId, @NonNull Throwable e)
|
@NonNull Optional<Long> smsMessageId, @NonNull Throwable e)
|
||||||
{
|
{
|
||||||
SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context);
|
SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context);
|
||||||
if (SessionMetaProtocol.shouldErrorMessageShow(context, timestamp)) {
|
if (!SessionMetaProtocol.shouldIgnoreDecryptionException(context, timestamp)) {
|
||||||
if (!smsMessageId.isPresent()) {
|
if (!smsMessageId.isPresent()) {
|
||||||
Optional<InsertResult> insertResult = insertPlaceholder(sender, senderDevice, timestamp);
|
Optional<InsertResult> 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) {
|
if (e.getCause() != null) {
|
||||||
Throwable e2 = e.getCause();
|
Throwable e2 = e.getCause();
|
||||||
if (e2.getCause() != null) {
|
if (e2.getCause() != null) {
|
||||||
Throwable e3 = e2.getCause();
|
Throwable e3 = e2.getCause();
|
||||||
if (e3 instanceof InvalidMessageException) {
|
if (e3 instanceof InvalidMessageException) {
|
||||||
String message = e3.getMessage();
|
String message = e3.getMessage();
|
||||||
if (message != null && message.startsWith("Bad Mac!")) {
|
return (message != null && message.startsWith("Bad Mac!"));
|
||||||
SessionManagementProtocol.startSessionReset(context, sender);
|
|
||||||
return; // Don't trigger the session restoration UI
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
SessionManagementProtocol.triggerSessionRestorationUI(context, sender, timestamp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleNoSessionMessage(@NonNull String sender, int senderDevice, long timestamp,
|
private void handleNoSessionMessage(@NonNull String sender, int senderDevice, long timestamp,
|
||||||
@NonNull Optional<Long> smsMessageId)
|
@NonNull Optional<Long> smsMessageId)
|
||||||
{
|
{
|
||||||
SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context);
|
SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context);
|
||||||
if (SessionMetaProtocol.shouldErrorMessageShow(context, timestamp)) {
|
if (!SessionMetaProtocol.shouldIgnoreDecryptionException(context, timestamp)) {
|
||||||
if (!smsMessageId.isPresent()) {
|
if (!smsMessageId.isPresent()) {
|
||||||
Optional<InsertResult> insertResult = insertPlaceholder(sender, senderDevice, timestamp);
|
Optional<InsertResult> insertResult = insertPlaceholder(sender, senderDevice, timestamp);
|
||||||
|
|
||||||
@ -1132,7 +1136,9 @@ public class PushDecryptJob extends BaseJob implements InjectableType {
|
|||||||
smsDatabase.markAsNoSession(smsMessageId.get());
|
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,
|
private void handleLegacyMessage(@NonNull String sender, int senderDevice, long timestamp,
|
||||||
|
@ -28,7 +28,6 @@ object SessionManagementProtocol {
|
|||||||
val recipient = recipient(context, publicKey)
|
val recipient = recipient(context, publicKey)
|
||||||
if (recipient.isGroupRecipient) { return }
|
if (recipient.isGroupRecipient) { return }
|
||||||
val lokiThreadDB = DatabaseFactory.getLokiThreadDatabase(context)
|
val lokiThreadDB = DatabaseFactory.getLokiThreadDatabase(context)
|
||||||
if (lokiThreadDB.getSessionResetStatus(publicKey) != SessionResetStatus.NONE) { return }
|
|
||||||
val threadID = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipient)
|
val threadID = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipient)
|
||||||
val devices = lokiThreadDB.getSessionRestoreDevices(threadID)
|
val devices = lokiThreadDB.getSessionRestoreDevices(threadID)
|
||||||
for (device in devices) {
|
for (device in devices) {
|
||||||
|
@ -30,9 +30,9 @@ object SessionMetaProtocol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun shouldErrorMessageShow(context: Context, timestamp: Long): Boolean {
|
fun shouldIgnoreDecryptionException(context: Context, timestamp: Long): Boolean {
|
||||||
val restorationTimestamp = TextSecurePreferences.getRestorationTime(context)
|
val restorationTimestamp = TextSecurePreferences.getRestorationTime(context)
|
||||||
return timestamp > restorationTimestamp
|
return timestamp <= restorationTimestamp
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
|
Loading…
Reference in New Issue
Block a user