]> nmode's Git Repositories - signal-cli/commitdiff
Refactor RecipientAddress
authorAsamK <asamk@gmx.de>
Sat, 8 Oct 2022 10:40:00 +0000 (12:40 +0200)
committerAsamK <asamk@gmx.de>
Sat, 8 Oct 2022 15:42:03 +0000 (17:42 +0200)
40 files changed:
lib/src/main/java/org/asamk/signal/manager/Manager.java
lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java
lib/src/main/java/org/asamk/signal/manager/api/Group.java
lib/src/main/java/org/asamk/signal/manager/api/Identity.java
lib/src/main/java/org/asamk/signal/manager/api/MessageEnvelope.java
lib/src/main/java/org/asamk/signal/manager/api/Recipient.java [new file with mode: 0644]
lib/src/main/java/org/asamk/signal/manager/api/RecipientAddress.java [new file with mode: 0644]
lib/src/main/java/org/asamk/signal/manager/api/RecipientIdentifier.java
lib/src/main/java/org/asamk/signal/manager/api/SendMessageResult.java
lib/src/main/java/org/asamk/signal/manager/api/UnregisteredRecipientException.java
lib/src/main/java/org/asamk/signal/manager/api/UntrustedIdentityException.java
lib/src/main/java/org/asamk/signal/manager/helper/IdentityHelper.java
lib/src/main/java/org/asamk/signal/manager/helper/IncomingMessageHandler.java
lib/src/main/java/org/asamk/signal/manager/helper/ReceiveHelper.java
lib/src/main/java/org/asamk/signal/manager/helper/RecipientHelper.java
lib/src/main/java/org/asamk/signal/manager/helper/StorageHelper.java
lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java
lib/src/main/java/org/asamk/signal/manager/storage/Utils.java
lib/src/main/java/org/asamk/signal/manager/storage/contacts/LegacyContactInfo.java
lib/src/main/java/org/asamk/signal/manager/storage/groups/LegacyGroupStore.java
lib/src/main/java/org/asamk/signal/manager/storage/profiles/LegacyProfileStore.java
lib/src/main/java/org/asamk/signal/manager/storage/protocol/LegacyJsonIdentityKeyStore.java
lib/src/main/java/org/asamk/signal/manager/storage/protocol/LegacyJsonSessionStore.java
lib/src/main/java/org/asamk/signal/manager/storage/recipients/LegacyRecipientStore.java
lib/src/main/java/org/asamk/signal/manager/storage/recipients/LegacyRecipientStore2.java
lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientAddress.java
lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientResolver.java
lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java
lib/src/main/java/org/asamk/signal/manager/storage/senderKeys/LegacySenderKeyRecordStore.java
lib/src/main/java/org/asamk/signal/manager/storage/senderKeys/LegacySenderKeySharedStore.java
lib/src/main/java/org/asamk/signal/manager/storage/sessions/LegacySessionStore.java
lib/src/main/java/org/asamk/signal/manager/util/Utils.java
src/main/java/org/asamk/signal/ReceiveMessageHandler.java
src/main/java/org/asamk/signal/commands/ListGroupsCommand.java
src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java
src/main/java/org/asamk/signal/dbus/DbusReceiveMessageHandler.java
src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java
src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java
src/main/java/org/asamk/signal/json/JsonRecipientAddress.java
src/main/java/org/asamk/signal/json/JsonSyncMessage.java

index eb62cb60ef1359b9adef3fb75bc62bda50a86907..007a783efadd672fc4201cfa6bd97f22f005db96 100644 (file)
@@ -14,6 +14,7 @@ import org.asamk.signal.manager.api.NotPrimaryDeviceException;
 import org.asamk.signal.manager.api.Pair;
 import org.asamk.signal.manager.api.PendingAdminApprovalException;
 import org.asamk.signal.manager.api.ReceiveConfig;
+import org.asamk.signal.manager.api.Recipient;
 import org.asamk.signal.manager.api.RecipientIdentifier;
 import org.asamk.signal.manager.api.SendGroupMessageResults;
 import org.asamk.signal.manager.api.SendMessageResults;
@@ -32,7 +33,6 @@ import org.asamk.signal.manager.groups.GroupSendingNotAllowedException;
 import org.asamk.signal.manager.groups.LastGroupAdminException;
 import org.asamk.signal.manager.groups.NotAGroupMemberException;
 import org.asamk.signal.manager.storage.recipients.Profile;
-import org.asamk.signal.manager.storage.recipients.Recipient;
 import org.whispersystems.signalservice.api.util.PhoneNumberFormatter;
 
 import java.io.Closeable;
index afc290b73a345e214f5a318c2d47f20231b076ad..fc38c92a000801c4fff23d0b07a0de420a17c4fd 100644 (file)
@@ -29,6 +29,7 @@ import org.asamk.signal.manager.api.NotPrimaryDeviceException;
 import org.asamk.signal.manager.api.Pair;
 import org.asamk.signal.manager.api.PendingAdminApprovalException;
 import org.asamk.signal.manager.api.ReceiveConfig;
+import org.asamk.signal.manager.api.Recipient;
 import org.asamk.signal.manager.api.RecipientIdentifier;
 import org.asamk.signal.manager.api.SendGroupMessageResults;
 import org.asamk.signal.manager.api.SendMessageResult;
@@ -54,7 +55,6 @@ import org.asamk.signal.manager.storage.SignalAccount;
 import org.asamk.signal.manager.storage.groups.GroupInfo;
 import org.asamk.signal.manager.storage.identities.IdentityInfo;
 import org.asamk.signal.manager.storage.recipients.Profile;
-import org.asamk.signal.manager.storage.recipients.Recipient;
 import org.asamk.signal.manager.storage.recipients.RecipientId;
 import org.asamk.signal.manager.storage.stickerPacks.JsonStickerPack;
 import org.asamk.signal.manager.storage.stickerPacks.StickerPackStore;
@@ -707,13 +707,13 @@ class ManagerImpl implements Manager {
 
     @Override
     public void deleteRecipient(final RecipientIdentifier.Single recipient) {
-        account.removeRecipient(account.getRecipientResolver().resolveRecipient(recipient.toPartialRecipientAddress()));
+        account.removeRecipient(account.getRecipientResolver().resolveRecipient(recipient.getIdentifier()));
     }
 
     @Override
     public void deleteContact(final RecipientIdentifier.Single recipient) {
         account.getContactStore()
-                .deleteContact(account.getRecipientResolver().resolveRecipient(recipient.toPartialRecipientAddress()));
+                .deleteContact(account.getRecipientResolver().resolveRecipient(recipient.getIdentifier()));
     }
 
     @Override
@@ -1005,7 +1005,16 @@ class ManagerImpl implements Manager {
         }
         // refresh profiles of explicitly given recipients
         context.getProfileHelper().refreshRecipientProfiles(recipientIds);
-        return account.getRecipientStore().getRecipients(onlyContacts, blocked, recipientIds, name);
+        return account.getRecipientStore()
+                .getRecipients(onlyContacts, blocked, recipientIds, name)
+                .stream()
+                .map(s -> new Recipient(s.getRecipientId(),
+                        s.getAddress().toApiRecipientAddress(),
+                        s.getContact(),
+                        s.getProfileKey(),
+                        s.getExpiringProfileKeyCredential(),
+                        s.getProfile()))
+                .toList();
     }
 
     @Override
