From: AsamK Date: Mon, 6 Dec 2021 17:55:37 +0000 (+0100) Subject: Convert RecipientAddress to record X-Git-Tag: v0.10.0~18 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/8867a7b9eeb3353d059613544899b262f4f47579?ds=sidebyside Convert RecipientAddress to record --- diff --git a/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java index 87d3d0d0..eedb1a59 100644 --- a/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java @@ -1436,13 +1436,13 @@ public class ManagerImpl implements Manager { private SignalServiceAddress resolveSignalServiceAddress(RecipientId recipientId) { final var address = account.getRecipientStore().resolveRecipientAddress(recipientId); - if (address.getUuid().isPresent()) { + if (address.uuid().isPresent()) { return address.toSignalServiceAddress(); } // Address in recipient store doesn't have a uuid, this shouldn't happen // Try to retrieve the uuid from the server - final var number = address.getNumber().get(); + final var number = address.number().get(); final ACI aci; try { aci = getRegisteredUser(number); diff --git a/lib/src/main/java/org/asamk/signal/manager/api/RecipientIdentifier.java b/lib/src/main/java/org/asamk/signal/manager/api/RecipientIdentifier.java index 5d6c7ae9..aa7ab547 100644 --- a/lib/src/main/java/org/asamk/signal/manager/api/RecipientIdentifier.java +++ b/lib/src/main/java/org/asamk/signal/manager/api/RecipientIdentifier.java @@ -36,10 +36,10 @@ public sealed interface RecipientIdentifier { } static Single fromAddress(RecipientAddress address) { - if (address.getNumber().isPresent()) { - return new Number(address.getNumber().get()); - } else if (address.getUuid().isPresent()) { - return new Uuid(address.getUuid().get()); + if (address.number().isPresent()) { + return new Number(address.number().get()); + } else if (address.uuid().isPresent()) { + return new Uuid(address.uuid().get()); } throw new AssertionError("RecipientAddress without identifier"); } diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientAddress.java b/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientAddress.java index 1e33c47e..2f762ff7 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientAddress.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientAddress.java @@ -6,27 +6,21 @@ import org.whispersystems.signalservice.api.push.SignalServiceAddress; import java.util.Optional; import java.util.UUID; -public class RecipientAddress { +public record RecipientAddress(Optional uuid, Optional number) { public static final UUID UNKNOWN_UUID = ACI.UNKNOWN.uuid(); - private final Optional uuid; - private final Optional e164; - /** * Construct a RecipientAddress. * - * @param uuid The UUID of the user, if available. - * @param e164 The phone number of the user, if available. + * @param uuid The UUID of the user, if available. + * @param number The phone number of the user, if available. */ - public RecipientAddress(Optional uuid, Optional e164) { + public RecipientAddress { uuid = uuid.isPresent() && uuid.get().equals(UNKNOWN_UUID) ? Optional.empty() : uuid; - if (uuid.isEmpty() && e164.isEmpty()) { + if (uuid.isEmpty() && number.isEmpty()) { throw new AssertionError("Must have either a UUID or E164 number!"); } - - this.uuid = uuid; - this.e164 = e164; } public RecipientAddress(UUID uuid, String e164) { @@ -41,27 +35,19 @@ public class RecipientAddress { this(Optional.of(uuid), Optional.empty()); } - public Optional getNumber() { - return e164; - } - - public Optional getUuid() { - return uuid; - } - public String getIdentifier() { if (uuid.isPresent()) { return uuid.get().toString(); - } else if (e164.isPresent()) { - return e164.get(); + } else if (number.isPresent()) { + return number.get(); } else { throw new AssertionError("Given the checks in the constructor, this should not be possible."); } } public String getLegacyIdentifier() { - if (e164.isPresent()) { - return e164.get(); + if (number.isPresent()) { + return number.get(); } else if (uuid.isPresent()) { return uuid.get().toString(); } else { @@ -71,30 +57,12 @@ public class RecipientAddress { public boolean matches(RecipientAddress other) { return (uuid.isPresent() && other.uuid.isPresent() && uuid.get().equals(other.uuid.get())) || ( - e164.isPresent() && other.e164.isPresent() && e164.get().equals(other.e164.get()) + number.isPresent() && other.number.isPresent() && number.get().equals(other.number.get()) ); } public SignalServiceAddress toSignalServiceAddress() { return new SignalServiceAddress(ACI.from(uuid.orElse(UNKNOWN_UUID)), - org.whispersystems.libsignal.util.guava.Optional.fromNullable(e164.orElse(null))); - } - - @Override - public boolean equals(final Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - final RecipientAddress that = (RecipientAddress) o; - - if (!uuid.equals(that.uuid)) return false; - return e164.equals(that.e164); - } - - @Override - public int hashCode() { - int result = uuid.hashCode(); - result = 31 * result + e164.hashCode(); - return result; + org.whispersystems.libsignal.util.guava.Optional.fromNullable(number.orElse(null))); } } 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 10f67c2a..84b09e3a 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 @@ -151,7 +151,7 @@ public class RecipientStore implements RecipientResolver, ContactsStore, Profile synchronized (recipients) { byNumber = findByNumberLocked(number); } - if (byNumber.isEmpty() || byNumber.get().getAddress().getUuid().isEmpty()) { + if (byNumber.isEmpty() || byNumber.get().getAddress().uuid().isEmpty()) { final var aci = aciSupplier.get(); if (aci == null) { throw new UnregisteredUserException(number, null); @@ -234,7 +234,7 @@ public class RecipientStore implements RecipientResolver, ContactsStore, Profile storeRecipientLocked(recipientId, Recipient.newBuilder() .withRecipientId(recipientId) - .withAddress(new RecipientAddress(recipient.getAddress().getUuid().orElse(null))) + .withAddress(new RecipientAddress(recipient.getAddress().uuid().orElse(null))) .build()); } } @@ -320,24 +320,24 @@ public class RecipientStore implements RecipientResolver, ContactsStore, Profile private Pair> resolveRecipientLocked( RecipientAddress address, boolean isHighTrust ) { - final var byNumber = address.getNumber().isEmpty() + final var byNumber = address.number().isEmpty() ? Optional.empty() - : findByNumberLocked(address.getNumber().get()); - final var byUuid = address.getUuid().isEmpty() + : findByNumberLocked(address.number().get()); + final var byUuid = address.uuid().isEmpty() ? Optional.empty() - : findByUuidLocked(address.getUuid().get()); + : findByUuidLocked(address.uuid().get()); if (byNumber.isEmpty() && byUuid.isEmpty()) { logger.debug("Got new recipient, both uuid and number are unknown"); - if (isHighTrust || address.getUuid().isEmpty() || address.getNumber().isEmpty()) { + if (isHighTrust || address.uuid().isEmpty() || address.number().isEmpty()) { return new Pair<>(addNewRecipientLocked(address), Optional.empty()); } - return new Pair<>(addNewRecipientLocked(new RecipientAddress(address.getUuid().get())), Optional.empty()); + return new Pair<>(addNewRecipientLocked(new RecipientAddress(address.uuid().get())), Optional.empty()); } - if (!isHighTrust || address.getUuid().isEmpty() || address.getNumber().isEmpty() || byNumber.equals(byUuid)) { + if (!isHighTrust || address.uuid().isEmpty() || address.number().isEmpty() || byNumber.equals(byUuid)) { return new Pair<>(byUuid.or(() -> byNumber).map(Recipient::getRecipientId).get(), Optional.empty()); } @@ -348,12 +348,12 @@ public class RecipientStore implements RecipientResolver, ContactsStore, Profile } if (byUuid.isEmpty()) { - if (byNumber.get().getAddress().getUuid().isPresent()) { + if (byNumber.get().getAddress().uuid().isPresent()) { logger.debug( "Got recipient existing with number, but different uuid, so stripping its number and adding new recipient"); updateRecipientAddressLocked(byNumber.get().getRecipientId(), - new RecipientAddress(byNumber.get().getAddress().getUuid().get())); + new RecipientAddress(byNumber.get().getAddress().uuid().get())); return new Pair<>(addNewRecipientLocked(address), Optional.empty()); } @@ -362,12 +362,12 @@ public class RecipientStore implements RecipientResolver, ContactsStore, Profile return new Pair<>(byNumber.get().getRecipientId(), Optional.empty()); } - if (byNumber.get().getAddress().getUuid().isPresent()) { + if (byNumber.get().getAddress().uuid().isPresent()) { logger.debug( "Got separate recipients for high trust number and uuid, recipient for number has different uuid, so stripping its number"); updateRecipientAddressLocked(byNumber.get().getRecipientId(), - new RecipientAddress(byNumber.get().getAddress().getUuid().get())); + new RecipientAddress(byNumber.get().getAddress().uuid().get())); updateRecipientAddressLocked(byUuid.get().getRecipientId(), address); return new Pair<>(byUuid.get().getRecipientId(), Optional.empty()); } @@ -430,9 +430,9 @@ public class RecipientStore implements RecipientResolver, ContactsStore, Profile private Optional findByNumberLocked(final String number) { return recipients.entrySet() .stream() - .filter(entry -> entry.getValue().getAddress().getNumber().isPresent() && number.equals(entry.getValue() + .filter(entry -> entry.getValue().getAddress().number().isPresent() && number.equals(entry.getValue() .getAddress() - .getNumber() + .number() .get())) .findFirst() .map(Map.Entry::getValue); @@ -441,9 +441,9 @@ public class RecipientStore implements RecipientResolver, ContactsStore, Profile private Optional findByUuidLocked(final UUID uuid) { return recipients.entrySet() .stream() - .filter(entry -> entry.getValue().getAddress().getUuid().isPresent() && uuid.equals(entry.getValue() + .filter(entry -> entry.getValue().getAddress().uuid().isPresent() && uuid.equals(entry.getValue() .getAddress() - .getUuid() + .uuid() .get())) .findFirst() .map(Map.Entry::getValue); @@ -479,8 +479,8 @@ public class RecipientStore implements RecipientResolver, ContactsStore, Profile .map(Enum::name) .collect(Collectors.toSet())); return new Storage.Recipient(pair.getKey().id(), - recipient.getAddress().getNumber().orElse(null), - recipient.getAddress().getUuid().map(UUID::toString).orElse(null), + recipient.getAddress().number().orElse(null), + recipient.getAddress().uuid().map(UUID::toString).orElse(null), recipient.getProfileKey() == null ? null : base64.encodeToString(recipient.getProfileKey().serialize()), diff --git a/src/main/java/org/asamk/signal/commands/ListContactsCommand.java b/src/main/java/org/asamk/signal/commands/ListContactsCommand.java index 98c21141..308044dc 100644 --- a/src/main/java/org/asamk/signal/commands/ListContactsCommand.java +++ b/src/main/java/org/asamk/signal/commands/ListContactsCommand.java @@ -43,8 +43,8 @@ public class ListContactsCommand implements JsonRpcLocalCommand { final var jsonContacts = contacts.stream().map(contactPair -> { final var address = contactPair.first(); final var contact = contactPair.second(); - return new JsonContact(address.getNumber().orElse(null), - address.getUuid().map(UUID::toString).orElse(null), + return new JsonContact(address.number().orElse(null), + address.uuid().map(UUID::toString).orElse(null), contact.getName(), contact.isBlocked(), contact.getMessageExpirationTime()); diff --git a/src/main/java/org/asamk/signal/commands/ListGroupsCommand.java b/src/main/java/org/asamk/signal/commands/ListGroupsCommand.java index 8326125f..e5a273f5 100644 --- a/src/main/java/org/asamk/signal/commands/ListGroupsCommand.java +++ b/src/main/java/org/asamk/signal/commands/ListGroupsCommand.java @@ -41,8 +41,8 @@ public class ListGroupsCommand implements JsonRpcLocalCommand { private static Set resolveJsonMembers(Set addresses) { return addresses.stream() - .map(address -> new JsonGroupMember(address.getNumber().orElse(null), - address.getUuid().map(UUID::toString).orElse(null))) + .map(address -> new JsonGroupMember(address.number().orElse(null), + address.uuid().map(UUID::toString).orElse(null))) .collect(Collectors.toSet()); } diff --git a/src/main/java/org/asamk/signal/commands/ListIdentitiesCommand.java b/src/main/java/org/asamk/signal/commands/ListIdentitiesCommand.java index c3cfbce8..5a442bd9 100644 --- a/src/main/java/org/asamk/signal/commands/ListIdentitiesCommand.java +++ b/src/main/java/org/asamk/signal/commands/ListIdentitiesCommand.java @@ -31,7 +31,7 @@ public class ListIdentitiesCommand implements JsonRpcLocalCommand { private static void printIdentityFingerprint(PlainTextWriter writer, Identity theirId) { writer.println("{}: {} Added: {} Fingerprint: {} Safety Number: {}", - theirId.recipient().getNumber().orElse(null), + theirId.recipient().number().orElse(null), theirId.trustLevel(), theirId.dateAdded(), Hex.toString(theirId.getFingerprint()), @@ -67,8 +67,8 @@ public class ListIdentitiesCommand implements JsonRpcLocalCommand { final var address = id.recipient(); var safetyNumber = Util.formatSafetyNumber(id.safetyNumber()); var scannableSafetyNumber = id.scannableSafetyNumber(); - return new JsonIdentity(address.getNumber().orElse(null), - address.getUuid().map(UUID::toString).orElse(null), + return new JsonIdentity(address.number().orElse(null), + address.uuid().map(UUID::toString).orElse(null), Hex.toString(id.getFingerprint()), safetyNumber, scannableSafetyNumber == null diff --git a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java index 5d7eb491..e59c7f86 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java @@ -679,7 +679,7 @@ public class DbusSignalImpl implements Signal { public List listNumbers() { return Stream.concat(m.getIdentities().stream().map(Identity::recipient), m.getContacts().stream().map(Pair::first)) - .map(a -> a.getNumber().orElse(null)) + .map(a -> a.number().orElse(null)) .filter(Objects::nonNull) .distinct() .collect(Collectors.toList()); @@ -698,7 +698,7 @@ public class DbusSignalImpl implements Signal { // Try profiles if no contact name was found for (var identity : m.getIdentities()) { final var address = identity.recipient(); - var number = address.getNumber().orElse(null); + var number = address.number().orElse(null); if (number != null) { Profile profile = null; try { diff --git a/src/main/java/org/asamk/signal/json/JsonMention.java b/src/main/java/org/asamk/signal/json/JsonMention.java index d8001088..c4c962a0 100644 --- a/src/main/java/org/asamk/signal/json/JsonMention.java +++ b/src/main/java/org/asamk/signal/json/JsonMention.java @@ -9,8 +9,8 @@ public record JsonMention(@Deprecated String name, String number, String uuid, i static JsonMention from(MessageEnvelope.Data.Mention mention) { final var address = mention.recipient(); return new JsonMention(address.getLegacyIdentifier(), - address.getNumber().orElse(null), - address.getUuid().map(UUID::toString).orElse(null), + address.number().orElse(null), + address.uuid().map(UUID::toString).orElse(null), mention.start(), mention.length()); } diff --git a/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java b/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java index b7e1cf2a..0c1d0738 100644 --- a/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java +++ b/src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java @@ -34,14 +34,14 @@ public record JsonMessageEnvelope( if (envelope.sourceAddress().isPresent()) { final var sourceAddress = envelope.sourceAddress().get(); source = sourceAddress.getLegacyIdentifier(); - sourceNumber = sourceAddress.getNumber().orElse(null); - sourceUuid = sourceAddress.getUuid().map(UUID::toString).orElse(null); + sourceNumber = sourceAddress.number().orElse(null); + sourceUuid = sourceAddress.uuid().map(UUID::toString).orElse(null); sourceDevice = envelope.sourceDevice(); } else if (exception instanceof UntrustedIdentityException e) { final var sender = e.getSender(); source = sender.getLegacyIdentifier(); - sourceNumber = sender.getNumber().orElse(null); - sourceUuid = sender.getUuid().map(UUID::toString).orElse(null); + sourceNumber = sender.number().orElse(null); + sourceUuid = sender.uuid().map(UUID::toString).orElse(null); sourceDevice = e.getSenderDevice(); } else { source = null; diff --git a/src/main/java/org/asamk/signal/json/JsonQuote.java b/src/main/java/org/asamk/signal/json/JsonQuote.java index 05dc8f41..d8d3c17f 100644 --- a/src/main/java/org/asamk/signal/json/JsonQuote.java +++ b/src/main/java/org/asamk/signal/json/JsonQuote.java @@ -23,8 +23,8 @@ public record JsonQuote( final var id = quote.id(); final var address = quote.author(); final var author = address.getLegacyIdentifier(); - final var authorNumber = address.getNumber().orElse(null); - final var authorUuid = address.getUuid().map(UUID::toString).orElse(null); + final var authorNumber = address.number().orElse(null); + final var authorUuid = address.uuid().map(UUID::toString).orElse(null); final var text = quote.text().orElse(null); final var mentions = quote.mentions().size() > 0 ? quote.mentions() diff --git a/src/main/java/org/asamk/signal/json/JsonReaction.java b/src/main/java/org/asamk/signal/json/JsonReaction.java index 04037b6e..71da4df5 100644 --- a/src/main/java/org/asamk/signal/json/JsonReaction.java +++ b/src/main/java/org/asamk/signal/json/JsonReaction.java @@ -17,8 +17,8 @@ public record JsonReaction( final var emoji = reaction.emoji(); final var address = reaction.targetAuthor(); final var targetAuthor = address.getLegacyIdentifier(); - final var targetAuthorNumber = address.getNumber().orElse(null); - final var targetAuthorUuid = address.getUuid().map(UUID::toString).orElse(null); + final var targetAuthorNumber = address.number().orElse(null); + final var targetAuthorUuid = address.uuid().map(UUID::toString).orElse(null); final var targetSentTimestamp = reaction.targetSentTimestamp(); final var isRemove = reaction.isRemove(); return new JsonReaction(emoji, diff --git a/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java index 7eea0472..0accddc1 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java @@ -17,8 +17,8 @@ record JsonSyncDataMessage( if (transcriptMessage.destination().isPresent()) { final var address = transcriptMessage.destination().get(); return new JsonSyncDataMessage(address.getLegacyIdentifier(), - address.getNumber().orElse(null), - address.getUuid().map(UUID::toString).orElse(null), + address.number().orElse(null), + address.uuid().map(UUID::toString).orElse(null), JsonDataMessage.from(transcriptMessage.message())); } else { diff --git a/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java index 3d04f94d..50c6ecee 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java @@ -11,8 +11,8 @@ record JsonSyncReadMessage( static JsonSyncReadMessage from(MessageEnvelope.Sync.Read readMessage) { final var senderAddress = readMessage.sender(); final var sender = senderAddress.getLegacyIdentifier(); - final var senderNumber = senderAddress.getNumber().orElse(null); - final var senderUuid = senderAddress.getUuid().map(UUID::toString).orElse(null); + final var senderNumber = senderAddress.number().orElse(null); + final var senderUuid = senderAddress.uuid().map(UUID::toString).orElse(null); final var timestamp = readMessage.timestamp(); return new JsonSyncReadMessage(sender, senderNumber, senderUuid, timestamp); }