From 8c6b60aa08ccf8930de4133df2991ef24ac26847 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Thu, 5 Mar 2020 16:14:14 +1100 Subject: [PATCH] Clean & handle media message errors --- .../securesms/jobs/PushMediaSendJob.java | 25 +++++++++++++--- .../securesms/jobs/PushTextSendJob.java | 29 ++++--------------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/org/thoughtcrime/securesms/jobs/PushMediaSendJob.java b/src/org/thoughtcrime/securesms/jobs/PushMediaSendJob.java index 09bab54caa..fc5be53389 100644 --- a/src/org/thoughtcrime/securesms/jobs/PushMediaSendJob.java +++ b/src/org/thoughtcrime/securesms/jobs/PushMediaSendJob.java @@ -22,6 +22,7 @@ import org.thoughtcrime.securesms.jobmanager.Data; import org.thoughtcrime.securesms.jobmanager.Job; import org.thoughtcrime.securesms.jobmanager.JobManager; import org.thoughtcrime.securesms.logging.Log; +import org.thoughtcrime.securesms.loki.LokiMessageDatabase; import org.thoughtcrime.securesms.mms.MmsException; import org.thoughtcrime.securesms.mms.OutgoingMediaMessage; import org.thoughtcrime.securesms.recipients.Recipient; @@ -35,6 +36,7 @@ import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.signalservice.api.SignalServiceMessageSender; import org.whispersystems.signalservice.api.crypto.UnidentifiedAccessPair; import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException; +import org.whispersystems.signalservice.api.messages.SendMessageResult; import org.whispersystems.signalservice.api.messages.SignalServiceAttachment; import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage; import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage.Preview; @@ -42,6 +44,7 @@ import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSy import org.whispersystems.signalservice.api.messages.shared.SharedContact; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException; +import org.whispersystems.signalservice.loki.api.LokiAPI; import org.whispersystems.signalservice.loki.api.LokiDeviceLinkUtilities; import org.whispersystems.signalservice.loki.messaging.LokiSyncMessage; import org.whispersystems.signalservice.loki.utilities.PromiseUtil; @@ -229,13 +232,17 @@ public class PushMediaSendJob extends PushSendJob implements InjectableType { database.addMismatchedIdentity(messageId, Address.fromSerialized(uie.getE164Number()), uie.getIdentityKey()); database.markAsSentFailed(messageId); } + } catch (LokiAPI.Error e) { + android.util.Log.d("Loki", "Couldn't send message due to error: " + e.getDescription()); + if (messageId < 0) { return; } + LokiMessageDatabase lokiMessageDatabase = DatabaseFactory.getLokiMessageDatabase(context); + lokiMessageDatabase.setErrorMessage(messageId, e.getDescription()); + database.markAsSentFailed(messageId); } } @Override public boolean onShouldRetry(@NonNull Exception exception) { - // Loki - Disable since we have our own retrying - // if (exception instanceof RetryLaterException) return true; return false; } @@ -249,7 +256,7 @@ public class PushMediaSendJob extends PushSendJob implements InjectableType { private boolean deliver(OutgoingMediaMessage message) throws RetryLaterException, InsecureFallbackApprovalException, UntrustedIdentityException, - UndeliverableMessageException + UndeliverableMessageException, LokiAPI.Error { try { Recipient recipient = Recipient.from(context, destination, false); @@ -295,7 +302,17 @@ public class PushMediaSendJob extends PushSendJob implements InjectableType { // We also need to use the original message ID and not -1 syncMessage = new LokiSyncMessage(masterAddress, templateMessageId); } - return messageSender.sendMessage(messageId, address, UnidentifiedAccessUtil.getAccessFor(context, recipient), mediaMessage, Optional.fromNullable(syncMessage)).getSuccess().isUnidentified(); + SendMessageResult result = messageSender.sendMessage(messageId, address, UnidentifiedAccessUtil.getAccessFor(context, recipient), mediaMessage, Optional.fromNullable(syncMessage)); + if (result.getLokiAPIError() != null) { + Throwable lokiAPIError = result.getLokiAPIError(); + if (lokiAPIError instanceof LokiAPI.Error) { // Should always be true + throw (LokiAPI.Error) lokiAPIError; + } else { + return result.getSuccess().isUnidentified(); + } + } else { + return result.getSuccess().isUnidentified(); + } } } catch (UnregisteredUserException e) { warn(TAG, e); diff --git a/src/org/thoughtcrime/securesms/jobs/PushTextSendJob.java b/src/org/thoughtcrime/securesms/jobs/PushTextSendJob.java index 3c6e10f346..878be38315 100644 --- a/src/org/thoughtcrime/securesms/jobs/PushTextSendJob.java +++ b/src/org/thoughtcrime/securesms/jobs/PushTextSendJob.java @@ -34,8 +34,6 @@ import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException; import org.whispersystems.signalservice.loki.api.LokiAPI; import org.whispersystems.signalservice.loki.api.LokiDeviceLinkUtilities; -import org.whispersystems.signalservice.loki.api.LokiDotNetAPI; -import org.whispersystems.signalservice.loki.api.LokiSnodeProxy; import org.whispersystems.signalservice.loki.messaging.LokiSyncMessage; import org.whispersystems.signalservice.loki.utilities.PromiseUtil; @@ -122,8 +120,6 @@ public class PushTextSendJob extends PushSendJob implements InjectableType { return; } - LokiMessageDatabase lokiMessageDatabase = DatabaseFactory.getLokiMessageDatabase(context); - try { log(TAG, "Sending message: " + templateMessageId + (hasSameDestination ? "" : "to another device.")); @@ -181,16 +177,7 @@ public class PushTextSendJob extends PushSendJob implements InjectableType { } catch (LokiAPI.Error e) { Log.d("Loki", "Couldn't send message due to error: " + e.getDescription()); if (messageId < 0) { return; } - lokiMessageDatabase.setErrorMessage(record.getId(), e.getDescription()); - database.markAsSentFailed(record.getId()); - } catch (LokiDotNetAPI.Error e) { - Log.d("Loki", "Couldn't send message due to error: " + e.getDescription()); - if (messageId < 0) { return; } - lokiMessageDatabase.setErrorMessage(record.getId(), e.getDescription()); - database.markAsSentFailed(record.getId()); - } catch (LokiSnodeProxy.Error e) { - Log.d("Loki", "Couldn't send message due to error: " + e.getDescription()); - if (messageId < 0) { return; } + LokiMessageDatabase lokiMessageDatabase = DatabaseFactory.getLokiMessageDatabase(context); lokiMessageDatabase.setErrorMessage(record.getId(), e.getDescription()); database.markAsSentFailed(record.getId()); } @@ -219,7 +206,7 @@ public class PushTextSendJob extends PushSendJob implements InjectableType { } private boolean deliver(SmsMessageRecord message) - throws UntrustedIdentityException, InsecureFallbackApprovalException, RetryLaterException, LokiAPI.Error, LokiDotNetAPI.Error, LokiSnodeProxy.Error + throws UntrustedIdentityException, InsecureFallbackApprovalException, RetryLaterException, LokiAPI.Error { try { // rotateSenderCertificateIfNecessary(); @@ -265,14 +252,10 @@ public class PushTextSendJob extends PushSendJob implements InjectableType { syncMessage = new LokiSyncMessage(masterAddress, templateMessageId); } SendMessageResult result = messageSender.sendMessage(messageId, address, unidentifiedAccess, textSecureMessage, Optional.fromNullable(syncMessage)); - if (result.getException() != null) { - Throwable exception = result.getException(); - if (exception instanceof LokiAPI.Error) { - throw (LokiAPI.Error) exception; - } else if (exception instanceof LokiDotNetAPI.Error) { - throw (LokiDotNetAPI.Error) exception; - } else if (exception instanceof LokiSnodeProxy.Error) { - throw (LokiSnodeProxy.Error) exception; + if (result.getLokiAPIError() != null) { + Throwable lokiAPIError = result.getLokiAPIError(); + if (lokiAPIError instanceof LokiAPI.Error) { // Should always be true + throw (LokiAPI.Error) lokiAPIError; } else { return result.getSuccess().isUnidentified(); }