]> nmode's Git Repositories - signal-cli/commitdiff
Update libsignal-service
authorAsamK <asamk@gmx.de>
Sun, 6 Aug 2023 14:24:30 +0000 (16:24 +0200)
committerAsamK <asamk@gmx.de>
Sun, 6 Aug 2023 17:09:11 +0000 (19:09 +0200)
27 files changed:
CHANGELOG.md
graalvm-config-dir/reflect-config.json
lib/src/main/java/org/asamk/signal/manager/api/RecipientAddress.java
lib/src/main/java/org/asamk/signal/manager/helper/AccountFileUpdater.java
lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java
lib/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java
lib/src/main/java/org/asamk/signal/manager/helper/GroupV2Helper.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/SendHelper.java
lib/src/main/java/org/asamk/signal/manager/helper/StorageHelper.java
lib/src/main/java/org/asamk/signal/manager/internal/AccountFileUpdaterImpl.java
lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java
lib/src/main/java/org/asamk/signal/manager/internal/RegistrationManagerImpl.java
lib/src/main/java/org/asamk/signal/manager/storage/AccountDatabase.java
lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java
lib/src/main/java/org/asamk/signal/manager/storage/accounts/AccountsStore.java
lib/src/main/java/org/asamk/signal/manager/storage/contacts/LegacyContactInfo.java
lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupInfoV2.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/RecipientAddress.java
lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java
lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientTrustedResolver.java
lib/src/test/java/org/asamk/signal/manager/storage/recipients/MergeRecipientHelperTest.java
settings.gradle.kts

index d8cbe4fce6862d147bfd62da7dd3d03d9311972b..08d45108ddc5849171329b6e6fd5edf67b406316 100644 (file)
@@ -1,6 +1,7 @@
 # Changelog
 
 ## [Unreleased]
+**Attention**: Now requires native libsignal-client version 0.30.0
 
 ## [0.11.11] - 2023-05-24
 **Attention**: Now requires native libsignal-client version 0.25.0
