From: AsamK Date: Sun, 2 May 2021 22:04:49 +0000 (+0200) Subject: Attempt to refresh recipients uuid if sending fails X-Git-Tag: v0.8.2~30 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/7afb1347b4720b4e36c367138bf87d3b2ab8ad9d?ds=sidebyside Attempt to refresh recipients uuid if sending fails --- diff --git a/lib/src/main/java/org/asamk/signal/manager/Manager.java b/lib/src/main/java/org/asamk/signal/manager/Manager.java index 7f0c48dc..1e7040b1 100644 --- a/lib/src/main/java/org/asamk/signal/manager/Manager.java +++ b/lib/src/main/java/org/asamk/signal/manager/Manager.java @@ -118,6 +118,7 @@ import org.whispersystems.signalservice.api.profiles.ProfileAndCredential; import org.whispersystems.signalservice.api.profiles.SignalServiceProfile; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.exceptions.MissingConfigurationException; +import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException; import org.whispersystems.signalservice.api.util.InvalidNumberException; import org.whispersystems.signalservice.api.util.PhoneNumberFormatter; import org.whispersystems.signalservice.api.util.SleepTimer; @@ -1301,10 +1302,20 @@ public class Manager implements Closeable { return signalServiceAddresses.stream().map(this::resolveRecipient).collect(Collectors.toSet()); } - private Map getRegisteredUsers(final Set numbersMissingUuid) throws IOException { + private RecipientId refreshRegisteredUser(RecipientId recipientId) throws IOException { + final var address = resolveSignalServiceAddress(recipientId); + if (!address.getNumber().isPresent()) { + return recipientId; + } + final var number = address.getNumber().get(); + final var uuidMap = getRegisteredUsers(Set.of(number)); + return resolveRecipientTrusted(new SignalServiceAddress(uuidMap.getOrDefault(number, null), number)); + } + + private Map getRegisteredUsers(final Set numbers) throws IOException { try { return accountManager.getRegisteredUsers(ServiceConfig.getIasKeyStore(), - numbersMissingUuid, + numbers, serviceEnvironmentConfig.getCdsMrenclave()); } catch (Quote.InvalidQuoteFormatException | UnauthenticatedQuoteException | SignatureException | UnauthenticatedResponseException | InvalidKeyException e) { throw new IOException(e); @@ -1418,10 +1429,16 @@ public class Manager implements Closeable { ) throws IOException { var messageSender = createMessageSender(); + final var recipientId = resolveRecipient(address); try { - return messageSender.sendMessage(address, - unidentifiedAccessHelper.getAccessFor(resolveRecipient(address)), - message); + try { + return messageSender.sendMessage(address, unidentifiedAccessHelper.getAccessFor(recipientId), message); + } catch (UnregisteredUserException e) { + final var newRecipientId = refreshRegisteredUser(recipientId); + return messageSender.sendMessage(resolveSignalServiceAddress(newRecipientId), + unidentifiedAccessHelper.getAccessFor(newRecipientId), + message); + } } catch (UntrustedIdentityException e) { return SendMessageResult.identityFailure(address, e.getIdentityKey()); } diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java b/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java index 0051e734..54f4af76 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java @@ -301,7 +301,16 @@ public class RecipientStore implements ContactsStore, ProfileStore { } if (byUuid.isEmpty()) { - logger.debug("Got recipient existing with number, updating with high trust uuid"); + if (byNumber.get().getAddress().getUuid().isPresent()) { + logger.debug( + "Got recipient existing with number, but different uuid, so stripping its number and adding new recipient"); + + updateRecipientAddressLocked(byNumber.get().getRecipientId(), + new SignalServiceAddress(byNumber.get().getAddress().getUuid().get(), null)); + return new Pair<>(addNewRecipientLocked(address), Optional.empty()); + } + + logger.debug("Got recipient existing with number and no uuid, updating with high trust uuid"); updateRecipientAddressLocked(byNumber.get().getRecipientId(), address); return new Pair<>(byNumber.get().getRecipientId(), Optional.empty()); }