Improve handling of unregistered failure during sender key send.
This commit is contained in:
parent
0fc6e642fe
commit
11aa168a6b
3 changed files with 20 additions and 9 deletions
|
@ -60,6 +60,7 @@ import org.whispersystems.signalservice.internal.push.SignalServiceProtos.GroupC
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
@ -199,11 +200,16 @@ public final class PushGroupSendJob extends PushSendJob {
|
||||||
Set<RecipientId> successIds = Stream.of(successUnidentifiedStatus).map(Pair::first).collect(Collectors.toSet());
|
Set<RecipientId> successIds = Stream.of(successUnidentifiedStatus).map(Pair::first).collect(Collectors.toSet());
|
||||||
List<NetworkFailure> resolvedNetworkFailures = Stream.of(existingNetworkFailures).filter(failure -> successIds.contains(failure.getRecipientId(context))).toList();
|
List<NetworkFailure> resolvedNetworkFailures = Stream.of(existingNetworkFailures).filter(failure -> successIds.contains(failure.getRecipientId(context))).toList();
|
||||||
List<IdentityKeyMismatch> resolvedIdentityFailures = Stream.of(existingIdentityMismatches).filter(failure -> successIds.contains(failure.getRecipientId(context))).toList();
|
List<IdentityKeyMismatch> resolvedIdentityFailures = Stream.of(existingIdentityMismatches).filter(failure -> successIds.contains(failure.getRecipientId(context))).toList();
|
||||||
List<Recipient> unregisteredRecipients = Stream.of(results).filter(SendMessageResult::isUnregisteredFailure).map(result -> Recipient.externalPush(context, result.getAddress())).toList();
|
List<RecipientId> 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();
|
RecipientDatabase recipientDatabase = SignalDatabase.recipients();
|
||||||
for (Recipient unregistered : unregisteredRecipients) {
|
for (RecipientId unregistered : unregisteredRecipients) {
|
||||||
recipientDatabase.markUnregistered(unregistered.getId());
|
recipientDatabase.markUnregistered(unregistered);
|
||||||
}
|
}
|
||||||
|
|
||||||
existingNetworkFailures.removeAll(resolvedNetworkFailures);
|
existingNetworkFailures.removeAll(resolvedNetworkFailures);
|
||||||
|
|
|
@ -41,6 +41,8 @@ import org.whispersystems.signalservice.api.messages.SignalServiceTypingMessage;
|
||||||
import org.whispersystems.signalservice.api.messages.calls.SignalServiceCallMessage;
|
import org.whispersystems.signalservice.api.messages.calls.SignalServiceCallMessage;
|
||||||
import org.whispersystems.signalservice.api.push.DistributionId;
|
import org.whispersystems.signalservice.api.push.DistributionId;
|
||||||
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
|
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.exceptions.InvalidUnidentifiedAccessHeaderException;
|
||||||
import org.whispersystems.signalservice.internal.push.http.CancelationSignal;
|
import org.whispersystems.signalservice.internal.push.http.CancelationSignal;
|
||||||
import org.whispersystems.signalservice.internal.push.http.PartialSendCompleteListener;
|
import org.whispersystems.signalservice.internal.push.http.PartialSendCompleteListener;
|
||||||
|
@ -249,6 +251,9 @@ public final class GroupSendUtil {
|
||||||
} catch (InvalidRegistrationIdException e) {
|
} catch (InvalidRegistrationIdException e) {
|
||||||
Log.w(TAG, "Invalid registrationId. Falling back to legacy sends.", e);
|
Log.w(TAG, "Invalid registrationId. Falling back to legacy sends.", e);
|
||||||
legacyTargets.addAll(senderKeyTargets);
|
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) {
|
} else if (relatedMessageId != null) {
|
||||||
SignalLocalMetrics.GroupMessageSend.onSenderKeyShared(relatedMessageId.getId());
|
SignalLocalMetrics.GroupMessageSend.onSenderKeyShared(relatedMessageId.getId());
|
||||||
|
|
|
@ -1719,8 +1719,8 @@ public class SignalServiceMessageSender {
|
||||||
.map(SendMessageResult::getAddress)
|
.map(SendMessageResult::getAddress)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
Set<String> successUuids = successes.stream().map(a -> a.getAci().toString()).collect(Collectors.toSet());
|
Set<String> successAcis = successes.stream().map(a -> a.getAci().toString()).collect(Collectors.toSet());
|
||||||
Set<SignalProtocolAddress> successAddresses = targetInfo.destinations.stream().filter(a -> successUuids.contains(a.getName())).collect(Collectors.toSet());
|
Set<SignalProtocolAddress> successAddresses = targetInfo.destinations.stream().filter(a -> successAcis.contains(a.getName())).collect(Collectors.toSet());
|
||||||
|
|
||||||
store.markSenderKeySharedWith(distributionId, successAddresses);
|
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.");
|
Log.w(TAG, "[sendGroupMessage][" + timestamp + "] Failed to send sender keys to " + failureCount + " recipients. Sending back failed results now.");
|
||||||
|
|
||||||
List<SendMessageResult> trueFailures = results.stream()
|
List<SendMessageResult> trueFailures = results.stream()
|
||||||
.filter(r -> !r.isSuccess())
|
.filter(r -> !r.isSuccess())
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
Set<SignalServiceAddress> failedAddresses = trueFailures.stream()
|
Set<SignalServiceAddress> failedAddresses = trueFailures.stream()
|
||||||
.map(SendMessageResult::getAddress)
|
.map(SendMessageResult::getAddress)
|
||||||
.collect(Collectors.toSet());
|
.collect(Collectors.toSet());
|
||||||
|
|
||||||
List<SendMessageResult> fakeNetworkFailures = recipients.stream()
|
List<SendMessageResult> fakeNetworkFailures = recipients.stream()
|
||||||
.filter(r -> !failedAddresses.contains(r))
|
.filter(r -> !failedAddresses.contains(r))
|
||||||
|
|
Loading…
Add table
Reference in a new issue