diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java index b0cc51a3d1..8374997260 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java @@ -60,6 +60,7 @@ import org.whispersystems.signalservice.internal.push.SignalServiceProtos.GroupC import java.io.IOException; import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -199,11 +200,16 @@ public final class PushGroupSendJob extends PushSendJob { Set successIds = Stream.of(successUnidentifiedStatus).map(Pair::first).collect(Collectors.toSet()); List resolvedNetworkFailures = Stream.of(existingNetworkFailures).filter(failure -> successIds.contains(failure.getRecipientId(context))).toList(); List resolvedIdentityFailures = Stream.of(existingIdentityMismatches).filter(failure -> successIds.contains(failure.getRecipientId(context))).toList(); - List unregisteredRecipients = Stream.of(results).filter(SendMessageResult::isUnregisteredFailure).map(result -> Recipient.externalPush(context, result.getAddress())).toList(); + List unregisteredRecipients = Stream.of(results).filter(SendMessageResult::isUnregisteredFailure).map(result -> RecipientId.from(result.getAddress())).toList(); + + if (networkFailures.size() > 0 || identityMismatches.size() > 0 || proofRequired != null || unregisteredRecipients.size() > 0) { + Log.w(TAG, String.format(Locale.US, "Failed to send to some recipients. Network: %d, Identity: %d, ProofRequired: %s, Unregistered: %d", + networkFailures.size(), identityMismatches.size(), proofRequired != null, unregisteredRecipients.size())); + } RecipientDatabase recipientDatabase = SignalDatabase.recipients(); - for (Recipient unregistered : unregisteredRecipients) { - recipientDatabase.markUnregistered(unregistered.getId()); + for (RecipientId unregistered : unregisteredRecipients) { + recipientDatabase.markUnregistered(unregistered); } existingNetworkFailures.removeAll(resolvedNetworkFailures); diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java b/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java index c19e539956..f0d1023678 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java @@ -41,6 +41,8 @@ import org.whispersystems.signalservice.api.messages.SignalServiceTypingMessage; import org.whispersystems.signalservice.api.messages.calls.SignalServiceCallMessage; import org.whispersystems.signalservice.api.push.DistributionId; import org.whispersystems.signalservice.api.push.SignalServiceAddress; +import org.whispersystems.signalservice.api.push.exceptions.NotFoundException; +import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException; import org.whispersystems.signalservice.internal.push.exceptions.InvalidUnidentifiedAccessHeaderException; import org.whispersystems.signalservice.internal.push.http.CancelationSignal; import org.whispersystems.signalservice.internal.push.http.PartialSendCompleteListener; @@ -249,6 +251,9 @@ public final class GroupSendUtil { } catch (InvalidRegistrationIdException e) { Log.w(TAG, "Invalid registrationId. Falling back to legacy sends.", e); legacyTargets.addAll(senderKeyTargets); + } catch (NotFoundException e) { + Log.w(TAG, "Someone was unregistered. Falling back to legacy sends.", e); + legacyTargets.addAll(senderKeyTargets); } } else if (relatedMessageId != null) { SignalLocalMetrics.GroupMessageSend.onSenderKeyShared(relatedMessageId.getId()); diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java index 7186bbf2a1..09753ef621 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java @@ -1719,8 +1719,8 @@ public class SignalServiceMessageSender { .map(SendMessageResult::getAddress) .collect(Collectors.toList()); - Set successUuids = successes.stream().map(a -> a.getAci().toString()).collect(Collectors.toSet()); - Set successAddresses = targetInfo.destinations.stream().filter(a -> successUuids.contains(a.getName())).collect(Collectors.toSet()); + Set successAcis = successes.stream().map(a -> a.getAci().toString()).collect(Collectors.toSet()); + Set successAddresses = targetInfo.destinations.stream().filter(a -> successAcis.contains(a.getName())).collect(Collectors.toSet()); store.markSenderKeySharedWith(distributionId, successAddresses); @@ -1731,12 +1731,12 @@ public class SignalServiceMessageSender { Log.w(TAG, "[sendGroupMessage][" + timestamp + "] Failed to send sender keys to " + failureCount + " recipients. Sending back failed results now."); List trueFailures = results.stream() - .filter(r -> !r.isSuccess()) - .collect(Collectors.toList()); + .filter(r -> !r.isSuccess()) + .collect(Collectors.toList()); Set failedAddresses = trueFailures.stream() - .map(SendMessageResult::getAddress) - .collect(Collectors.toSet()); + .map(SendMessageResult::getAddress) + .collect(Collectors.toSet()); List fakeNetworkFailures = recipients.stream() .filter(r -> !failedAddresses.contains(r))