@@ -1049,7 +1058,7 @@ class ManagerImpl implements Manager {
                 .resolveRecipientAddress(account.getRecipientResolver().resolveRecipient(identityInfo.getServiceId()));
         final var scannableFingerprint = context.getIdentityHelper()
                 .computeSafetyNumberForScanning(identityInfo.getServiceId(), identityInfo.getIdentityKey());
-        return new Identity(address,
+        return new Identity(address.toApiRecipientAddress(),
                 identityInfo.getIdentityKey(),
                 context.getIdentityHelper()
                         .computeSafetyNumber(identityInfo.getServiceId(), identityInfo.getIdentityKey()),
index 9b2d988a99e6b78bbe875e113935fc2a1b91d7bd..62f39290c40e65a6294189a36ba5d08ae764df01 100644 (file)
@@ -5,7 +5,6 @@ import org.asamk.signal.manager.groups.GroupInviteLinkUrl;
 import org.asamk.signal.manager.groups.GroupPermission;
 import org.asamk.signal.manager.helper.RecipientAddressResolver;
 import org.asamk.signal.manager.storage.groups.GroupInfo;
-import org.asamk.signal.manager.storage.recipients.RecipientAddress;
 import org.asamk.signal.manager.storage.recipients.RecipientId;
 
 import java.util.Set;
@@ -40,22 +39,27 @@ public record Group(
                 groupInfo.getMembers()
                         .stream()
                         .map(recipientStore::resolveRecipientAddress)
+                        .map(org.asamk.signal.manager.storage.recipients.RecipientAddress::toApiRecipientAddress)
                         .collect(Collectors.toSet()),
                 groupInfo.getPendingMembers()
                         .stream()
                         .map(recipientStore::resolveRecipientAddress)
+                        .map(org.asamk.signal.manager.storage.recipients.RecipientAddress::toApiRecipientAddress)
                         .collect(Collectors.toSet()),
                 groupInfo.getRequestingMembers()
                         .stream()
                         .map(recipientStore::resolveRecipientAddress)
+                        .map(org.asamk.signal.manager.storage.recipients.RecipientAddress::toApiRecipientAddress)
                         .collect(Collectors.toSet()),
                 groupInfo.getAdminMembers()
                         .stream()
                         .map(recipientStore::resolveRecipientAddress)
+                        .map(org.asamk.signal.manager.storage.recipients.RecipientAddress::toApiRecipientAddress)
                         .collect(Collectors.toSet()),
                 groupInfo.getBannedMembers()
                         .stream()
                         .map(recipientStore::resolveRecipientAddress)
+                        .map(org.asamk.signal.manager.storage.recipients.RecipientAddress::toApiRecipientAddress)
                         .collect(Collectors.toSet()),
                 groupInfo.isBlocked(),
                 groupInfo.getMessageExpirationTimer(),
index c4755576f6c48e902a855d10e5b40cc3bb8feb54..5d43aacc11f93a316dbcb6482d7ccdcec7988d06 100644 (file)
@@ -1,6 +1,5 @@
 package org.asamk.signal.manager.api;
 
-import org.asamk.signal.manager.storage.recipients.RecipientAddress;
 import org.signal.libsignal.protocol.IdentityKey;
 
 public record Identity(
index 727e2eeddec8a3cd6b5f7a434cffb3f024c64c2f..2140d413a73624039819d1517d6ef8488d7c9831 100644 (file)
@@ -3,7 +3,6 @@ package org.asamk.signal.manager.api;
 import org.asamk.signal.manager.groups.GroupId;
 import org.asamk.signal.manager.groups.GroupUtils;
 import org.asamk.signal.manager.helper.RecipientAddressResolver;
-import org.asamk.signal.manager.storage.recipients.RecipientAddress;
 import org.asamk.signal.manager.storage.recipients.RecipientResolver;
 import org.signal.libsignal.metadata.ProtocolException;
 import org.whispersystems.signalservice.api.messages.SignalServiceAttachment;
@@ -184,7 +183,7 @@ public record MessageEnvelope(
                     RecipientAddressResolver addressResolver
             ) {
                 return new StoryContext(addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(
-                        storyContext.getAuthorServiceId())), storyContext.getSentTimestamp());
+                        storyContext.getAuthorServiceId())).toApiRecipientAddress(), storyContext.getSentTimestamp());
             }
         }
 
@@ -205,7 +204,8 @@ public record MessageEnvelope(
                     RecipientAddressResolver addressResolver
             ) {
                 return new Reaction(reaction.getTargetSentTimestamp(),
-                        addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(reaction.getTargetAuthor())),
+                        addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(reaction.getTargetAuthor()))
+                                .toApiRecipientAddress(),
                         reaction.getEmoji(),
                         reaction.isRemove());
             }
@@ -226,7 +226,8 @@ public record MessageEnvelope(
                     final AttachmentFileProvider fileProvider
             ) {
                 return new Quote(quote.getId(),
-                        addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(quote.getAuthor())),
+                        addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(quote.getAuthor()))
+                                .toApiRecipientAddress(),
                         Optional.ofNullable(quote.getText()),
                         quote.getMentions() == null
                                 ? List.of()
@@ -255,9 +256,8 @@ public record MessageEnvelope(
                     RecipientResolver recipientResolver,
                     RecipientAddressResolver addressResolver
             ) {
-                return new Mention(addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(mention.getServiceId())),
-                        mention.getStart(),
-                        mention.getLength());
+                return new Mention(addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(mention.getServiceId()))
+                        .toApiRecipientAddress(), mention.getStart(), mention.getLength());
             }
         }
 
@@ -552,10 +552,12 @@ public record MessageEnvelope(
                 return new Sent(sentMessage.getTimestamp(),
                         sentMessage.getExpirationStartTimestamp(),
                         sentMessage.getDestination()
-                                .map(d -> addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(d))),
+                                .map(d -> addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(d))
+                                        .toApiRecipientAddress()),
                         sentMessage.getRecipients()
                                 .stream()
-                                .map(d -> addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(d)))
+                                .map(d -> addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(d))
+                                        .toApiRecipientAddress())
                                 .collect(Collectors.toSet()),
                         sentMessage.getDataMessage()
                                 .map(message -> Data.from(message, recipientResolver, addressResolver, fileProvider)),
@@ -572,7 +574,8 @@ public record MessageEnvelope(
             ) {
                 return new Blocked(blockedListMessage.getAddresses()
                         .stream()
-                        .map(d -> addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(d)))
+                        .map(d -> addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(d))
+                                .toApiRecipientAddress())
                         .toList(), blockedListMessage.getGroupIds().stream().map(GroupId::unknownVersion).toList());
             }
         }
@@ -584,8 +587,8 @@ public record MessageEnvelope(
                     RecipientResolver recipientResolver,
                     RecipientAddressResolver addressResolver
             ) {
-                return new Read(addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(readMessage.getSender())),
-                        readMessage.getTimestamp());
+                return new Read(addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(readMessage.getSender()))
+                        .toApiRecipientAddress(), readMessage.getTimestamp());
             }
         }
 
@@ -596,8 +599,8 @@ public record MessageEnvelope(
                     RecipientResolver recipientResolver,
                     RecipientAddressResolver addressResolver
             ) {
-                return new Viewed(addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(readMessage.getSender())),
-                        readMessage.getTimestamp());
+                return new Viewed(addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(readMessage.getSender()))
+                        .toApiRecipientAddress(), readMessage.getTimestamp());
             }
         }
 
@@ -609,7 +612,7 @@ public record MessageEnvelope(
                     RecipientAddressResolver addressResolver
             ) {
                 return new ViewOnceOpen(addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(
-                        readMessage.getSender())), readMessage.getTimestamp());
+                        readMessage.getSender())).toApiRecipientAddress(), readMessage.getTimestamp());
             }
         }
 
