From 90c9cc17b9298ee3eb9e19f8e588b689ea3db0fa Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Mon, 24 Apr 2023 12:05:15 -0400 Subject: [PATCH] Handle unregistered responses in more locations. There were some send jobs where we knew users were unregistered, but we weren't marking them as such in the DB. --- .../securesms/jobs/GroupSendJobHelper.java | 23 +++++++++++++------ .../securesms/jobs/ProfileKeySendJob.java | 8 ++++++- .../jobs/PushGroupSilentUpdateSendJob.java | 9 +++++++- .../securesms/jobs/ReactionSendJob.java | 8 ++++++- .../securesms/jobs/RemoteDeleteSendJob.java | 4 ++++ 5 files changed, 42 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/GroupSendJobHelper.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/GroupSendJobHelper.java index 86390b90a3..2c83338fee 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/GroupSendJobHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/GroupSendJobHelper.java @@ -20,9 +20,10 @@ final class GroupSendJobHelper { } static @NonNull SendResult getCompletedSends(@NonNull List possibleRecipients, @NonNull Collection results) { - RecipientAccessList accessList = new RecipientAccessList(possibleRecipients); - List completions = new ArrayList<>(results.size()); - List skipped = new ArrayList<>(); + RecipientAccessList accessList = new RecipientAccessList(possibleRecipients); + List completions = new ArrayList<>(results.size()); + List skipped = new ArrayList<>(); + List unregistered = new ArrayList<>(); for (SendMessageResult sendMessageResult : results) { Recipient recipient = accessList.requireByAddress(sendMessageResult.getAddress()); @@ -34,6 +35,7 @@ final class GroupSendJobHelper { if (sendMessageResult.isUnregisteredFailure()) { Log.w(TAG, "Unregistered failure for " + recipient.getId()); skipped.add(recipient.getId()); + unregistered.add(recipient.getId()); } if (sendMessageResult.getProofRequiredFailure() != null) { @@ -50,16 +52,23 @@ final class GroupSendJobHelper { } } - return new SendResult(completions, skipped); + return new SendResult(completions, skipped, unregistered); } public static class SendResult { + /** Recipients that do not need to be sent to again. Includes certain types of non-retryable failures. Important: items in this list can overlap with other lists in the result. */ public final List completed; + + /** Recipients that were not sent to and can be shown as "skipped" in the UI. Important: items in this list can overlap with other lists in the result. */ public final List skipped; - public SendResult(@NonNull List completed, @NonNull List skipped) { - this.completed = completed; - this.skipped = skipped; + /** Recipients that were discovered to be unregistered. Important: items in this list can overlap with other lists in the result. */ + public final List unregistered; + + public SendResult(@NonNull List completed, @NonNull List skipped, @NonNull List unregistered) { + this.completed = completed; + this.skipped = skipped; + this.unregistered = unregistered; } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/ProfileKeySendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/ProfileKeySendJob.java index 359960282a..194e9256fc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/ProfileKeySendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/ProfileKeySendJob.java @@ -155,7 +155,13 @@ public class ProfileKeySendJob extends BaseJob { List results = GroupSendUtil.sendUnresendableDataMessage(context, null, destinations, false, ContentHint.IMPLICIT, dataMessage.build(), false); - return GroupSendJobHelper.getCompletedSends(destinations, results).completed; + GroupSendJobHelper.SendResult groupResult = GroupSendJobHelper.getCompletedSends(destinations, results); + + for (RecipientId unregistered : groupResult.unregistered) { + SignalDatabase.recipients().markUnregistered(unregistered); + } + + return groupResult.completed; } public static class Factory implements Job.Factory { diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSilentUpdateSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSilentUpdateSendJob.java index 84204fb6c8..40e27e06c2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSilentUpdateSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSilentUpdateSendJob.java @@ -13,6 +13,7 @@ import com.google.protobuf.InvalidProtocolBufferException; import org.signal.core.util.logging.Log; import org.signal.storageservice.protos.groups.local.DecryptedGroup; import org.thoughtcrime.securesms.database.RecipientTable; +import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.groups.GroupId; import org.thoughtcrime.securesms.jobmanager.JsonJobData; import org.thoughtcrime.securesms.jobmanager.Job; @@ -178,7 +179,13 @@ public final class PushGroupSilentUpdateSendJob extends BaseJob { List results = GroupSendUtil.sendUnresendableDataMessage(context, groupId, destinations, false, ContentHint.IMPLICIT, groupDataMessage, false); - return GroupSendJobHelper.getCompletedSends(destinations, results).completed; + GroupSendJobHelper.SendResult groupResult = GroupSendJobHelper.getCompletedSends(destinations, results); + + for (RecipientId unregistered : groupResult.unregistered) { + SignalDatabase.recipients().markUnregistered(unregistered); + } + + return groupResult.completed; } public static class Factory implements Job.Factory { diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/ReactionSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/ReactionSendJob.java index 6655238046..2a8b54d3f1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/ReactionSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/ReactionSendJob.java @@ -243,7 +243,13 @@ public class ReactionSendJob extends BaseJob { results.add(ApplicationDependencies.getSignalServiceMessageSender().sendSyncMessage(dataMessage)); } - return GroupSendJobHelper.getCompletedSends(destinations, results).completed; + GroupSendJobHelper.SendResult groupResult = GroupSendJobHelper.getCompletedSends(destinations, results); + + for (RecipientId unregistered : groupResult.unregistered) { + SignalDatabase.recipients().markUnregistered(unregistered); + } + + return groupResult.completed; } private static SignalServiceDataMessage.Reaction buildReaction(@NonNull Context context, diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RemoteDeleteSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RemoteDeleteSendJob.java index c84aee7b46..33d72dab14 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RemoteDeleteSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RemoteDeleteSendJob.java @@ -159,6 +159,10 @@ public class RemoteDeleteSendJob extends BaseJob { recipients.remove(completion.getId()); } + for (RecipientId unregistered : sendResult.unregistered) { + SignalDatabase.recipients().markUnregistered(unregistered); + } + for (RecipientId skip : skipped) { recipients.remove(skip); }