index 676be954c2d6e03821241188ed6fd6a7475a0099..5bb16c8788a90966262ba6e9ec4fb1e9f5dcb945 100644 (file)
 },
 {
   "name":"org.signal.storageservice.protos.groups.local.DecryptedBannedMember",
-  "fields":[{"name":"timestamp_"}, {"name":"uuid_"}]
+  "fields":[{"name":"serviceIdBinary_"}, {"name":"timestamp_"}, {"name":"uuid_"}]
 },
 {
   "name":"org.signal.storageservice.protos.groups.local.DecryptedGroup",
 },
 {
   "name":"org.signal.storageservice.protos.groups.local.DecryptedPendingMember",
-  "fields":[{"name":"addedByUuid_"}, {"name":"role_"}, {"name":"timestamp_"}, {"name":"uuidCipherText_"}, {"name":"uuid_"}]
+  "fields":[{"name":"addedByUuid_"}, {"name":"role_"}, {"name":"serviceIdBinary_"}, {"name":"timestamp_"}, {"name":"uuidCipherText_"}, {"name":"uuid_"}]
 },
 {
   "name":"org.signal.storageservice.protos.groups.local.DecryptedPendingMemberRemoval",
 },
 {
   "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$ContactDetails",
-  "fields":[{"name":"archived_"}, {"name":"avatar_"}, {"name":"bitField0_"}, {"name":"blocked_"}, {"name":"color_"}, {"name":"expireTimer_"}, {"name":"inboxPosition_"}, {"name":"name_"}, {"name":"number_"}, {"name":"profileKey_"}, {"name":"uuid_"}, {"name":"verified_"}]
+  "fields":[{"name":"aci_"}, {"name":"archived_"}, {"name":"avatar_"}, {"name":"bitField0_"}, {"name":"blocked_"}, {"name":"color_"}, {"name":"expireTimer_"}, {"name":"inboxPosition_"}, {"name":"name_"}, {"name":"number_"}, {"name":"profileKey_"}, {"name":"uuid_"}, {"name":"verified_"}]
 },
 {
   "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$ContactDetails$Avatar",
 },
 {
   "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Blocked",
-  "fields":[{"name":"groupIds_"}, {"name":"numbers_"}, {"name":"uuids_"}]
+  "fields":[{"name":"acis_"}, {"name":"groupIds_"}, {"name":"numbers_"}, {"name":"uuids_"}]
 },
 {
   "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$CallEvent",
 },
 {
   "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$Verified",
-  "fields":[{"name":"bitField0_"}, {"name":"destinationUuid_"}, {"name":"identityKey_"}, {"name":"nullMessage_"}, {"name":"state_"}]
+  "fields":[{"name":"bitField0_"}, {"name":"destinationAci_"}, {"name":"destinationUuid_"}, {"name":"identityKey_"}, {"name":"nullMessage_"}, {"name":"state_"}]
 },
 {
   "name":"org.whispersystems.signalservice.internal.push.StaleDevices",
 },
 {
   "name":"org.whispersystems.signalservice.internal.storage.protos.AccountRecord$PinnedConversation$Contact",
-  "fields":[{"name":"e164_"}, {"name":"uuid_"}]
+  "fields":[{"name":"e164_"}, {"name":"serviceId_"}, {"name":"uuid_"}]
 },
 {
   "name":"org.whispersystems.signalservice.internal.storage.protos.ContactRecord",
index f500e3a93e60c2f5b8fdf07ee461eaf10d1279cb..f042f8fbab8ce0b184f5fa570934cbf05d857d26 100644 (file)
@@ -1,14 +1,14 @@
 package org.asamk.signal.manager.api;
 
-import org.whispersystems.signalservice.api.push.ServiceId;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
+import org.whispersystems.signalservice.api.util.UuidUtil;
 
 import java.util.Optional;
 import java.util.UUID;
 
 public record RecipientAddress(Optional<UUID> uuid, Optional<String> number, Optional<String> username) {
 
-    public static final UUID UNKNOWN_UUID = ServiceId.UNKNOWN.uuid();
+    public static final UUID UNKNOWN_UUID = UuidUtil.UNKNOWN_UUID;
 
     /**
      * Construct a RecipientAddress.
@@ -32,7 +32,7 @@ public record RecipientAddress(Optional<UUID> uuid, Optional<String> number, Opt
     }
 
     public RecipientAddress(SignalServiceAddress address) {
-        this(Optional.of(address.getServiceId().uuid()), address.getNumber(), Optional.empty());
+        this(Optional.of(address.getServiceId().getRawUuid()), address.getNumber(), Optional.empty());
     }
 
     public RecipientAddress(UUID uuid) {
index a983e4b5299256261de5b241036456f0bbb5161b..8edd5a4e0eb5c1dc604edbd6ede644d9a64aaef8 100644 (file)
@@ -1,6 +1,6 @@
 package org.asamk.signal.manager.helper;
 
-import org.whispersystems.signalservice.api.push.ACI;
+import org.whispersystems.signalservice.api.push.ServiceId.ACI;
 
 public interface AccountFileUpdater {
 
index 4841bdbda0845d04d12c1d68d71f0b023bd0f198..485990ed34fd96dd4b094f70cd4013e818f70a86 100644 (file)
@@ -21,8 +21,8 @@ import org.signal.libsignal.usernames.Username;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.whispersystems.signalservice.api.account.ChangePhoneNumberRequest;
-import org.whispersystems.signalservice.api.push.ACI;
-import org.whispersystems.signalservice.api.push.PNI;
+import org.whispersystems.signalservice.api.push.ServiceId.ACI;
+import org.whispersystems.signalservice.api.push.ServiceId.PNI;
 import org.whispersystems.signalservice.api.push.ServiceIdType;
 import org.whispersystems.signalservice.api.push.SignedPreKeyEntity;
 import org.whispersystems.signalservice.api.push.exceptions.AlreadyVerifiedException;
index d987d3d1e4c720e30dd556d155df6528a12b550a..eb54780ed64ab41a2ed195fab7188921dd6851df 100644 (file)
@@ -447,7 +447,7 @@ public class GroupHelper {
 
     private void storeProfileKeysFromMembers(final DecryptedGroup group) {
         for (var member : group.getMembersList()) {
-            final var serviceId = ServiceId.fromByteString(member.getUuid());
+            final var serviceId = ServiceId.parseOrThrow(member.getUuid());
             final var recipientId = account.getRecipientResolver().resolveRecipient(serviceId);
             final var profileStore = account.getProfileStore();
             if (profileStore.getProfileKey(recipientId) != null) {
index 7cc28d6afdcc0b51fb7428be226176b20c458d4f..c817f01fe0b57ef6fbaaf927bd99501c47bd2101 100644 (file)
@@ -39,9 +39,9 @@ import org.whispersystems.signalservice.api.groupsv2.GroupsV2AuthorizationString
 import org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations;
 import org.whispersystems.signalservice.api.groupsv2.InvalidGroupStateException;
 import org.whispersystems.signalservice.api.groupsv2.NotAbleToApplyGroupV2ChangeException;
-import org.whispersystems.signalservice.api.push.ACI;
-import org.whispersystems.signalservice.api.push.PNI;
 import org.whispersystems.signalservice.api.push.ServiceId;
+import org.whispersystems.signalservice.api.push.ServiceId.ACI;
+import org.whispersystems.signalservice.api.push.ServiceId.PNI;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
 import org.whispersystems.signalservice.api.util.UuidUtil;
@@ -124,7 +124,7 @@ class GroupV2Helper {
     }
 
     int findRevisionWeWereAdded(DecryptedGroup partialDecryptedGroup) {
-        ByteString bytes = UuidUtil.toByteString(getSelfAci().uuid());
+        ByteString bytes = getSelfAci().toByteString();
         for (DecryptedMember decryptedMember : partialDecryptedGroup.getMembersList()) {
             if (decryptedMember.getUuid().equals(bytes)) {
                 return decryptedMember.getJoinedAtRevision();
@@ -175,11 +175,11 @@ class GroupV2Helper {
             return null;
         }
 
-        final var self = new GroupCandidate(getSelfAci().uuid(), Optional.of(profileKeyCredential));
+        final var self = new GroupCandidate(getSelfAci(), Optional.of(profileKeyCredential));
         final var memberList = new ArrayList<>(members);
         final var credentials = context.getProfileHelper().getExpiringProfileKeyCredential(memberList).stream();
         final var uuids = memberList.stream()
-                .map(member -> context.getRecipientHelper().resolveSignalServiceAddress(member).getServiceId().uuid());
+                .map(member -> context.getRecipientHelper().resolveSignalServiceAddress(member).getServiceId());
         var candidates = Utils.zip(uuids,
                         credentials,
                         (uuid, credential) -> new GroupCandidate(uuid, Optional.ofNullable(credential)))
@@ -227,18 +227,18 @@ class GroupV2Helper {
         final var memberList = new ArrayList<>(newMembers);
         final var credentials = context.getProfileHelper().getExpiringProfileKeyCredential(memberList).stream();
         final var uuids = memberList.stream()
-                .map(member -> context.getRecipientHelper().resolveSignalServiceAddress(member).getServiceId().uuid());
+                .map(member -> context.getRecipientHelper().resolveSignalServiceAddress(member).getServiceId());
         var candidates = Utils.zip(uuids,
                         credentials,
                         (uuid, credential) -> new GroupCandidate(uuid, Optional.ofNullable(credential)))
                 .collect(Collectors.toSet());
         final var bannedUuids = groupInfoV2.getBannedMembers()
                 .stream()
-                .map(member -> context.getRecipientHelper().resolveSignalServiceAddress(member).getServiceId().uuid())
+                .map(member -> context.getRecipientHelper().resolveSignalServiceAddress(member).getServiceId())
                 .collect(Collectors.toSet());
 
         final var aci = getSelfAci();
-        final var change = groupOperations.createModifyGroupMembershipChange(candidates, bannedUuids, aci.uuid());
+        final var change = groupOperations.createModifyGroupMembershipChange(candidates, bannedUuids, aci);
 
         change.setSourceUuid(getSelfAci().toByteString());
 
@@ -250,7 +250,7 @@ class GroupV2Helper {
     ) throws IOException {
         var pendingMembersList = groupInfoV2.getGroup().getPendingMembersList();
         final var selfAci = getSelfAci();
-        var selfPendingMember = DecryptedGroupUtil.findPendingByUuid(pendingMembersList, selfAci.uuid());
+        var selfPendingMember = DecryptedGroupUtil.findPendingByServiceId(pendingMembersList, selfAci);
 
         if (selfPendingMember.isPresent()) {
             return revokeInvites(groupInfoV2, Set.of(selfPendingMember.get()));
@@ -259,11 +259,11 @@ class GroupV2Helper {
         final var adminUuids = membersToMakeAdmin.stream()
                 .map(context.getRecipientHelper()::resolveSignalServiceAddress)
                 .map(SignalServiceAddress::getServiceId)
-                .map(ServiceId::uuid)
+                .map(ServiceId::getRawUuid)
                 .toList();
         final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2);
         return commitChange(groupInfoV2,
-                groupOperations.createLeaveAndPromoteMembersToAdmin(selfAci.uuid(), adminUuids));
+                groupOperations.createLeaveAndPromoteMembersToAdmin(selfAci.getRawUuid(), adminUuids));
     }
 
     Pair<DecryptedGroup, GroupChange> removeMembers(
@@ -272,7 +272,7 @@ class GroupV2Helper {
         final var memberUuids = members.stream()
                 .map(context.getRecipientHelper()::resolveSignalServiceAddress)
                 .map(SignalServiceAddress::getServiceId)
-                .map(ServiceId::uuid)
+                .map(ServiceId::getRawUuid)
                 .collect(Collectors.toSet());
         return ejectMembers(groupInfoV2, memberUuids);
     }
@@ -283,7 +283,7 @@ class GroupV2Helper {
         final var memberUuids = members.stream()
                 .map(context.getRecipientHelper()::resolveSignalServiceAddress)
                 .map(SignalServiceAddress::getServiceId)
-                .map(ServiceId::uuid)
+                .map(ServiceId::getRawUuid)
                 .collect(Collectors.toSet());
         return approveJoinRequest(groupInfoV2, memberUuids);
     }
@@ -294,7 +294,7 @@ class GroupV2Helper {
         final var memberUuids = members.stream()
                 .map(context.getRecipientHelper()::resolveSignalServiceAddress)
                 .map(SignalServiceAddress::getServiceId)
-                .map(ServiceId::uuid)
+                .map(ServiceId::getRawUuid)
                 .collect(Collectors.toSet());
         return refuseJoinRequest(groupInfoV2, memberUuids);
     }
@@ -306,8 +306,7 @@ class GroupV2Helper {
         final var memberUuids = members.stream()
                 .map(context.getRecipientHelper()::resolveSignalServiceAddress)
                 .map(SignalServiceAddress::getServiceId)
-                .map(ServiceId::uuid)
-                .map(uuid -> DecryptedGroupUtil.findPendingByUuid(pendingMembersList, uuid))
+                .map(uuid -> DecryptedGroupUtil.findPendingByServiceId(pendingMembersList, uuid))
                 .filter(Optional::isPresent)
                 .map(Optional::get)
                 .collect(Collectors.toSet());
@@ -320,7 +319,10 @@ class GroupV2Helper {
         GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2);
 
         final var uuids = block.stream()
-                .map(member -> context.getRecipientHelper().resolveSignalServiceAddress(member).getServiceId().uuid())
+                .map(member -> context.getRecipientHelper()
+                        .resolveSignalServiceAddress(member)
+                        .getServiceId()
+                        .getRawUuid())
                 .collect(Collectors.toSet());
 
         final var change = groupOperations.createBanUuidsChange(uuids,
@@ -337,11 +339,11 @@ class GroupV2Helper {
     ) throws IOException {
         GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2);
 
-        final var uuids = block.stream()
-                .map(member -> context.getRecipientHelper().resolveSignalServiceAddress(member).getServiceId().uuid())
+        final var serviceIds = block.stream()
+                .map(member -> context.getRecipientHelper().resolveSignalServiceAddress(member).getServiceId())
                 .collect(Collectors.toSet());
 
-        final var change = groupOperations.createUnbanUuidsChange(uuids);
+        final var change = groupOperations.createUnbanServiceIdsChange(serviceIds);
 
         change.setSourceUuid(getSelfAci().toByteString());
 
@@ -394,7 +396,8 @@ class GroupV2Helper {
     Pair<DecryptedGroup, GroupChange> updateSelfProfileKey(GroupInfoV2 groupInfoV2) throws IOException {
         Optional<DecryptedMember> selfInGroup = groupInfoV2.getGroup() == null
                 ? Optional.empty()
-                : DecryptedGroupUtil.findMemberByUuid(groupInfoV2.getGroup().getMembersList(), getSelfAci().uuid());
+                : DecryptedGroupUtil.findMemberByUuid(groupInfoV2.getGroup().getMembersList(),
+                        getSelfAci().getRawUuid());
         if (selfInGroup.isEmpty()) {
             logger.trace("Not updating group, self not in group " + groupInfoV2.getGroupId().toBase64());
             return null;
@@ -471,8 +474,12 @@ class GroupV2Helper {
         final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2);
         final var address = context.getRecipientHelper().resolveSignalServiceAddress(recipientId);
         final var newRole = admin ? Member.Role.ADMINISTRATOR : Member.Role.DEFAULT;
-        final var change = groupOperations.createChangeMemberRole(address.getServiceId().uuid(), newRole);
-        return commitChange(groupInfoV2, change);
+        if (address.getServiceId() instanceof ACI aci) {
+            final var change = groupOperations.createChangeMemberRole(aci, newRole);
+            return commitChange(groupInfoV2, change);
+        } else {
+            throw new IllegalArgumentException("Can't make a PNI a group admin.");
+        }
     }
 
     Pair<DecryptedGroup, GroupChange> setMessageExpirationTimer(
@@ -558,7 +565,7 @@ class GroupV2Helper {
         final DecryptedGroup decryptedGroupState;
 
         try {
-            decryptedChange = groupOperations.decryptChange(changeActions, getSelfAci().uuid());
+            decryptedChange = groupOperations.decryptChange(changeActions, getSelfAci());
             decryptedGroupState = DecryptedGroupUtil.apply(previousGroupState, decryptedChange);
         } catch (VerificationFailedException | InvalidGroupStateException | NotAbleToApplyGroupV2ChangeException e) {
             throw new IOException(e);
@@ -610,7 +617,7 @@ class GroupV2Helper {
             return null;
         }
 
-        return new Pair<>(ServiceId.from(editor), profileKey);
+        return new Pair<>(ACI.from(editor), profileKey);
     }
 
     DecryptedGroup getUpdatedDecryptedGroup(DecryptedGroup group, DecryptedGroupChange decryptedGroupChange) {
index b45f21d399cd3e863aa808dd9a3f775f640eca17..6ffa08fb663d7cea202f230b7196429b9fc4ee5d 100644 (file)
@@ -66,9 +66,9 @@ import org.whispersystems.signalservice.api.messages.SignalServiceReceiptMessage
 import org.whispersystems.signalservice.api.messages.SignalServiceStoryMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.StickerPackOperationMessage;
-import org.whispersystems.signalservice.api.push.ACI;
-import org.whispersystems.signalservice.api.push.PNI;
 import org.whispersystems.signalservice.api.push.ServiceId;
+import org.whispersystems.signalservice.api.push.ServiceId.ACI;
+import org.whispersystems.signalservice.api.push.ServiceId.PNI;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 import org.whispersystems.signalservice.internal.push.SignalServiceProtos;
 import org.whispersystems.signalservice.internal.push.UnsupportedDataMessageException;
@@ -139,7 +139,7 @@ public final class IncomingMessageHandler {
         final var actions = new ArrayList<HandleAction>();
         if (envelope.hasSourceServiceId()) {
             // Store uuid if we don't have it already
-            // address/uuid in envelope is sent by server
+            // uuid in envelope is sent by server
             account.getRecipientTrustedResolver().resolveRecipientTrusted(envelope.getSourceAddress());
         }
         SignalServiceContent content = null;
@@ -409,7 +409,7 @@ public final class IncomingMessageHandler {
     private boolean handlePniSignatureMessage(
             final SignalServicePniSignatureMessage message, final SignalServiceAddress senderAddress
     ) {
-        final var aci = ACI.from(senderAddress.getServiceId());
+        final var aci = senderAddress.getServiceId();
         final var aciIdentity = account.getIdentityKeyStore().getIdentityInfo(aci);
         final var pni = message.getPni();
         final var pniIdentity = account.getIdentityKeyStore().getIdentityInfo(pni);
@@ -428,7 +428,9 @@ public final class IncomingMessageHandler {
 
         logger.debug("Verified association of ACI {} with PNI {}", aci, pni);
         account.getRecipientTrustedResolver()
-                .resolveRecipientTrusted(Optional.of(aci), Optional.of(pni), senderAddress.getNumber());
+                .resolveRecipientTrusted(Optional.of(ACI.from(aci.getRawUuid())),
+                        Optional.of(pni),
+                        senderAddress.getNumber());
         return true;
     }
 
index 55c93e579f1a34a8d92c5b3a1b20de59d5075384..b733507da4e0f391bb1ebc270bfb4958b9e762c2 100644 (file)
@@ -12,7 +12,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.whispersystems.signalservice.api.SignalWebSocket;
 import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
-import org.whispersystems.signalservice.api.push.ServiceId;
+import org.whispersystems.signalservice.api.push.ServiceId.ACI;
 import org.whispersystems.signalservice.api.websocket.WebSocketConnectionState;
 import org.whispersystems.signalservice.api.websocket.WebSocketUnavailableException;
 
@@ -228,7 +228,7 @@ public class ReceiveHelper {
                     final var address = ((UntrustedIdentityException) exception).getSender();
                     if (!envelope.hasSourceServiceId() && address.uuid().isPresent()) {
                         final var recipientId = account.getRecipientResolver()
-                                .resolveRecipient(ServiceId.from(address.uuid().get()));
+                                .resolveRecipient(ACI.from(address.uuid().get()));
                         try {
                             cachedMessage[0] = account.getMessageCache().replaceSender(cachedMessage[0], recipientId);
                         } catch (IOException ioException) {
index a0f03b79e280d94d7d2bf941454db2ff592a33d8..aff45ed2a3a2691a3db1cd913e16908e0bc7fb74 100644 (file)
@@ -10,9 +10,9 @@ import org.signal.libsignal.usernames.BaseUsernameException;
 import org.signal.libsignal.usernames.Username;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.whispersystems.signalservice.api.push.ACI;
-import org.whispersystems.signalservice.api.push.PNI;
 import org.whispersystems.signalservice.api.push.ServiceId;
+import org.whispersystems.signalservice.api.push.ServiceId.ACI;
+import org.whispersystems.signalservice.api.push.ServiceId.PNI;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 import org.whispersystems.signalservice.api.services.CdsiV2Service;
 import org.whispersystems.util.Base64UrlSafe;
@@ -80,7 +80,7 @@ public class RecipientHelper {
 
     public RecipientId resolveRecipient(final RecipientIdentifier.Single recipient) throws UnregisteredRecipientException {
         if (recipient instanceof RecipientIdentifier.Uuid uuidRecipient) {
-            return account.getRecipientResolver().resolveRecipient(ServiceId.from(uuidRecipient.uuid()));
+            return account.getRecipientResolver().resolveRecipient(ACI.from(uuidRecipient.uuid()));
         } else if (recipient instanceof RecipientIdentifier.Number numberRecipient) {
             final var number = numberRecipient.number();
             return account.getRecipientStore().resolveRecipientByNumber(number, () -> {
index 666867fe68834ad187e4c6a3c7dbb218d342bf3f..c1ba113a66ff20c532e0155938ec156ce9ad2ba7 100644 (file)
@@ -41,6 +41,7 @@ import org.whispersystems.signalservice.api.push.exceptions.ProofRequiredExcepti
 import org.whispersystems.signalservice.api.push.exceptions.RateLimitException;
 import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException;
 import org.whispersystems.signalservice.internal.push.exceptions.InvalidUnidentifiedAccessHeaderException;
+import org.whispersystems.signalservice.internal.push.http.PartialSendCompleteListener;
 
 import java.io.IOException;
 import java.time.Duration;
@@ -330,29 +331,41 @@ public class SendHelper {
         final AtomicLong entryId = new AtomicLong(-1);
 
         final var urgent = true;
-        final LegacySenderHandler legacySender = (recipients, unidentifiedAccess, isRecipientUpdate) -> messageSender.sendDataMessage(
-                recipients,
-                unidentifiedAccess,
-                isRecipientUpdate,
-                contentHint,
-                message,
-                SignalServiceMessageSender.LegacyGroupEvents.EMPTY,
-                sendResult -> {
-                    logger.trace("Partial message send result: {}", sendResult.isSuccess());
-                    synchronized (entryId) {
-                        if (entryId.get() == -1) {
-                            final var newId = messageSendLogStore.insertIfPossible(message.getTimestamp(),
-                                    sendResult,
-                                    contentHint,
-                                    urgent);
-                            entryId.set(newId);
-                        } else {
-                            messageSendLogStore.addRecipientToExistingEntryIfPossible(entryId.get(), sendResult);
-                        }
-                    }
-                },
-                () -> false,
-                urgent);
+        final PartialSendCompleteListener partialSendCompleteListener = sendResult -> {
+            logger.trace("Partial message send result: {}", sendResult.isSuccess());
+            synchronized (entryId) {
+                if (entryId.get() == -1) {
+                    final var newId = messageSendLogStore.insertIfPossible(message.getTimestamp(),
+                            sendResult,
+                            contentHint,
+                            urgent);
+                    entryId.set(newId);
+                } else {
+                    messageSendLogStore.addRecipientToExistingEntryIfPossible(entryId.get(), sendResult);
+                }
+            }
+        };
+        final LegacySenderHandler legacySender = (recipients, unidentifiedAccess, isRecipientUpdate) ->
+                editTargetTimestamp.isEmpty()
+                        ? messageSender.sendDataMessage(recipients,
+                        unidentifiedAccess,
+                        isRecipientUpdate,
+                        contentHint,
+                        message,
+                        SignalServiceMessageSender.LegacyGroupEvents.EMPTY,
+                        partialSendCompleteListener,
+                        () -> false,
+                        urgent)
+                        : messageSender.sendEditMessage(recipients,
+                                unidentifiedAccess,
+                                isRecipientUpdate,
+                                contentHint,
+                                message,
+                                SignalServiceMessageSender.LegacyGroupEvents.EMPTY,
+                                partialSendCompleteListener,
+                                () -> false,
+                                urgent,
+                                editTargetTimestamp.get());
         final SenderKeySenderHandler senderKeySender = (distId, recipients, unidentifiedAccess, isRecipientUpdate) -> messageSender.sendGroupDataMessage(
                 distId,
                 recipients,
index fc084f28b4bf4642f809e325cc9f9bfa72576756..863bdf99f40454440fcc0ee85d495cc5e8ec8b74 100644 (file)
@@ -101,15 +101,16 @@ public class StorageHelper {
         }
 
         final var contactRecord = record.getContact().get();
-        final var serviceId = contactRecord.getServiceId();
-        if (contactRecord.getNumber().isEmpty() && serviceId.isUnknown()) {
+        final var aci = contactRecord.getAci();
+        final var pni = contactRecord.getPni().orElse(null);
+        if (contactRecord.getNumber().isEmpty() && aci.isUnknown()) {
             return;
         }
-        final var address = new RecipientAddress(serviceId, contactRecord.getNumber().orElse(null));
+        final var address = new RecipientAddress(aci, pni, contactRecord.getNumber().orElse(null));
         var recipientId = account.getRecipientResolver().resolveRecipient(address);
-        if (serviceId.isValid() && contactRecord.getUsername().isPresent()) {
+        if (aci.isValid() && contactRecord.getUsername().isPresent()) {
             recipientId = account.getRecipientTrustedResolver()
-                    .resolveRecipientTrusted(serviceId, contactRecord.getUsername().get());
+                    .resolveRecipientTrusted(aci, contactRecord.getUsername().get());
         }
 
         final var contact = account.getContactStore().getContact(recipientId);
@@ -170,15 +171,15 @@ public class StorageHelper {
                 logger.warn("Received invalid contact profile key from storage");
             }
         }
-        if (contactRecord.getIdentityKey().isPresent() && serviceId.isValid()) {
+        if (contactRecord.getIdentityKey().isPresent() && aci.isValid()) {
             try {
                 logger.trace("Storing identity key {}", recipientId);
                 final var identityKey = new IdentityKey(contactRecord.getIdentityKey().get());
-                account.getIdentityKeyStore().saveIdentity(serviceId, identityKey);
+                account.getIdentityKeyStore().saveIdentity(aci, identityKey);
 
                 final var trustLevel = TrustLevel.fromIdentityState(contactRecord.getIdentityState());
                 if (trustLevel != null) {
-                    account.getIdentityKeyStore().setIdentityTrustLevel(serviceId, identityKey, trustLevel);
+                    account.getIdentityKeyStore().setIdentityTrustLevel(aci, identityKey, trustLevel);
                 }
             } catch (InvalidKeyException e) {
                 logger.warn("Received invalid contact identity key from storage");
index 5c99d0c1cab400fe658f1ce2e4ffccf7b127e7d1..35564362e2feee69d2871440f13e7dec7cf5a090 100644 (file)
@@ -2,7 +2,7 @@ package org.asamk.signal.manager.internal;
 
 import org.asamk.signal.manager.helper.AccountFileUpdater;
 import org.asamk.signal.manager.storage.accounts.AccountsStore;
-import org.whispersystems.signalservice.api.push.ACI;
+import org.whispersystems.signalservice.api.push.ServiceId.ACI;
 
 public class AccountFileUpdaterImpl implements AccountFileUpdater {
 
index 4e2fd82ce059a316b99b96dfdf4c66ca5023ec61..36051333a379a888ac853b2a66067629a86bbc20 100644 (file)
@@ -80,8 +80,8 @@ import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
 import org.whispersystems.signalservice.api.messages.SignalServicePreview;
 import org.whispersystems.signalservice.api.messages.SignalServiceReceiptMessage;
 import org.whispersystems.signalservice.api.messages.SignalServiceTypingMessage;
-import org.whispersystems.signalservice.api.push.ACI;
 import org.whispersystems.signalservice.api.push.ServiceId;
+import org.whispersystems.signalservice.api.push.ServiceId.ACI;
 import org.whispersystems.signalservice.api.push.ServiceIdType;
 import org.whispersystems.signalservice.api.util.DeviceNameUtil;
 import org.whispersystems.signalservice.api.util.InvalidNumberException;
@@ -239,7 +239,7 @@ public class ManagerImpl implements Manager {
                     : context.getProfileHelper()
                             .getRecipientProfile(account.getRecipientResolver().resolveRecipient(serviceId));
             return new UserStatus(number.isEmpty() ? null : number,
-                    serviceId == null ? null : serviceId.uuid(),
+                    serviceId == null ? null : serviceId.getRawUuid(),
                     profile != null
                             && profile.getUnidentifiedAccessMode() == Profile.UnidentifiedAccessMode.UNRESTRICTED);
         }));
@@ -700,7 +700,7 @@ public class ManagerImpl implements Manager {
         for (final var recipient : recipients) {
             if (recipient instanceof RecipientIdentifier.Uuid u) {
                 account.getMessageSendLogStore()
-                        .deleteEntryForRecipientNonGroup(targetSentTimestamp, ServiceId.from(u.uuid()));
+                        .deleteEntryForRecipientNonGroup(targetSentTimestamp, ACI.from(u.uuid()));
             } else if (recipient instanceof RecipientIdentifier.Single r) {
                 try {
                     final var recipientId = context.getRecipientHelper().resolveRecipient(r);
index bf53a9b88ccf001e1eb07761988d3aa5f46e7eb9..720b2de1591e540357ae27ed4970a6d4057a17ca 100644 (file)
@@ -39,8 +39,8 @@ import org.whispersystems.signalservice.api.SignalServiceAccountManager;
 import org.whispersystems.signalservice.api.account.PreKeyCollection;
 import org.whispersystems.signalservice.api.groupsv2.ClientZkOperations;
 import org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations;
-import org.whispersystems.signalservice.api.push.ACI;
-import org.whispersystems.signalservice.api.push.PNI;
+import org.whispersystems.signalservice.api.push.ServiceId.ACI;
+import org.whispersystems.signalservice.api.push.ServiceId.PNI;
 import org.whispersystems.signalservice.api.push.ServiceIdType;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 import org.whispersystems.signalservice.api.push.exceptions.AlreadyVerifiedException;
index 7f6babe6fc572c4dde15269f22b698931d2b55a2..f40e23ab54fbf42d62439fc192d21ae2d49554f7 100644 (file)
@@ -15,7 +15,7 @@ import org.asamk.signal.manager.storage.sessions.SessionStore;
 import org.asamk.signal.manager.storage.stickers.StickerStore;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.whispersystems.signalservice.api.push.ServiceId;
+import org.whispersystems.signalservice.api.push.ServiceId.ACI;
 
 import java.io.File;
 import java.sql.Connection;
@@ -315,7 +315,7 @@ public class AccountDatabase extends Database {
                                 WHERE i.uuid = ?
                                 """;
                 try (final var statement = connection.prepareStatement(sql)) {
-                    statement.setBytes(1, ServiceId.UNKNOWN.toByteArray());
+                    statement.setBytes(1, ACI.UNKNOWN.toByteArray());
                     statement.executeUpdate();
                 }
             }
@@ -325,7 +325,7 @@ public class AccountDatabase extends Database {
                                 WHERE i.uuid = ?
                                 """;
                 try (final var statement = connection.prepareStatement(sql)) {
-                    statement.setBytes(1, ServiceId.UNKNOWN.toByteArray());
+                    statement.setBytes(1, ACI.UNKNOWN.toByteArray());
                     statement.executeUpdate();
                 }
             }
index c9974e861fb896c83725ffc4819a503c5ea53a35..647e9ee098424b22745a841fc4835a7dca41aa3d 100644 (file)
@@ -67,9 +67,9 @@ import org.whispersystems.signalservice.api.account.AccountAttributes;
 import org.whispersystems.signalservice.api.account.PreKeyCollection;
 import org.whispersystems.signalservice.api.crypto.UnidentifiedAccess;
 import org.whispersystems.signalservice.api.kbs.MasterKey;
-import org.whispersystems.signalservice.api.push.ACI;
-import org.whispersystems.signalservice.api.push.PNI;
 import org.whispersystems.signalservice.api.push.ServiceId;
+import org.whispersystems.signalservice.api.push.ServiceId.ACI;
+import org.whispersystems.signalservice.api.push.ServiceId.PNI;
 import org.whispersystems.signalservice.api.push.ServiceIdType;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 import org.whispersystems.signalservice.api.storage.SignalStorageManifest;
@@ -558,7 +558,7 @@ public class SignalAccount implements Closeable {
         }
         if (rootNode.hasNonNull("pni")) {
             try {
-                pni = PNI.parseOrThrow(rootNode.get("pni").asText());
+                pni = PNI.from(UuidUtil.parseOrThrow(rootNode.get("pni").asText()));
             } catch (IllegalArgumentException e) {
                 throw new IOException("Config file contains an invalid pni, needs to be a valid UUID", e);
             }
@@ -967,7 +967,7 @@ public class SignalAccount implements Closeable {
                     .put("serviceEnvironment", serviceEnvironment == null ? null : serviceEnvironment.name())
                     .put("usernameIdentifier", username)
                     .put("uuid", aci == null ? null : aci.toString())
-                    .put("pni", pni == null ? null : pni.toString())
+                    .put("pni", pni == null ? null : pni.getRawUuid().toString())
                     .put("sessionId", sessionId)
                     .put("sessionNumber", sessionNumber)
                     .put("deviceName", encryptedDeviceName)
index e7297c6b595380e514933ea39a81ecdd10727b0e..0e9fc5fcad845780ca1a29b8d7da125947b87ba2 100644 (file)
@@ -9,7 +9,7 @@ import org.asamk.signal.manager.storage.Utils;
 import org.asamk.signal.manager.util.IOUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.whispersystems.signalservice.api.push.ACI;
+import org.whispersystems.signalservice.api.push.ServiceId.ACI;
 import org.whispersystems.signalservice.api.util.PhoneNumberFormatter;
 
 import java.io.ByteArrayInputStream;
index 0d297e7f625fd55834126ef69eb5c0b6ff3e991f..50dcd91ef24a344e0f8ef75ac70e1d37676f530a 100644 (file)
@@ -4,7 +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 org.whispersystems.signalservice.api.push.ServiceId.ACI;
 
 import java.util.UUID;
 
@@ -44,6 +44,6 @@ public class LegacyContactInfo {
 
     @JsonIgnore
     public RecipientAddress getAddress() {
-        return new RecipientAddress(uuid == null ? null : ServiceId.from(uuid), number);
+        return new RecipientAddress(uuid == null ? null : ACI.from(uuid), number);
     }
 }
index 3e5eac7affe308c11692e419956668bc114cf59e..199a9da0cb2926dd6f5d81b486569c78f4a0d4d9 100644 (file)
@@ -114,7 +114,7 @@ public final class GroupInfoV2 extends GroupInfo {
         }
         return group.getMembersList()
                 .stream()
-                .map(m -> ServiceId.fromByteString(m.getUuid()))
+                .map(m -> ServiceId.parseOrThrow(m.getUuid()))
                 .map(recipientResolver::resolveRecipient)
                 .collect(Collectors.toSet());
     }
@@ -126,7 +126,7 @@ public final class GroupInfoV2 extends GroupInfo {
         }
         return group.getBannedMembersList()
                 .stream()
-                .map(m -> ServiceId.fromByteString(m.getUuid()))
+                .map(m -> ServiceId.parseOrThrow(m.getServiceIdBinary()))
                 .map(recipientResolver::resolveRecipient)
                 .collect(Collectors.toSet());
     }
@@ -138,7 +138,7 @@ public final class GroupInfoV2 extends GroupInfo {
         }
         return group.getPendingMembersList()
                 .stream()
-                .map(m -> ServiceId.fromByteString(m.getUuid()))
+                .map(m -> ServiceId.parseOrThrow(m.getServiceIdBinary()))
                 .map(recipientResolver::resolveRecipient)
                 .collect(Collectors.toSet());
     }
@@ -150,7 +150,7 @@ public final class GroupInfoV2 extends GroupInfo {
         }
         return group.getRequestingMembersList()
                 .stream()
-                .map(m -> ServiceId.fromByteString(m.getUuid()))
+                .map(m -> ServiceId.parseOrThrow(m.getUuid()))
                 .map(recipientResolver::resolveRecipient)
                 .collect(Collectors.toSet());
     }
@@ -163,7 +163,7 @@ public final class GroupInfoV2 extends GroupInfo {
         return group.getMembersList()
                 .stream()
                 .filter(m -> m.getRole() == Member.Role.ADMINISTRATOR)
-                .map(m -> ServiceId.fromByteString(m.getUuid()))
+                .map(m -> ServiceId.parseOrThrow(m.getUuid()))
                 .map(recipientResolver::resolveRecipient)
                 .collect(Collectors.toSet());
     }
index 4d94b455ed3f17172337ad4b692a673b62baa577..56986333a36ab769f8eaf14e3587035656f72e42 100644 (file)
@@ -13,7 +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.push.ServiceId.ACI;
 import org.whispersystems.signalservice.api.util.UuidUtil;
 
 import java.io.IOException;
@@ -101,7 +101,7 @@ public class LegacyJsonIdentityKeyStore {
                             : null;
                     final var address = uuid == null
                             ? Utils.getRecipientAddressFromIdentifier(trustedKeyName)
-                            : new RecipientAddress(ServiceId.from(uuid), trustedKeyName);
+                            : new RecipientAddress(ACI.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 df8f5cdada759a5df449602a70eb0fe950b395ec..73a85f76a5c21ea9f6497dd12ba1046b439f4b77 100644 (file)
@@ -7,7 +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.push.ServiceId.ACI;
 import org.whispersystems.signalservice.api.util.UuidUtil;
 
 import java.io.IOException;
@@ -48,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(ServiceId.from(uuid), sessionName);
+                            : new RecipientAddress(ACI.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 f323a5cb2c008cf88da3e7b00bab0f8488daabdb..86ada86ab38d6f8071075926b95e0eff0072377a 100644 (file)
@@ -1,7 +1,8 @@
 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.ServiceId.ACI;
+import org.whispersystems.signalservice.api.push.ServiceId.PNI;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 
 import java.util.Optional;
@@ -63,7 +64,7 @@ public record RecipientAddress(
     }
 
     public RecipientAddress(org.asamk.signal.manager.api.RecipientAddress address) {
-        this(address.uuid().map(ServiceId::from), Optional.empty(), address.number(), address.username());
+        this(address.uuid().map(ACI::from), Optional.empty(), address.number(), address.username());
     }
 
     public RecipientAddress(ServiceId serviceId) {
@@ -169,11 +170,11 @@ public record RecipientAddress(
     }
 
     public SignalServiceAddress toSignalServiceAddress() {
-        return new SignalServiceAddress(serviceId.orElse(ServiceId.UNKNOWN), number);
+        return new SignalServiceAddress(serviceId.orElse(ACI.UNKNOWN), number);
     }
 
     public org.asamk.signal.manager.api.RecipientAddress toApiRecipientAddress() {
-        return new org.asamk.signal.manager.api.RecipientAddress(serviceId().map(ServiceId::uuid),
+        return new org.asamk.signal.manager.api.RecipientAddress(serviceId().map(ServiceId::getRawUuid),
                 number(),
                 username());
     }
index 9c13459b8707d39b4314341658784b59a15ff466..5a112c790459b149a994ee8d67f95f28a0ba1d4a 100644 (file)
@@ -13,9 +13,9 @@ 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.push.ACI;
-import org.whispersystems.signalservice.api.push.PNI;
 import org.whispersystems.signalservice.api.push.ServiceId;
+import org.whispersystems.signalservice.api.push.ServiceId.ACI;
+import org.whispersystems.signalservice.api.push.ServiceId.PNI;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 import org.whispersystems.signalservice.api.util.UuidUtil;
 
@@ -509,7 +509,7 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re
                     statement.setBytes(3,
                             recipient.getAddress()
                                     .serviceId()
-                                    .map(ServiceId::uuid)
+                                    .map(ServiceId::getRawUuid)
                                     .map(UuidUtil::toByteArray)
                                     .orElse(null));
                     statement.executeUpdate();
@@ -754,8 +754,9 @@ 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.serviceId().map(ServiceId::uuid).map(UuidUtil::toByteArray).orElse(null));
-            statement.setBytes(3, address.pni().map(PNI::uuid).map(UuidUtil::toByteArray).orElse(null));
+            statement.setBytes(2,
+                    address.serviceId().map(ServiceId::getRawUuid).map(UuidUtil::toByteArray).orElse(null));
+            statement.setBytes(3, address.pni().map(PNI::getRawUuid).map(UuidUtil::toByteArray).orElse(null));
             statement.executeUpdate();
             final var generatedKeys = statement.getGeneratedKeys();
             if (generatedKeys.next()) {
@@ -794,8 +795,9 @@ 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.serviceId().map(ServiceId::uuid).map(UuidUtil::toByteArray).orElse(null));
-            statement.setBytes(3, address.pni().map(PNI::uuid).map(UuidUtil::toByteArray).orElse(null));
+            statement.setBytes(2,
+                    address.serviceId().map(ServiceId::getRawUuid).map(UuidUtil::toByteArray).orElse(null));
+            statement.setBytes(3, address.pni().map(PNI::getRawUuid).map(UuidUtil::toByteArray).orElse(null));
             statement.setString(4, address.username().orElse(null));
             statement.setLong(5, recipientId.id());
             statement.executeUpdate();
@@ -886,7 +888,7 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re
                         LIMIT 1
                         """.formatted(TABLE_RECIPIENT);
         try (final var statement = connection.prepareStatement(sql)) {
-            statement.setBytes(1, UuidUtil.toByteArray(serviceId.uuid()));
+            statement.setBytes(1, UuidUtil.toByteArray(serviceId.getRawUuid()));
             return Utils.executeQueryForOptional(statement, this::getRecipientWithAddressFromResultSet);
         }
     }
@@ -903,8 +905,9 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re
                               r.username = ?4
                         """.formatted(TABLE_RECIPIENT);
         try (final var statement = connection.prepareStatement(sql)) {
-            statement.setBytes(1, address.serviceId().map(ServiceId::uuid).map(UuidUtil::toByteArray).orElse(null));
-            statement.setBytes(2, address.pni().map(ServiceId::uuid).map(UuidUtil::toByteArray).orElse(null));
+            statement.setBytes(1,
+                    address.serviceId().map(ServiceId::getRawUuid).map(UuidUtil::toByteArray).orElse(null));
+            statement.setBytes(2, address.pni().map(ServiceId::getRawUuid).map(UuidUtil::toByteArray).orElse(null));
             statement.setString(3, address.number().orElse(null));
             statement.setString(4, address.username().orElse(null));
             return Utils.executeQueryForStream(statement, this::getRecipientWithAddressFromResultSet)
index 9fc46d675f9e9a134fb50dc61b160185c2316333..54e5d5d15bdd68f6b7475e1e6d0bdb8fe1955364 100644 (file)
@@ -1,8 +1,8 @@
 package org.asamk.signal.manager.storage.recipients;
 
-import org.whispersystems.signalservice.api.push.ACI;
-import org.whispersystems.signalservice.api.push.PNI;
 import org.whispersystems.signalservice.api.push.ServiceId;
+import org.whispersystems.signalservice.api.push.ServiceId.ACI;
+import org.whispersystems.signalservice.api.push.ServiceId.PNI;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 
 import java.util.Optional;
index 42a57d3577b0c3765a527de65d9a85be67f547c6..a617ce93c643ef3eb5650edb4f34432b60acab3f 100644 (file)
@@ -3,8 +3,8 @@ package org.asamk.signal.manager.storage.recipients;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
-import org.whispersystems.signalservice.api.push.PNI;
 import org.whispersystems.signalservice.api.push.ServiceId;
+import org.whispersystems.signalservice.api.push.ServiceId.PNI;
 
 import java.util.Arrays;
 import java.util.HashSet;
@@ -17,170 +17,90 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 
 class MergeRecipientHelperTest {
 
-    static final ServiceId SERVICE_ID_A = ServiceId.from(UUID.randomUUID());
-    static final ServiceId SERVICE_ID_B = ServiceId.from(UUID.randomUUID());
-    static final ServiceId SERVICE_ID_C = ServiceId.from(UUID.randomUUID());
+    static final ServiceId SERVICE_ID_A = ServiceId.ACI.from(UUID.randomUUID());
+    static final ServiceId SERVICE_ID_B = ServiceId.ACI.from(UUID.randomUUID());
     static final PNI PNI_A = PNI.from(UUID.randomUUID());
     static final PNI PNI_B = PNI.from(UUID.randomUUID());
-    static final PNI PNI_C = PNI.from(UUID.randomUUID());
     static final String NUMBER_A = "+AAA";
     static final String NUMBER_B = "+BBB";
-    static final String NUMBER_C = "+CCC";
 
     static final PartialAddresses ADDR_A = new PartialAddresses(SERVICE_ID_A, PNI_A, NUMBER_A);
     static final PartialAddresses ADDR_B = new PartialAddresses(SERVICE_ID_B, PNI_B, NUMBER_B);
 
     static T[] testInstancesNone = new T[]{
-            // 1
             new T(Set.of(), ADDR_A.FULL, Set.of(rec(1000000, ADDR_A.FULL))),
             new T(Set.of(), ADDR_A.ACI_NUM, Set.of(rec(1000000, ADDR_A.ACI_NUM))),
             new T(Set.of(), ADDR_A.ACI_PNI, Set.of(rec(1000000, ADDR_A.ACI_PNI))),
-            new T(Set.of(), ADDR_A.PNI_S_NUM, Set.of(rec(1000000, ADDR_A.PNI_S_NUM))),
             new T(Set.of(), ADDR_A.PNI_NUM, Set.of(rec(1000000, ADDR_A.PNI_NUM))),
     };
 
     static T[] testInstancesSingle = new T[]{
-            // 1
             new T(Set.of(rec(1, ADDR_A.FULL)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))),
             new T(Set.of(rec(1, ADDR_A.ACI)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))),
             new T(Set.of(rec(1, ADDR_A.PNI)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))),
-            new T(Set.of(rec(1, ADDR_A.PNI_S)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))),
             new T(Set.of(rec(1, ADDR_A.NUM)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))),
             new T(Set.of(rec(1, ADDR_A.ACI_NUM)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))),
             new T(Set.of(rec(1, ADDR_A.PNI_NUM)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))),
-            new T(Set.of(rec(1, ADDR_A.PNI_S_NUM)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))),
             new T(Set.of(rec(1, ADDR_A.ACI_PNI)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))),
 
-            // 10
             new T(Set.of(rec(1, ADDR_A.FULL)), ADDR_A.ACI_NUM, Set.of(rec(1, ADDR_A.FULL))),
             new T(Set.of(rec(1, ADDR_A.ACI)), ADDR_A.ACI_NUM, Set.of(rec(1, ADDR_A.ACI_NUM))),
             new T(Set.of(rec(1, ADDR_A.PNI)), ADDR_A.ACI_NUM, Set.of(rec(1, ADDR_A.PNI), rec(1000000, ADDR_A.ACI_NUM))),
-            new T(Set.of(rec(1, ADDR_A.PNI_S)),
-                    ADDR_A.ACI_NUM,
-                    Set.of(rec(1, ADDR_A.PNI_S), rec(1000000, ADDR_A.ACI_NUM))),
             new T(Set.of(rec(1, ADDR_A.NUM)), ADDR_A.ACI_NUM, Set.of(rec(1, ADDR_A.ACI_NUM))),
             new T(Set.of(rec(1, ADDR_A.ACI_NUM)), ADDR_A.ACI_NUM, Set.of(rec(1, ADDR_A.ACI_NUM))),
             new T(Set.of(rec(1, ADDR_A.PNI_NUM)),
                     ADDR_A.ACI_NUM,
                     Set.of(rec(1, ADDR_A.PNI), rec(1000000, ADDR_A.ACI_NUM))),
-            new T(Set.of(rec(1, ADDR_A.PNI_S_NUM)),
-                    ADDR_A.ACI_NUM,
-                    Set.of(rec(1, ADDR_A.PNI_S), rec(1000000, ADDR_A.ACI_NUM))),
             new T(Set.of(rec(1, ADDR_A.ACI_PNI)), ADDR_A.ACI_NUM, Set.of(rec(1, ADDR_A.FULL))),
 
-            // 19
             new T(Set.of(rec(1, ADDR_A.FULL)), ADDR_A.PNI_NUM, Set.of(rec(1, ADDR_A.FULL))),
             new T(Set.of(rec(1, ADDR_A.ACI)), ADDR_A.PNI_NUM, Set.of(rec(1, ADDR_A.ACI), rec(1000000, ADDR_A.PNI_NUM))),
             new T(Set.of(rec(1, ADDR_A.PNI)), ADDR_A.PNI_NUM, Set.of(rec(1, ADDR_A.PNI_NUM))),
-            new T(Set.of(rec(1, ADDR_A.PNI_S)), ADDR_A.PNI_NUM, Set.of(rec(1, ADDR_A.PNI_NUM))),
             new T(Set.of(rec(1, ADDR_A.NUM)), ADDR_A.PNI_NUM, Set.of(rec(1, ADDR_A.PNI_NUM))),
             new T(Set.of(rec(1, ADDR_A.ACI_NUM)),
                     ADDR_A.PNI_NUM,
                     Set.of(rec(1, ADDR_A.ACI), rec(1000000, ADDR_A.PNI_NUM))),
             new T(Set.of(rec(1, ADDR_A.PNI_NUM)), ADDR_A.PNI_NUM, Set.of(rec(1, ADDR_A.PNI_NUM))),
-            new T(Set.of(rec(1, ADDR_A.PNI_S_NUM)), ADDR_A.PNI_NUM, Set.of(rec(1, ADDR_A.PNI_NUM))),
             new T(Set.of(rec(1, ADDR_A.ACI_PNI)), ADDR_A.PNI_NUM, Set.of(rec(1, ADDR_A.FULL))),
 
-            // 28
-            new T(Set.of(rec(1, ADDR_A.FULL)), ADDR_A.PNI_S_NUM, Set.of(rec(1, ADDR_A.FULL))),
-            new T(Set.of(rec(1, ADDR_A.ACI)),
-                    ADDR_A.PNI_S_NUM,
-                    Set.of(rec(1, ADDR_A.ACI), rec(1000000, ADDR_A.PNI_S_NUM))),
-            new T(Set.of(rec(1, ADDR_A.PNI)), ADDR_A.PNI_S_NUM, Set.of(rec(1, ADDR_A.PNI_NUM))),
-            new T(Set.of(rec(1, ADDR_A.PNI_S)), ADDR_A.PNI_S_NUM, Set.of(rec(1, ADDR_A.PNI_S_NUM))),
-            new T(Set.of(rec(1, ADDR_A.NUM)), ADDR_A.PNI_S_NUM, Set.of(rec(1, ADDR_A.PNI_S_NUM))),
-            new T(Set.of(rec(1, ADDR_A.ACI_NUM)),
-                    ADDR_A.PNI_S_NUM,
-                    Set.of(rec(1, ADDR_A.ACI), rec(1000000, ADDR_A.PNI_S_NUM))),
-            new T(Set.of(rec(1, ADDR_A.PNI_NUM)), ADDR_A.PNI_S_NUM, Set.of(rec(1, ADDR_A.PNI_NUM))),
-            new T(Set.of(rec(1, ADDR_A.PNI_S_NUM)), ADDR_A.PNI_S_NUM, Set.of(rec(1, ADDR_A.PNI_S_NUM))),
-            new T(Set.of(rec(1, ADDR_A.ACI_PNI)), ADDR_A.PNI_S_NUM, Set.of(rec(1, ADDR_A.FULL))),
-
-            // 37
             new T(Set.of(rec(1, ADDR_A.FULL)), ADDR_A.ACI_PNI, Set.of(rec(1, ADDR_A.FULL))),
             new T(Set.of(rec(1, ADDR_A.ACI)), ADDR_A.ACI_PNI, Set.of(rec(1, ADDR_A.ACI_PNI))),
             new T(Set.of(rec(1, ADDR_A.PNI)), ADDR_A.ACI_PNI, Set.of(rec(1, ADDR_A.ACI_PNI))),
-            new T(Set.of(rec(1, ADDR_A.PNI_S)), ADDR_A.ACI_PNI, Set.of(rec(1, ADDR_A.ACI_PNI))),
             new T(Set.of(rec(1, ADDR_A.NUM)), ADDR_A.ACI_PNI, Set.of(rec(1, ADDR_A.NUM), rec(1000000, ADDR_A.ACI_PNI))),
             new T(Set.of(rec(1, ADDR_A.ACI_NUM)), ADDR_A.ACI_PNI, Set.of(rec(1, ADDR_A.FULL))),
             new T(Set.of(rec(1, ADDR_A.PNI_NUM)), ADDR_A.ACI_PNI, Set.of(rec(1, ADDR_A.FULL))),
-            new T(Set.of(rec(1, ADDR_A.PNI_S_NUM)), ADDR_A.ACI_PNI, Set.of(rec(1, ADDR_A.FULL))),
             new T(Set.of(rec(1, ADDR_A.ACI_PNI)), ADDR_A.ACI_PNI, Set.of(rec(1, ADDR_A.ACI_PNI))),
 
             new T(Set.of(rec(1, ADDR_A.FULL)), ADDR_B.FULL, Set.of(rec(1, ADDR_A.FULL), rec(1000000, ADDR_B.FULL))),
     };
 
     static T[] testInstancesTwo = new T[]{
-            // 1
             new T(Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.PNI)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))),
-            new T(Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.PNI_S)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))),
             new T(Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.NUM)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))),
             new T(Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.PNI_NUM)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))),
-            new T(Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.PNI_S_NUM)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))),
             new T(Set.of(rec(1, ADDR_A.PNI), rec(2, ADDR_A.NUM)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))),
             new T(Set.of(rec(1, ADDR_A.PNI), rec(2, ADDR_A.ACI_NUM)), ADDR_A.FULL, Set.of(rec(2, ADDR_A.FULL))),
-            new T(Set.of(rec(1, ADDR_A.PNI_S), rec(2, ADDR_A.NUM)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))),
-            new T(Set.of(rec(1, ADDR_A.PNI_S), rec(2, ADDR_A.ACI_NUM)), ADDR_A.FULL, Set.of(rec(2, ADDR_A.FULL))),
-            new T(Set.of(rec(1, ADDR_A.NUM), rec(2, ADDR_A.PNI_S)), ADDR_A.FULL, Set.of(rec(2, ADDR_A.FULL))),
             new T(Set.of(rec(1, ADDR_A.NUM), rec(2, ADDR_A.ACI_PNI)), ADDR_A.FULL, Set.of(rec(2, ADDR_A.FULL))),
 
-            // 12
             new T(Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.NUM)), ADDR_A.ACI_NUM, Set.of(rec(1, ADDR_A.ACI_NUM))),
             new T(Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.PNI_NUM)), ADDR_A.ACI_NUM, Set.of(rec(1, ADDR_A.FULL))),
-            new T(Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.PNI_S_NUM)),
-                    ADDR_A.ACI_NUM,
-                    Set.of(rec(1, ADDR_A.ACI_NUM), rec(2, ADDR_A.PNI_S))),
             new T(Set.of(rec(1, ADDR_A.NUM), rec(2, ADDR_A.ACI_PNI)), ADDR_A.ACI_NUM, Set.of(rec(2, ADDR_A.FULL))),
 
-            // 16
             new T(Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.PNI_NUM)),
                     ADDR_A.PNI_NUM,
                     Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.PNI_NUM))),
-            new T(Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.PNI_S_NUM)),
-                    ADDR_A.PNI_NUM,
-                    Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.PNI_NUM))),
             new T(Set.of(rec(1, ADDR_A.PNI), rec(2, ADDR_A.NUM)), ADDR_A.PNI_NUM, Set.of(rec(1, ADDR_A.PNI_NUM))),
             new T(Set.of(rec(1, ADDR_A.PNI), rec(2, ADDR_A.ACI_NUM)),
                     ADDR_A.PNI_NUM,
                     Set.of(rec(1, ADDR_A.PNI_NUM), rec(2, ADDR_A.ACI))),
-            new T(Set.of(rec(1, ADDR_A.PNI_S), rec(2, ADDR_A.NUM)), ADDR_A.PNI_NUM, Set.of(rec(1, ADDR_A.PNI_NUM))),
-            new T(Set.of(rec(1, ADDR_A.PNI_S), rec(2, ADDR_A.ACI_NUM)),
-                    ADDR_A.PNI_NUM,
-                    Set.of(rec(1, ADDR_A.PNI_NUM), rec(2, ADDR_A.ACI))),
-            new T(Set.of(rec(1, ADDR_A.NUM), rec(2, ADDR_A.PNI_S)), ADDR_A.PNI_NUM, Set.of(rec(2, ADDR_A.PNI_NUM))),
             new T(Set.of(rec(1, ADDR_A.NUM), rec(2, ADDR_A.ACI_PNI)), ADDR_A.PNI_NUM, Set.of(rec(2, ADDR_A.FULL))),
 
-            // 24
-            new T(Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.PNI_NUM)),
-                    ADDR_A.PNI_S_NUM,
-                    Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.PNI_NUM))),
-            new T(Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.PNI_S_NUM)),
-                    ADDR_A.PNI_S_NUM,
-                    Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.PNI_S_NUM))),
-            new T(Set.of(rec(1, ADDR_A.PNI), rec(2, ADDR_A.NUM)), ADDR_A.PNI_S_NUM, Set.of(rec(1, ADDR_A.PNI_NUM))),
-            new T(Set.of(rec(1, ADDR_A.PNI), rec(2, ADDR_A.ACI_NUM)),
-                    ADDR_A.PNI_S_NUM,
-                    Set.of(rec(1, ADDR_A.PNI_NUM), rec(2, ADDR_A.ACI))),
-            new T(Set.of(rec(1, ADDR_A.PNI_S), rec(2, ADDR_A.NUM)), ADDR_A.PNI_S_NUM, Set.of(rec(1, ADDR_A.PNI_S_NUM))),
-            new T(Set.of(rec(1, ADDR_A.PNI_S), rec(2, ADDR_A.ACI_NUM)),
-                    ADDR_A.PNI_S_NUM,
-                    Set.of(rec(1, ADDR_A.PNI_S_NUM), rec(2, ADDR_A.ACI))),
-            new T(Set.of(rec(1, ADDR_A.NUM), rec(2, ADDR_A.PNI_S)), ADDR_A.PNI_S_NUM, Set.of(rec(2, ADDR_A.PNI_S_NUM))),
-            new T(Set.of(rec(1, ADDR_A.NUM), rec(2, ADDR_A.ACI_PNI)), ADDR_A.PNI_S_NUM, Set.of(rec(2, ADDR_A.FULL))),
-
-            // 32
             new T(Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.PNI)), ADDR_A.ACI_PNI, Set.of(rec(1, ADDR_A.ACI_PNI))),
-            new T(Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.PNI_S)), ADDR_A.ACI_PNI, Set.of(rec(1, ADDR_A.ACI_PNI))),
             new T(Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.PNI_NUM)), ADDR_A.ACI_PNI, Set.of(rec(1, ADDR_A.FULL))),
-            new T(Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.PNI_S_NUM)),
-                    ADDR_A.ACI_PNI,
-                    Set.of(rec(1, ADDR_A.ACI_PNI), rec(2, ADDR_A.NUM))),
             new T(Set.of(rec(1, ADDR_A.PNI), rec(2, ADDR_A.ACI_NUM)), ADDR_A.ACI_PNI, Set.of(rec(2, ADDR_A.FULL))),
-            new T(Set.of(rec(1, ADDR_A.PNI_S), rec(2, ADDR_A.ACI_NUM)), ADDR_A.ACI_PNI, Set.of(rec(2, ADDR_A.FULL))),
     };
 
     static T[] testInstancesThree = new T[]{
-            // 1
             new T(Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.PNI), rec(3, ADDR_A.NUM)),
                     ADDR_A.FULL,
                     Set.of(rec(1, ADDR_A.FULL))),
@@ -307,11 +227,9 @@ class MergeRecipientHelperTest {
             RecipientAddress FULL,
             RecipientAddress ACI,
             RecipientAddress PNI,
-            RecipientAddress PNI_S,
             RecipientAddress NUM,
             RecipientAddress ACI_NUM,
             RecipientAddress PNI_NUM,
-            RecipientAddress PNI_S_NUM,
             RecipientAddress ACI_PNI
     ) {
 
@@ -319,11 +237,9 @@ class MergeRecipientHelperTest {
             this(new RecipientAddress(serviceId, pni, number),
                     new RecipientAddress(serviceId, null, null),
                     new RecipientAddress(null, pni, null),
-                    new RecipientAddress(ServiceId.from(pni.uuid()), null, null),
                     new RecipientAddress(null, null, number),
                     new RecipientAddress(serviceId, null, number),
                     new RecipientAddress(null, pni, number),
-                    new RecipientAddress(ServiceId.from(pni.uuid()), null, number),
                     new RecipientAddress(serviceId, pni, null));
         }
     }
index 941d9ce0402bc18deb012624a25fd93fc77a3f2d..14a476ce0f18b8caf24d82b47f47deefb033d33d 100644 (file)
@@ -16,7 +16,7 @@ dependencyResolutionManagement {
             library("logback", "ch.qos.logback", "logback-classic").version("1.4.8")
 
 
-            library("signalservice", "com.github.turasa", "signal-service-java").version("2.15.3_unofficial_76")
+            library("signalservice", "com.github.turasa", "signal-service-java").version("2.15.3_unofficial_77")
             library("protobuf", "com.google.protobuf", "protobuf-javalite").version("3.23.0")
             library("sqlite", "org.xerial", "sqlite-jdbc").version("3.42.0.0")
             library("hikari", "com.zaxxer", "HikariCP").version("5.0.1")