@@ -637,7 +640,8 @@ public record MessageEnvelope(
                 return new MessageRequestResponse(Type.from(messageRequestResponse.getType()),
                         messageRequestResponse.getGroupId().map(GroupId::unknownVersion),
                         messageRequestResponse.getPerson()
-                                .map(p -> addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(p))));
+                                .map(p -> addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(p))
+                                        .toApiRecipientAddress()));
             }
 
             public enum Type {
@@ -898,7 +902,7 @@ public record MessageEnvelope(
 
         return new MessageEnvelope(source == null
                 ? Optional.empty()
-                : Optional.of(addressResolver.resolveRecipientAddress(source)),
+                : Optional.of(addressResolver.resolveRecipientAddress(source).toApiRecipientAddress()),
                 sourceDevice,
                 envelope.getTimestamp(),
                 envelope.getServerReceivedTimestamp(),
diff --git a/lib/src/main/java/org/asamk/signal/manager/api/Recipient.java b/lib/src/main/java/org/asamk/signal/manager/api/Recipient.java
new file mode 100644 (file)
index 0000000..1aea3c4
--- /dev/null
@@ -0,0 +1,153 @@
+package org.asamk.signal.manager.api;
+
+import org.asamk.signal.manager.storage.recipients.Contact;
+import org.asamk.signal.manager.storage.recipients.Profile;
+import org.asamk.signal.manager.storage.recipients.RecipientId;
+import org.signal.libsignal.zkgroup.profiles.ExpiringProfileKeyCredential;
+import org.signal.libsignal.zkgroup.profiles.ProfileKey;
+
+import java.util.Objects;
+
+public class Recipient {
+
+    private final RecipientId recipientId;
+
+    private final RecipientAddress address;
+
+    private final Contact contact;
+
+    private final ProfileKey profileKey;
+
+    private final ExpiringProfileKeyCredential expiringProfileKeyCredential;
+
+    private final Profile profile;
+
+    public Recipient(
+            final RecipientId recipientId,
+            final RecipientAddress address,
+            final Contact contact,
+            final ProfileKey profileKey,
+            final ExpiringProfileKeyCredential expiringProfileKeyCredential,
+            final Profile profile
+    ) {
+        this.recipientId = recipientId;
+        this.address = address;
+        this.contact = contact;
+        this.profileKey = profileKey;
+        this.expiringProfileKeyCredential = expiringProfileKeyCredential;
+        this.profile = profile;
+    }
+
+    private Recipient(final Builder builder) {
+        recipientId = builder.recipientId;
+        address = builder.address;
+        contact = builder.contact;
+        profileKey = builder.profileKey;
+        expiringProfileKeyCredential = builder.expiringProfileKeyCredential1;
+        profile = builder.profile;
+    }
+
+    public static Builder newBuilder() {
+        return new Builder();
+    }
+
+    public static Builder newBuilder(final Recipient copy) {
+        Builder builder = new Builder();
+        builder.recipientId = copy.getRecipientId();
+        builder.address = copy.getAddress();
+        builder.contact = copy.getContact();
+        builder.profileKey = copy.getProfileKey();
+        builder.expiringProfileKeyCredential1 = copy.getExpiringProfileKeyCredential();
+        builder.profile = copy.getProfile();
+        return builder;
+    }
+
+    public RecipientId getRecipientId() {
+        return recipientId;
+    }
+
+    public RecipientAddress getAddress() {
+        return address;
+    }
+
+    public Contact getContact() {
+        return contact;
+    }
+
+    public ProfileKey getProfileKey() {
+        return profileKey;
+    }
+
+    public ExpiringProfileKeyCredential getExpiringProfileKeyCredential() {
+        return expiringProfileKeyCredential;
+    }
+
+    public Profile getProfile() {
+        return profile;
+    }
+
+    @Override
+    public boolean equals(final Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        final Recipient recipient = (Recipient) o;
+        return Objects.equals(recipientId, recipient.recipientId)
+                && Objects.equals(address, recipient.address)
+                && Objects.equals(contact, recipient.contact)
+                && Objects.equals(profileKey, recipient.profileKey)
+                && Objects.equals(expiringProfileKeyCredential, recipient.expiringProfileKeyCredential)
+                && Objects.equals(profile, recipient.profile);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(recipientId, address, contact, profileKey, expiringProfileKeyCredential, profile);
+    }
+
+    public static final class Builder {
+
+        private RecipientId recipientId;
+        private RecipientAddress address;
+        private Contact contact;
+        private ProfileKey profileKey;
+        private ExpiringProfileKeyCredential expiringProfileKeyCredential1;
+        private Profile profile;
+
+        private Builder() {
+        }
+
+        public Builder withRecipientId(final RecipientId val) {
+            recipientId = val;
+            return this;
+        }
+
+        public Builder withAddress(final RecipientAddress val) {
+            address = val;
+            return this;
+        }
+
+        public Builder withContact(final Contact val) {
+            contact = val;
+            return this;
+        }
+
+        public Builder withProfileKey(final ProfileKey val) {
+            profileKey = val;
+            return this;
+        }
+
+        public Builder withExpiringProfileKeyCredential(final ExpiringProfileKeyCredential val) {
+            expiringProfileKeyCredential1 = val;
+            return this;
+        }
+
+        public Builder withProfile(final Profile val) {
+            profile = val;
+            return this;
+        }
+
+        public Recipient build() {
+            return new Recipient(this);
+        }
+    }
+}
diff --git a/lib/src/main/java/org/asamk/signal/manager/api/RecipientAddress.java b/lib/src/main/java/org/asamk/signal/manager/api/RecipientAddress.java
new file mode 100644 (file)
index 0000000..f477b9e
--- /dev/null
@@ -0,0 +1,71 @@
+package org.asamk.signal.manager.api;
+
+import org.whispersystems.signalservice.api.push.ServiceId;
+import org.whispersystems.signalservice.api.push.SignalServiceAddress;
+
+import java.util.Optional;
+import java.util.UUID;
+
+public record RecipientAddress(Optional<UUID> uuid, Optional<String> number) {
+
+    public static final UUID UNKNOWN_UUID = ServiceId.UNKNOWN.uuid();
+
+    /**
+     * Construct a RecipientAddress.
+     *
+     * @param uuid   The UUID of the user, if available.
+     * @param number The phone number of the user, if available.
+     */
+    public RecipientAddress {
+        uuid = uuid.isPresent() && uuid.get().equals(UNKNOWN_UUID) ? Optional.empty() : uuid;
+        if (uuid.isEmpty() && number.isEmpty()) {
+            throw new AssertionError("Must have either a UUID or E164 number!");
+        }
+    }
+
+    public RecipientAddress(UUID uuid, String e164) {
+        this(Optional.ofNullable(uuid), Optional.ofNullable(e164));
+    }
+
+    public RecipientAddress(SignalServiceAddress address) {
+        this(Optional.of(address.getServiceId().uuid()), address.getNumber());
+    }
+
+    public RecipientAddress(UUID uuid) {
+        this(Optional.of(uuid), Optional.empty());
+    }
+
+    public ServiceId getServiceId() {
+        return ServiceId.from(uuid.orElse(UNKNOWN_UUID));
+    }
+
+    public String getIdentifier() {
+        if (uuid.isPresent()) {
+            return uuid.get().toString();
+        } 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 (number.isPresent()) {
+            return number.get();
+        } else if (uuid.isPresent()) {
+            return uuid.get().toString();
+        } else {
+            throw new AssertionError("Given the checks in the constructor, this should not be possible.");
+        }
+    }
+
+    public boolean matches(RecipientAddress other) {
+        return (uuid.isPresent() && other.uuid.isPresent() && uuid.get().equals(other.uuid.get())) || (
+                number.isPresent() && other.number.isPresent() && number.get().equals(other.number.get())
+        );
+    }
+
+    public SignalServiceAddress toSignalServiceAddress() {
+        return new SignalServiceAddress(getServiceId(), number);
+    }
+}
index 242d0f47daa56948846c7c68f344e3ff7ad880ad..70a60d47d0d7f6f55ec0f741b11e68d297960361 100644 (file)
@@ -1,7 +1,6 @@
 package org.asamk.signal.manager.api;
 
 import org.asamk.signal.manager.groups.GroupId;
-import org.asamk.signal.manager.storage.recipients.RecipientAddress;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.whispersystems.signalservice.api.util.PhoneNumberFormatter;
index be5bf801ab756eeb5bbdfecabc9a75b2b8523250..1507390bba4b1548bd6285b317afaaf8dad8e6ec 100644 (file)
@@ -1,7 +1,6 @@
 package org.asamk.signal.manager.api;
 
 import org.asamk.signal.manager.helper.RecipientAddressResolver;
-import org.asamk.signal.manager.storage.recipients.RecipientAddress;
 import org.asamk.signal.manager.storage.recipients.RecipientResolver;
 import org.signal.libsignal.protocol.IdentityKey;
 
@@ -43,7 +42,7 @@ public record SendMessageResult(
             RecipientAddressResolver addressResolver
     ) {
         return new SendMessageResult(addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(
-                sendMessageResult.getAddress())),
+                sendMessageResult.getAddress())).toApiRecipientAddress(),
                 sendMessageResult.isSuccess(),
                 sendMessageResult.isNetworkFailure(),
                 sendMessageResult.isUnregisteredFailure(),
index d37c7dc7a4c75631e940d247bba7531fb6953459..ef7d5b748811bf5af309955cb811b915f7428e23 100644 (file)
@@ -1,7 +1,5 @@
 package org.asamk.signal.manager.api;
 
-import org.asamk.signal.manager.storage.recipients.RecipientAddress;
-
 public class UnregisteredRecipientException extends Exception {
 
     private final RecipientAddress sender;
index 7328cf64723318e8b190c8bc67d7c5ae2c0c7894..e91903a596396ade4e7ff72aa639420671395324 100644 (file)
@@ -1,7 +1,5 @@
 package org.asamk.signal.manager.api;
 
-import org.asamk.signal.manager.storage.recipients.RecipientAddress;
-
 public class UntrustedIdentityException extends Exception {
 
     private final RecipientAddress sender;
index 0adeaf60323ff3fe309dbe65ee071c37b5022caa..0efe90a48c2a75681e3136dba4298dbd7ce7b494 100644 (file)
@@ -85,7 +85,7 @@ public class IdentityHelper {
                 account.getAciIdentityKeyPair().getPublicKey(),
                 address.getServiceId().equals(serviceId)
                         ? address
-                        : new RecipientAddress(serviceId.uuid(), address.number().orElse(null)),
+                        : new RecipientAddress(serviceId, address.number().orElse(null)),
                 theirIdentityKey);
     }
 
index 569168ded099e930b674a37088d20706f2413d06..a9c8fdae30c6abb0f31c6aac87f71fca0efbe95c 100644 (file)
@@ -97,7 +97,8 @@ public final class IncomingMessageHandler {
             } catch (ProtocolUntrustedIdentityException e) {
                 final var recipientId = account.getRecipientResolver().resolveRecipient(e.getSender());
                 final var exception = new UntrustedIdentityException(account.getRecipientAddressResolver()
-                        .resolveRecipientAddress(recipientId), e.getSenderDevice());
+                        .resolveRecipientAddress(recipientId)
+                        .toApiRecipientAddress(), e.getSenderDevice());
                 return new Pair<>(List.of(), exception);
             } catch (Exception e) {
                 return new Pair<>(List.of(), e);
@@ -129,7 +130,8 @@ public final class IncomingMessageHandler {
                 final var recipientId = account.getRecipientResolver().resolveRecipient(e.getSender());
                 actions.add(new RetrieveProfileAction(recipientId));
                 exception = new UntrustedIdentityException(account.getRecipientAddressResolver()
-                        .resolveRecipientAddress(recipientId), e.getSenderDevice());
+                        .resolveRecipientAddress(recipientId)
+                        .toApiRecipientAddress(), e.getSenderDevice());
             } catch (ProtocolInvalidKeyIdException | ProtocolInvalidKeyException | ProtocolNoSessionException |
                      ProtocolInvalidMessageException e) {
                 logger.debug("Failed to decrypt incoming message", e);
index d3c1ef5629e135a6cb27597f095497368ce00d09..09ca1a4043552039e3de93890bd769a8fdeb2933 100644 (file)
@@ -212,7 +212,7 @@ public class ReceiveHelper {
                 if (exception instanceof UntrustedIdentityException) {
                     logger.debug("Keeping message with untrusted identity in message cache");
                     final var address = ((UntrustedIdentityException) exception).getSender();
-                    final var recipientId = account.getRecipientResolver().resolveRecipient(address);
+                    final var recipientId = account.getRecipientResolver().resolveRecipient(address.getServiceId());
                     if (!envelope.hasSourceUuid()) {
                         try {
                             cachedMessage[0] = account.getMessageCache().replaceSender(cachedMessage[0], recipientId);
@@ -260,7 +260,7 @@ public class ReceiveHelper {
             }
             if (!envelope.hasSourceUuid()) {
                 final var identifier = ((UntrustedIdentityException) exception).getSender();
-                final var recipientId = account.getRecipientResolver().resolveRecipient(identifier);
+                final var recipientId = account.getRecipientResolver().resolveRecipient(identifier.getServiceId());
                 try {
                     account.getMessageCache().replaceSender(cachedMessage, recipientId);
                 } catch (IOException ioException) {
index c8e5859ad3ef476750b4ec4056fa849dd13a4722..d87b2c53d937e1696d61dca943de4e2dbe1d6d9c 100644 (file)
@@ -6,7 +6,6 @@ import org.asamk.signal.manager.api.UnregisteredRecipientException;
 import org.asamk.signal.manager.config.ServiceConfig;
 import org.asamk.signal.manager.config.ServiceEnvironmentConfig;
 import org.asamk.signal.manager.storage.SignalAccount;
-import org.asamk.signal.manager.storage.recipients.RecipientAddress;
 import org.asamk.signal.manager.storage.recipients.RecipientId;
 import org.signal.libsignal.protocol.InvalidKeyException;
 import org.slf4j.Logger;
@@ -44,7 +43,7 @@ public class RecipientHelper {
 
     public SignalServiceAddress resolveSignalServiceAddress(RecipientId recipientId) {
         final var address = account.getRecipientAddressResolver().resolveRecipientAddress(recipientId);
-        if (address.number().isEmpty() || address.uuid().isPresent()) {
+        if (address.number().isEmpty() || address.serviceId().isPresent()) {
             return address.toSignalServiceAddress();
         }
 
@@ -127,11 +126,11 @@ public class RecipientHelper {
         try {
             aciMap = getRegisteredUsers(Set.of(number));
         } catch (NumberFormatException e) {
-            throw new UnregisteredRecipientException(new RecipientAddress(null, number));
+            throw new UnregisteredRecipientException(new org.asamk.signal.manager.api.RecipientAddress(null, number));
         }
         final var uuid = aciMap.get(number);
         if (uuid == null) {
-            throw new UnregisteredRecipientException(new RecipientAddress(null, number));
+            throw new UnregisteredRecipientException(new org.asamk.signal.manager.api.RecipientAddress(null, number));
         }
         return uuid;
     }
index 15684da54b03a91e6e21b36fa429d1eb48093e0d..257cea8373bb68cfd6616aac4defc70b13dc7e7c 100644 (file)
@@ -101,8 +101,7 @@ public class StorageHelper {
         }
 
         final var contactRecord = record.getContact().get();
-        final var address = new RecipientAddress(contactRecord.getServiceId().uuid(),
-                contactRecord.getNumber().orElse(null));
+        final var address = new RecipientAddress(contactRecord.getServiceId(), contactRecord.getNumber().orElse(null));
         final var recipientId = account.getRecipientResolver().resolveRecipient(address);
 
         final var contact = account.getContactStore().getContact(recipientId);
index 335aece5333a49b05c744cc66b88ee3e11b8f423..6c179b6d4ad85d06ad00739edb5d1135b626b934 100644 (file)
@@ -417,8 +417,8 @@ public class SignalAccount implements Closeable {
         getRecipientStore().deleteRecipientData(recipientId);
         getMessageCache().deleteMessages(recipientId);
         final var recipientAddress = getRecipientStore().resolveRecipientAddress(recipientId);
-        if (recipientAddress.uuid().isPresent()) {
-            final var serviceId = ServiceId.from(recipientAddress.uuid().get());
+        if (recipientAddress.serviceId().isPresent()) {
+            final var serviceId = recipientAddress.serviceId().get();
             getAciSessionStore().deleteAllSessions(serviceId);
             getPniSessionStore().deleteAllSessions(serviceId);
             getIdentityKeyStore().deleteIdentity(serviceId);
@@ -791,7 +791,7 @@ public class SignalAccount implements Closeable {
         if (legacySignalProtocolStore != null && legacySignalProtocolStore.getLegacyIdentityKeyStore() != null) {
             logger.debug("Migrating legacy identity session store.");
             for (var identity : legacySignalProtocolStore.getLegacyIdentityKeyStore().getIdentities()) {
-                if (identity.getAddress().uuid().isEmpty()) {
+                if (identity.getAddress().serviceId().isEmpty()) {
                     continue;
                 }
                 final var serviceId = identity.getAddress().getServiceId();
@@ -1324,7 +1324,7 @@ public class SignalAccount implements Closeable {
     }
 
     public RecipientAddress getSelfRecipientAddress() {
-        return new RecipientAddress(aci == null ? null : aci.uuid(), number);
+        return new RecipientAddress(aci, pni, number);
     }
 
     public RecipientId getSelfRecipientId() {
index 10a450513d907499817a903e139e950f0ee69d10..1c75d9cc8faf679ff8a4a4ca9c82e548a1efe7fc 100644 (file)
@@ -12,6 +12,7 @@ import com.fasterxml.jackson.databind.SerializationFeature;
 import org.asamk.signal.manager.storage.recipients.RecipientAddress;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.whispersystems.signalservice.api.push.ServiceId;
 import org.whispersystems.signalservice.api.push.ServiceIdType;
 import org.whispersystems.signalservice.api.util.UuidUtil;
 
@@ -57,7 +58,7 @@ public class Utils {
 
     public static RecipientAddress getRecipientAddressFromIdentifier(final String identifier) {
         if (UuidUtil.isUuid(identifier)) {
-            return new RecipientAddress(UuidUtil.parseOrThrow(identifier));
+            return new RecipientAddress(ServiceId.parseOrThrow(identifier));
         } else {
             return new RecipientAddress(Optional.empty(), Optional.of(identifier));
         }
index 6c6bd7eae4311cde301d496d5aa29a98028b5a66..0d297e7f625fd55834126ef69eb5c0b6ff3e991f 100644 (file)
@@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 import org.asamk.signal.manager.storage.recipients.RecipientAddress;
+import org.whispersystems.signalservice.api.push.ServiceId;
 
 import java.util.UUID;
 
@@ -43,6 +44,6 @@ public class LegacyContactInfo {
 
     @JsonIgnore
     public RecipientAddress getAddress() {
-        return new RecipientAddress(uuid, number);
+        return new RecipientAddress(uuid == null ? null : ServiceId.from(uuid), number);
     }
 }
index 0b5a7d4b39ea45520a59817b8186a47387da4c80..ad42984fbe4da146b154652a74c6d409b9cca168 100644 (file)
@@ -18,7 +18,7 @@ import org.signal.storageservice.protos.groups.local.DecryptedGroup;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.whispersystems.signalservice.api.push.DistributionId;
-import org.whispersystems.signalservice.api.util.UuidUtil;
+import org.whispersystems.signalservice.api.push.ServiceId;
 import org.whispersystems.signalservice.internal.util.Hex;
 
 import java.io.File;
@@ -45,7 +45,7 @@ public class LegacyGroupStore {
             if (g instanceof Storage.GroupV1 g1) {
                 final var members = g1.members.stream().map(m -> {
                     if (m.recipientId == null) {
-                        return recipientResolver.resolveRecipient(new RecipientAddress(UuidUtil.parseOrNull(m.uuid),
+                        return recipientResolver.resolveRecipient(new RecipientAddress(ServiceId.parseOrNull(m.uuid),
                                 m.number));
                     }
 
index 99e2980eb7dc2fb1db64315ec4d4752ebdc78f70..cf1002576a6ceca604db7379dde6f932f55cd31b 100644 (file)
@@ -11,7 +11,7 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import org.asamk.signal.manager.storage.recipients.RecipientAddress;
 import org.signal.libsignal.zkgroup.InvalidInputException;
 import org.signal.libsignal.zkgroup.profiles.ProfileKey;
-import org.whispersystems.signalservice.api.util.UuidUtil;
+import org.whispersystems.signalservice.api.push.ServiceId;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -43,8 +43,8 @@ public class LegacyProfileStore {
             if (node.isArray()) {
                 for (var entry : node) {
                     var name = entry.hasNonNull("name") ? entry.get("name").asText() : null;
-                    var uuid = entry.hasNonNull("uuid") ? UuidUtil.parseOrNull(entry.get("uuid").asText()) : null;
-                    final var address = new RecipientAddress(uuid, name);
+                    var serviceId = entry.hasNonNull("uuid") ? ServiceId.parseOrNull(entry.get("uuid").asText()) : null;
+                    final var address = new RecipientAddress(serviceId, name);
                     ProfileKey profileKey = null;
                     try {
                         profileKey = new ProfileKey(Base64.getDecoder().decode(entry.get("profileKey").asText()));
index de5062e47cc370894ab8021145238cf167d38f75..4d94b455ed3f17172337ad4b692a673b62baa577 100644 (file)
@@ -13,6 +13,7 @@ import org.signal.libsignal.protocol.IdentityKeyPair;
 import org.signal.libsignal.protocol.InvalidKeyException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.whispersystems.signalservice.api.push.ServiceId;
 import org.whispersystems.signalservice.api.util.UuidUtil;
 
 import java.io.IOException;
@@ -100,7 +101,7 @@ public class LegacyJsonIdentityKeyStore {
                             : null;
                     final var address = uuid == null
                             ? Utils.getRecipientAddressFromIdentifier(trustedKeyName)
-                            : new RecipientAddress(uuid, trustedKeyName);
+                            : new RecipientAddress(ServiceId.from(uuid), trustedKeyName);
                     try {
                         var id = new IdentityKey(Base64.getDecoder().decode(trustedKey.get("identityKey").asText()), 0);
                         var trustLevel = trustedKey.hasNonNull("trustLevel") ? TrustLevel.fromInt(trustedKey.get(
index 9ee0cf8714c5362c4ea27c390f23900711741941..df8f5cdada759a5df449602a70eb0fe950b395ec 100644 (file)
@@ -7,6 +7,7 @@ import com.fasterxml.jackson.databind.JsonNode;
 
 import org.asamk.signal.manager.storage.Utils;
 import org.asamk.signal.manager.storage.recipients.RecipientAddress;
+import org.whispersystems.signalservice.api.push.ServiceId;
 import org.whispersystems.signalservice.api.util.UuidUtil;
 
 import java.io.IOException;
@@ -47,7 +48,7 @@ public class LegacyJsonSessionStore {
                     var uuid = session.hasNonNull("uuid") ? UuidUtil.parseOrNull(session.get("uuid").asText()) : null;
                     final var address = uuid == null
                             ? Utils.getRecipientAddressFromIdentifier(sessionName)
-                            : new RecipientAddress(uuid, sessionName);
+                            : new RecipientAddress(ServiceId.from(uuid), sessionName);
                     final var deviceId = session.get("deviceId").asInt();
                     final var record = Base64.getDecoder().decode(session.get("record").asText());
                     var sessionInfo = new LegacySessionInfo(address, deviceId, record);
index 2aeb349f4645ad6ca5294425fffb4d4a22d67c7c..039e8471a5d1034d1945a2bf26b3f229d7529f6e 100644 (file)
@@ -7,7 +7,7 @@ import com.fasterxml.jackson.databind.JsonDeserializer;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 
-import org.whispersystems.signalservice.api.util.UuidUtil;
+import org.whispersystems.signalservice.api.push.ServiceId;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -36,8 +36,8 @@ public class LegacyRecipientStore {
             if (node.isArray()) {
                 for (var recipient : node) {
                     var recipientName = recipient.get("name").asText();
-                    var uuid = UuidUtil.parseOrThrow(recipient.get("uuid").asText());
-                    addresses.add(new RecipientAddress(uuid, recipientName));
+                    var serviceId = ServiceId.parseOrThrow(recipient.get("uuid").asText());
+                    addresses.add(new RecipientAddress(serviceId, recipientName));
                 }
             }
 
index 0c05e0c055de2216448bfd57fcac737d2d51d6ee..57a606744896ce0c2e5c9610dbc2dda3a42944ec 100644 (file)
@@ -6,7 +6,7 @@ import org.signal.libsignal.zkgroup.profiles.ExpiringProfileKeyCredential;
 import org.signal.libsignal.zkgroup.profiles.ProfileKey;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.whispersystems.signalservice.api.util.UuidUtil;
+import org.whispersystems.signalservice.api.push.ServiceId;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -31,7 +31,7 @@ public class LegacyRecipientStore2 {
 
             final var recipients = storage.recipients.stream().map(r -> {
                 final var recipientId = new RecipientId(r.id, recipientStore);
-                final var address = new RecipientAddress(Optional.ofNullable(r.uuid).map(UuidUtil::parseOrThrow),
+                final var address = new RecipientAddress(Optional.ofNullable(r.uuid).map(ServiceId::parseOrThrow),
                         Optional.ofNullable(r.number));
 
                 Contact contact = null;
index c5f0ccbce26ac57d6cc71c404934b2068eb484b4..c3b18299c44393990007a5a1df37913a49be3e34 100644 (file)
@@ -1,47 +1,61 @@
 package org.asamk.signal.manager.storage.recipients;
 
+import org.whispersystems.signalservice.api.push.PNI;
 import org.whispersystems.signalservice.api.push.ServiceId;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 
 import java.util.Optional;
-import java.util.UUID;
 
-public record RecipientAddress(Optional<UUID> uuid, Optional<String> number) {
-
-    public static final UUID UNKNOWN_UUID = ServiceId.UNKNOWN.uuid();
+public record RecipientAddress(Optional<ServiceId> serviceId, Optional<PNI> pni, Optional<String> number) {
 
     /**
      * Construct a RecipientAddress.
      *
-     * @param uuid   The UUID of the user, if available.
-     * @param number The phone number of the user, if available.
+     * @param serviceId The ACI or PNI of the user, if available.
+     * @param number    The phone number of the user, if available.
      */
     public RecipientAddress {
-        uuid = uuid.isPresent() && uuid.get().equals(UNKNOWN_UUID) ? Optional.empty() : uuid;
-        if (uuid.isEmpty() && number.isEmpty()) {
-            throw new AssertionError("Must have either a UUID or E164 number!");
+        if (serviceId.isPresent() && serviceId.get().equals(ServiceId.UNKNOWN)) {
+            serviceId = Optional.empty();
+        }
+        if (pni.isPresent() && pni.get().equals(ServiceId.UNKNOWN)) {
+            pni = Optional.empty();
+        }
+        if (serviceId.isEmpty() && pni.isPresent()) {
+            serviceId = Optional.of(pni.get());
         }
+        if (serviceId.isEmpty() && number.isEmpty()) {
+            throw new AssertionError("Must have either a ServiceId or E164 number!");
+        }
+    }
+
+    public RecipientAddress(Optional<ServiceId> serviceId, Optional<String> number) {
+        this(serviceId, Optional.empty(), number);
+    }
+
+    public RecipientAddress(ServiceId serviceId, String e164) {
+        this(Optional.ofNullable(serviceId), Optional.empty(), Optional.ofNullable(e164));
     }
 
-    public RecipientAddress(UUID uuid, String e164) {
-        this(Optional.ofNullable(uuid), Optional.ofNullable(e164));
+    public RecipientAddress(ServiceId serviceId, PNI pni, String e164) {
+        this(Optional.ofNullable(serviceId), Optional.ofNullable(pni), Optional.ofNullable(e164));
     }
 
     public RecipientAddress(SignalServiceAddress address) {
-        this(Optional.of(address.getServiceId().uuid()), address.getNumber());
+        this(Optional.of(address.getServiceId()), Optional.empty(), address.getNumber());
     }
 
-    public RecipientAddress(UUID uuid) {
-        this(Optional.of(uuid), Optional.empty());
+    public RecipientAddress(ServiceId serviceId) {
+        this(Optional.of(serviceId), Optional.empty());
     }
 
     public ServiceId getServiceId() {
-        return ServiceId.from(uuid.orElse(UNKNOWN_UUID));
+        return serviceId.orElse(ServiceId.UNKNOWN);
     }
 
     public String getIdentifier() {
-        if (uuid.isPresent()) {
-            return uuid.get().toString();
+        if (serviceId.isPresent()) {
+            return serviceId.get().toString();
         } else if (number.isPresent()) {
             return number.get();
         } else {
@@ -52,15 +66,25 @@ public record RecipientAddress(Optional<UUID> uuid, Optional<String> number) {
     public String getLegacyIdentifier() {
         if (number.isPresent()) {
             return number.get();
-        } else if (uuid.isPresent()) {
-            return uuid.get().toString();
+        } else if (serviceId.isPresent()) {
+            return serviceId.get().toString();
         } else {
             throw new AssertionError("Given the checks in the constructor, this should not be possible.");
         }
     }
 
     public boolean matches(RecipientAddress other) {
-        return (uuid.isPresent() && other.uuid.isPresent() && uuid.get().equals(other.uuid.get())) || (
+        return (serviceId.isPresent() && other.serviceId.isPresent() && serviceId.get().equals(other.serviceId.get()))
+                || (
+                pni.isPresent() && other.serviceId.isPresent() && pni.get().equals(other.serviceId.get())
+        )
+                || (
+                serviceId.isPresent() && other.pni.isPresent() && serviceId.get().equals(other.pni.get())
+        )
+                || (
+                pni.isPresent() && other.pni.isPresent() && pni.get().equals(other.pni.get())
+        )
+                || (
                 number.isPresent() && other.number.isPresent() && number.get().equals(other.number.get())
         );
     }
@@ -68,4 +92,8 @@ public record RecipientAddress(Optional<UUID> uuid, Optional<String> number) {
     public SignalServiceAddress toSignalServiceAddress() {
         return new SignalServiceAddress(getServiceId(), number);
     }
+
+    public org.asamk.signal.manager.api.RecipientAddress toApiRecipientAddress() {
+        return new org.asamk.signal.manager.api.RecipientAddress(serviceId().map(ServiceId::uuid), number());
+    }
 }
index f20e4bbb594c0e837db3b121e088d9d7ce67fffd..85ece822b821ca9954041d0a43b3f4349d65543a 100644 (file)
@@ -19,6 +19,6 @@ public interface RecipientResolver {
     }
 
     default RecipientId resolveRecipient(ServiceId serviceId) {
-        return resolveRecipient(new RecipientAddress(serviceId.uuid()));
+        return resolveRecipient(new RecipientAddress(serviceId));
     }
 }
index 1a42846751dffc3fd6f6a88a48082fcfa958cfa5..7b57f2c9b19a073a63102c99b09b34017306eb28 100644 (file)
@@ -28,7 +28,6 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
-import java.util.UUID;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
@@ -163,13 +162,13 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re
         } catch (SQLException e) {
             throw new RuntimeException("Failed read from recipient store", e);
         }
-        if (byNumber.isEmpty() || byNumber.get().address().uuid().isEmpty()) {
+        if (byNumber.isEmpty() || byNumber.get().address().serviceId().isEmpty()) {
             final var aci = aciSupplier.get();
             if (aci == null) {
-                throw new UnregisteredRecipientException(new RecipientAddress(null, number));
+                throw new UnregisteredRecipientException(new org.asamk.signal.manager.api.RecipientAddress(null, number));
             }
 
-            return resolveRecipient(new RecipientAddress(aci.uuid(), number), false, false);
+            return resolveRecipient(new RecipientAddress(aci, number), false, false);
         }
         return byNumber.get().id();
     }
@@ -399,7 +398,12 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re
                 for (final var recipient : recipients.values()) {
                     statement.setLong(1, recipient.getRecipientId().id());
                     statement.setString(2, recipient.getAddress().number().orElse(null));
-                    statement.setBytes(3, recipient.getAddress().uuid().map(UuidUtil::toByteArray).orElse(null));
+                    statement.setBytes(3,
+                            recipient.getAddress()
+                                    .serviceId()
+                                    .map(ServiceId::uuid)
+                                    .map(UuidUtil::toByteArray)
+                                    .orElse(null));
                     statement.executeUpdate();
                 }
             }
@@ -576,22 +580,22 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re
         final var byNumber = address.number().isEmpty()
                 ? Optional.<RecipientWithAddress>empty()
                 : findByNumber(connection, address.number().get());
-        final var byUuid = address.uuid().isEmpty()
+        final var byUuid = address.serviceId().isEmpty()
                 ? Optional.<RecipientWithAddress>empty()
-                : findByUuid(connection, address.uuid().get());
+                : findByServiceId(connection, address.serviceId().get());
 
         if (byNumber.isEmpty() && byUuid.isEmpty()) {
             logger.debug("Got new recipient, both uuid and number are unknown");
 
-            if (isHighTrust || address.uuid().isEmpty() || address.number().isEmpty()) {
+            if (isHighTrust || address.serviceId().isEmpty() || address.number().isEmpty()) {
                 return new Pair<>(addNewRecipient(connection, address), Optional.empty());
             }
 
-            return new Pair<>(addNewRecipient(connection, new RecipientAddress(address.uuid().get())),
+            return new Pair<>(addNewRecipient(connection, new RecipientAddress(address.serviceId().get())),
                     Optional.empty());
         }
 
-        if (!isHighTrust || address.uuid().isEmpty() || address.number().isEmpty() || byNumber.equals(byUuid)) {
+        if (!isHighTrust || address.serviceId().isEmpty() || address.number().isEmpty() || byNumber.equals(byUuid)) {
             return new Pair<>(byUuid.or(() -> byNumber).map(RecipientWithAddress::id).get(), Optional.empty());
         }
 
@@ -604,14 +608,14 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re
         final var byNumberRecipient = byNumber.get();
 
         if (byUuid.isEmpty()) {
-            if (byNumberRecipient.address().uuid().isPresent()) {
+            if (byNumberRecipient.address().serviceId().isPresent()) {
                 logger.debug(
                         "Got recipient {} existing with number, but different uuid, so stripping its number and adding new recipient",
                         byNumberRecipient.id());
 
                 updateRecipientAddress(connection,
                         byNumberRecipient.id(),
-                        new RecipientAddress(byNumberRecipient.address().uuid().get()));
+                        new RecipientAddress(byNumberRecipient.address().serviceId().get()));
                 return new Pair<>(addNewRecipient(connection, address), Optional.empty());
             }
 
@@ -623,7 +627,7 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re
 
         final var byUuidRecipient = byUuid.get();
 
-        if (byNumberRecipient.address().uuid().isPresent()) {
+        if (byNumberRecipient.address().serviceId().isPresent()) {
             logger.debug(
                     "Got separate recipients for high trust number {} and uuid {}, recipient for number has different uuid, so stripping its number",
                     byNumberRecipient.id(),
@@ -631,7 +635,7 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re
 
             updateRecipientAddress(connection,
                     byNumberRecipient.id(),
-                    new RecipientAddress(byNumberRecipient.address().uuid().get()));
+                    new RecipientAddress(byNumberRecipient.address().serviceId().get()));
             updateRecipientAddress(connection, byUuidRecipient.id(), address);
             return new Pair<>(byUuidRecipient.id(), Optional.empty());
         }
@@ -658,7 +662,7 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re
         ).formatted(TABLE_RECIPIENT);
         try (final var statement = connection.prepareStatement(sql)) {
             statement.setString(1, address.number().orElse(null));
-            statement.setBytes(2, address.uuid().map(UuidUtil::toByteArray).orElse(null));
+            statement.setBytes(2, address.serviceId().map(ServiceId::uuid).map(UuidUtil::toByteArray).orElse(null));
             statement.executeUpdate();
             final var generatedKeys = statement.getGeneratedKeys();
             if (generatedKeys.next()) {
@@ -697,7 +701,7 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re
         ).formatted(TABLE_RECIPIENT);
         try (final var statement = connection.prepareStatement(sql)) {
             statement.setString(1, address.number().orElse(null));
-            statement.setBytes(2, address.uuid().map(UuidUtil::toByteArray).orElse(null));
+            statement.setBytes(2, address.serviceId().map(ServiceId::uuid).map(UuidUtil::toByteArray).orElse(null));
             statement.setLong(3, recipientId.id());
             statement.executeUpdate();
         }
@@ -761,8 +765,8 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re
         }
     }
 
-    private Optional<RecipientWithAddress> findByUuid(
-            final Connection connection, final UUID uuid
+    private Optional<RecipientWithAddress> findByServiceId(
+            final Connection connection, final ServiceId serviceId
     ) throws SQLException {
         final var sql = """
                         SELECT r._id, r.number, r.uuid
@@ -770,7 +774,7 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re
                         WHERE r.uuid = ?
                         """.formatted(TABLE_RECIPIENT);
         try (final var statement = connection.prepareStatement(sql)) {
-            statement.setBytes(1, UuidUtil.toByteArray(uuid));
+            statement.setBytes(1, UuidUtil.toByteArray(serviceId.uuid()));
             return Utils.executeQueryForOptional(statement, this::getRecipientWithAddressFromResultSet);
         }
     }
@@ -835,9 +839,9 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re
     }
 
     private RecipientAddress getRecipientAddressFromResultSet(ResultSet resultSet) throws SQLException {
-        final var uuid = Optional.ofNullable(resultSet.getBytes("uuid")).map(UuidUtil::parseOrNull);
+        final var serviceId = Optional.ofNullable(resultSet.getBytes("uuid")).map(ServiceId::parseOrNull);
         final var number = Optional.ofNullable(resultSet.getString("number"));
-        return new RecipientAddress(uuid, number);
+        return new RecipientAddress(serviceId, Optional.empty(), number);
     }
 
     private RecipientId getRecipientIdFromResultSet(ResultSet resultSet) throws SQLException {
index f5a1fc53e11f8506385b46826100d0f6c1469542..d17941567a93a1e0358cc32a23a0f4b46e088171 100644 (file)
@@ -8,7 +8,6 @@ import org.signal.libsignal.protocol.InvalidMessageException;
 import org.signal.libsignal.protocol.groups.state.SenderKeyRecord;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.whispersystems.signalservice.api.push.ServiceId;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -38,13 +37,11 @@ public class LegacySenderKeyRecordStore {
 
         final var senderKeys = parseFileNames(files, resolver).stream().map(key -> {
             final var record = loadSenderKeyLocked(key, senderKeysPath);
-            final var uuid = addressResolver.resolveRecipientAddress(key.recipientId).uuid();
-            if (record == null || uuid.isEmpty()) {
+            final var serviceId = addressResolver.resolveRecipientAddress(key.recipientId).serviceId();
+            if (record == null || serviceId.isEmpty()) {
                 return null;
             }
-            return new Pair<>(new SenderKeyRecordStore.Key(ServiceId.from(uuid.get()),
-                    key.deviceId,
-                    key.distributionId), record);
+            return new Pair<>(new SenderKeyRecordStore.Key(serviceId.get(), key.deviceId, key.distributionId), record);
         }).filter(Objects::nonNull).toList();
 
         senderKeyStore.addLegacySenderKeys(senderKeys);
index dfbc2ff99cd41fa01c35cb9bcca470af9b9bd84f..cfc36539ecea9b41e7b302a48239185a9f6ffa2d 100644 (file)
@@ -7,7 +7,6 @@ import org.asamk.signal.manager.storage.senderKeys.SenderKeySharedStore.SenderKe
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.whispersystems.signalservice.api.push.DistributionId;
-import org.whispersystems.signalservice.api.push.ServiceId;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -37,11 +36,11 @@ public class LegacySenderKeySharedStore {
                 if (recipientId == null) {
                     continue;
                 }
-                final var uuid = addressResolver.resolveRecipientAddress(recipientId).uuid();
-                if (uuid.isEmpty()) {
+                final var serviceId = addressResolver.resolveRecipientAddress(recipientId).serviceId();
+                if (serviceId.isEmpty()) {
                     continue;
                 }
-                final var entry = new SenderKeySharedEntry(ServiceId.from(uuid.get()), senderKey.deviceId);
+                final var entry = new SenderKeySharedEntry(serviceId.get(), senderKey.deviceId);
                 final var distributionId = DistributionId.from(senderKey.distributionId);
                 var entries = sharedSenderKeys.get(distributionId);
                 if (entries == null) {
index 1682b71472ed8c756359a1bfb1cfe0b99a4f99bd..71cd92310c0801eb5372ff18f91aa245dcf6726a 100644 (file)
@@ -8,7 +8,6 @@ import org.asamk.signal.manager.util.IOUtils;
 import org.signal.libsignal.protocol.state.SessionRecord;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.whispersystems.signalservice.api.push.ServiceId;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -34,11 +33,11 @@ public class LegacySessionStore {
         final var keys = getKeysLocked(sessionsPath, resolver);
         final var sessions = keys.stream().map(key -> {
             final var record = loadSessionLocked(key, sessionsPath);
-            final var uuid = addressResolver.resolveRecipientAddress(key.recipientId).uuid();
-            if (record == null || uuid.isEmpty()) {
+            final var serviceId = addressResolver.resolveRecipientAddress(key.recipientId).serviceId();
+            if (record == null || serviceId.isEmpty()) {
                 return null;
             }
-            return new Pair<>(new SessionStore.Key(ServiceId.from(uuid.get()), key.deviceId()), record);
+            return new Pair<>(new SessionStore.Key(serviceId.get(), key.deviceId()), record);
         }).filter(Objects::nonNull).toList();
         sessionStore.addLegacySessions(sessions);
         deleteAllSessions(sessionsPath);
index 97adb69d1013933561b8315e7acbdab2cf00d3cb..c50988a1f2801bcb6f4767a72521f11f9994d610 100644 (file)
@@ -87,7 +87,7 @@ public class Utils {
             version = 1;
             ownId = ownAddress.number().get().getBytes();
             theirId = theirAddress.number().get().getBytes();
-        } else if (isUuidCapable && theirAddress.uuid().isPresent()) {
+        } else if (isUuidCapable && theirAddress.serviceId().isPresent()) {
             // Version 2: UUID user
             version = 2;
             ownId = ownAddress.getServiceId().toByteArray();
index 10f7370675b57d228358f01bc52150a4456f9761..f46a76f2ea7ef237971570bb69fffb001257026b 100644 (file)
@@ -2,10 +2,10 @@ package org.asamk.signal;
 
 import org.asamk.signal.manager.Manager;
 import org.asamk.signal.manager.api.MessageEnvelope;
+import org.asamk.signal.manager.api.RecipientAddress;
 import org.asamk.signal.manager.api.RecipientIdentifier;
 import org.asamk.signal.manager.api.UntrustedIdentityException;
 import org.asamk.signal.manager.groups.GroupId;
-import org.asamk.signal.manager.storage.recipients.RecipientAddress;
 import org.asamk.signal.output.PlainTextWriter;
 import org.asamk.signal.util.DateUtils;
 import org.asamk.signal.util.Hex;
index c08571f7e599d35ba2a5272e034a9ae6aed3ed73..91272da56f2633de6676b5aa65df31b7d996636e 100644 (file)
@@ -7,7 +7,7 @@ import net.sourceforge.argparse4j.inf.Subparser;
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.manager.Manager;
 import org.asamk.signal.manager.api.Group;
-import org.asamk.signal.manager.storage.recipients.RecipientAddress;
+import org.asamk.signal.manager.api.RecipientAddress;
 import org.asamk.signal.output.JsonWriter;
 import org.asamk.signal.output.OutputWriter;
 import org.asamk.signal.output.PlainTextWriter;
index b78f8022b8feced5761313c512b11a726f604184..bbfa4f1c207761e93020cf031c2e59c64bce60ab 100644 (file)
@@ -15,6 +15,8 @@ import org.asamk.signal.manager.api.MessageEnvelope;
 import org.asamk.signal.manager.api.NotPrimaryDeviceException;
 import org.asamk.signal.manager.api.Pair;
 import org.asamk.signal.manager.api.ReceiveConfig;
+import org.asamk.signal.manager.api.Recipient;
+import org.asamk.signal.manager.api.RecipientAddress;
 import org.asamk.signal.manager.api.RecipientIdentifier;
 import org.asamk.signal.manager.api.SendGroupMessageResults;
 import org.asamk.signal.manager.api.SendMessageResults;
@@ -34,8 +36,6 @@ import org.asamk.signal.manager.groups.LastGroupAdminException;
 import org.asamk.signal.manager.groups.NotAGroupMemberException;
 import org.asamk.signal.manager.storage.recipients.Contact;
 import org.asamk.signal.manager.storage.recipients.Profile;
-import org.asamk.signal.manager.storage.recipients.Recipient;
-import org.asamk.signal.manager.storage.recipients.RecipientAddress;
 import org.freedesktop.dbus.DBusMap;
 import org.freedesktop.dbus.DBusPath;
 import org.freedesktop.dbus.connections.impl.DBusConnection;
index dcea2bf1e674733d16fa7f77e2dd87d0d2260622..66c1fd6566e9602fe18c4b1af798e6465cbb9e79 100644 (file)
@@ -3,8 +3,8 @@ package org.asamk.signal.dbus;
 import org.asamk.Signal;
 import org.asamk.signal.manager.Manager;
 import org.asamk.signal.manager.api.MessageEnvelope;
+import org.asamk.signal.manager.api.RecipientAddress;
 import org.asamk.signal.manager.groups.GroupId;
-import org.asamk.signal.manager.storage.recipients.RecipientAddress;
 import org.freedesktop.dbus.connections.impl.DBusConnection;
 import org.freedesktop.dbus.exceptions.DBusException;
 import org.freedesktop.dbus.types.Variant;
index 4b5b3ba84714513359fe386ff520ec25880df035..92e9215704b2f303674ce8ecc21f2a7a61d38207 100644 (file)
@@ -11,6 +11,7 @@ import org.asamk.signal.manager.api.InvalidStickerException;
 import org.asamk.signal.manager.api.Message;
 import org.asamk.signal.manager.api.NotPrimaryDeviceException;
 import org.asamk.signal.manager.api.PendingAdminApprovalException;
+import org.asamk.signal.manager.api.RecipientAddress;
 import org.asamk.signal.manager.api.RecipientIdentifier;
 import org.asamk.signal.manager.api.SendMessageResult;
 import org.asamk.signal.manager.api.SendMessageResults;
@@ -28,7 +29,6 @@ import org.asamk.signal.manager.groups.GroupPermission;
 import org.asamk.signal.manager.groups.GroupSendingNotAllowedException;
 import org.asamk.signal.manager.groups.LastGroupAdminException;
 import org.asamk.signal.manager.groups.NotAGroupMemberException;
-import org.asamk.signal.manager.storage.recipients.RecipientAddress;
 import org.asamk.signal.util.SendMessageResultUtils;
 import org.freedesktop.dbus.DBusPath;
 import org.freedesktop.dbus.connections.impl.DBusConnection;
index adc7a251032cb878b26a7fadcc12e3c78dccaa94..c32de61a96c3b452100d61009dc53f4bafef66c7 100644 (file)
@@ -4,9 +4,9 @@ import com.fasterxml.jackson.annotation.JsonInclude;
 
 import org.asamk.signal.manager.Manager;
 import org.asamk.signal.manager.api.MessageEnvelope;
+import org.asamk.signal.manager.api.RecipientAddress;
 import org.asamk.signal.manager.api.RecipientIdentifier;
 import org.asamk.signal.manager.api.UntrustedIdentityException;
-import org.asamk.signal.manager.storage.recipients.RecipientAddress;
 
 import java.util.UUID;
 
index 1bd09e83fd02365fdc1f500a0deb96af23cf3cde..e25385b6908e9e2d5e4a6470bf1821bf8a753a6d 100644 (file)
@@ -1,6 +1,6 @@
 package org.asamk.signal.json;
 
-import org.asamk.signal.manager.storage.recipients.RecipientAddress;
+import org.asamk.signal.manager.api.RecipientAddress;
 
 import java.util.UUID;
 
index a251d0078045f8d1ca50aeb1fbbe6e5aaba33e2a..802c07d59862e457746de6f2fcb269b7314ee222 100644 (file)
@@ -3,8 +3,8 @@ package org.asamk.signal.json;
 import com.fasterxml.jackson.annotation.JsonInclude;
 
 import org.asamk.signal.manager.api.MessageEnvelope;
+import org.asamk.signal.manager.api.RecipientAddress;
 import org.asamk.signal.manager.groups.GroupId;
-import org.asamk.signal.manager.storage.recipients.RecipientAddress;
 
 import java.util.List;