]> nmode's Git Repositories - signal-cli/commitdiff
Update libsignal-service-java
authorAsamK <asamk@gmx.de>
Sat, 6 Nov 2021 22:00:41 +0000 (23:00 +0100)
committerAsamK <asamk@gmx.de>
Sat, 6 Nov 2021 22:17:03 +0000 (23:17 +0100)
18 files changed:
graalvm-config-dir/reflect-config.json
lib/build.gradle.kts
lib/src/main/java/org/asamk/signal/manager/AvatarStore.java
lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java
lib/src/main/java/org/asamk/signal/manager/ProvisioningManager.java
lib/src/main/java/org/asamk/signal/manager/RegistrationManager.java
lib/src/main/java/org/asamk/signal/manager/SignalDependencies.java
lib/src/main/java/org/asamk/signal/manager/api/MessageEnvelope.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/ProfileHelper.java
lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java
lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupInfoV2.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/util/MessageCacheUtils.java
lib/src/main/java/org/asamk/signal/manager/util/Utils.java

index 9883147795fcb2f52018742df67b8c4ea8b84c30..60a7682cc159ae17bd52eb136fcd474a79df9cf4 100644 (file)
     {"name":"metadata_"}
   ]}
 ,
+{
+  "name":"org.whispersystems.signalservice.internal.util.JsonUtil$AciDeserializer",
+  "methods":[{"name":"<init>","parameterTypes":[] }]}
+,
 {
   "name":"org.whispersystems.signalservice.internal.util.JsonUtil$IdentityKeyDeserializer",
   "methods":[{"name":"<init>","parameterTypes":[] }]}
index 91726ae15e257027e0650b6493c905dd4d1041cf..ae1d88a09aacf218a0d18e33018da4bdb30067db 100644 (file)
@@ -14,9 +14,9 @@ repositories {
 }
 
 dependencies {
-    implementation("com.github.turasa:signal-service-java:2.15.3_unofficial_31")
+    implementation("com.github.turasa:signal-service-java:2.15.3_unofficial_32")
     api("com.fasterxml.jackson.core", "jackson-databind", "2.13.0")
-    implementation("com.google.protobuf:protobuf-javalite:3.10.0")
+    implementation("com.google.protobuf:protobuf-javalite:3.11.4")
     implementation("org.bouncycastle:bcprov-jdk15on:1.69")
     implementation("org.slf4j:slf4j-api:1.7.32")
 }
index 12a6525e4de68aff21482e9761f8fb9fa9d23074..bfeef7259708551c13e37143c1c138c33f404514 100644 (file)
@@ -82,7 +82,7 @@ public class AvatarStore {
     }
 
     private String getLegacyIdentifier(final SignalServiceAddress address) {
-        return address.getNumber().or(() -> address.getUuid().toString());
+        return address.getNumber().or(() -> address.getAci().toString());
     }
 
     private File getProfileAvatarFile(SignalServiceAddress address) {
index dd7d6bee9dba896c3b71af96173a1b7e107b96f4..57ac0aa78beb4446f9faf5e78fb0b2866e9c452e 100644 (file)
@@ -74,6 +74,7 @@ import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
 import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
 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.SignalServiceAddress;
 import org.whispersystems.signalservice.api.util.DeviceNameUtil;
 import org.whispersystems.signalservice.api.util.InvalidNumberException;
@@ -149,7 +150,7 @@ public class ManagerImpl implements Manager {
         this.account = account;
         this.serviceEnvironmentConfig = serviceEnvironmentConfig;
 
-        final var credentialsProvider = new DynamicCredentialsProvider(account.getUuid(),
+        final var credentialsProvider = new DynamicCredentialsProvider(account.getAci(),
                 account.getUsername(),
                 account.getPassword(),
                 account.getDeviceId());
@@ -262,8 +263,8 @@ public class ManagerImpl implements Manager {
             }
         }
         preKeyHelper.refreshPreKeysIfNecessary();
-        if (account.getUuid() == null) {
-            account.setUuid(dependencies.getAccountManager().getOwnUuid());
+        if (account.getAci() == null) {
+            account.setAci(dependencies.getAccountManager().getOwnAci());
         }
         updateAccountAttributes(null);
     }
@@ -293,8 +294,8 @@ public class ManagerImpl implements Manager {
 
         return numbers.stream().collect(Collectors.toMap(n -> n, n -> {
             final var number = canonicalizedNumbers.get(n);
-            final var uuid = registeredUsers.get(number);
-            return new Pair<>(number.isEmpty() ? null : number, uuid);
+            final var aci = registeredUsers.get(number);
+            return new Pair<>(number.isEmpty() ? null : number, aci == null ? null : aci.uuid());
         }));
     }
 
@@ -817,22 +818,22 @@ public class ManagerImpl implements Manager {
         return resolveRecipientTrusted(new SignalServiceAddress(uuid, number));
     }
 
-    private UUID getRegisteredUser(final String number) throws IOException {
-        final Map<String, UUID> uuidMap;
+    private ACI getRegisteredUser(final String number) throws IOException {
+        final Map<String, ACI> aciMap;
         try {
-            uuidMap = getRegisteredUsers(Set.of(number));
+            aciMap = getRegisteredUsers(Set.of(number));
         } catch (NumberFormatException e) {
             throw new IOException(number, e);
         }
-        final var uuid = uuidMap.get(number);
+        final var uuid = aciMap.get(number);
         if (uuid == null) {
             throw new IOException(number, null);
         }
         return uuid;
     }
 
-    private Map<String, UUID> getRegisteredUsers(final Set<String> numbers) throws IOException {
-        final Map<String, UUID> registeredUsers;
+    private Map<String, ACI> getRegisteredUsers(final Set<String> numbers) throws IOException {
+        final Map<String, ACI> registeredUsers;
         try {
             registeredUsers = dependencies.getAccountManager()
                     .getRegisteredUsers(ServiceConfig.getIasKeyStore(),
@@ -842,8 +843,8 @@ public class ManagerImpl implements Manager {
             throw new IOException(e);
         }
 
-        // Store numbers as recipients so we have the number/uuid association
-        registeredUsers.forEach((number, uuid) -> resolveRecipientTrusted(new SignalServiceAddress(uuid, number)));
+        // Store numbers as recipients, so we have the number/uuid association
+        registeredUsers.forEach((number, aci) -> resolveRecipientTrusted(new SignalServiceAddress(aci, number)));
 
         return registeredUsers;
     }
@@ -1313,15 +1314,15 @@ public class ManagerImpl implements Manager {
         // Address in recipient store doesn't have a uuid, this shouldn't happen
         // Try to retrieve the uuid from the server
         final var number = address.getNumber().get();
-        final UUID uuid;
+        final ACI aci;
         try {
-            uuid = getRegisteredUser(number);
+            aci = getRegisteredUser(number);
         } catch (IOException e) {
             logger.warn("Failed to get uuid for e164 number: {}", number, e);
             // Return SignalServiceAddress with unknown UUID
             return address.toSignalServiceAddress();
         }
-        return resolveSignalServiceAddress(account.getRecipientStore().resolveRecipient(uuid));
+        return resolveSignalServiceAddress(account.getRecipientStore().resolveRecipient(aci));
     }
 
     private Set<RecipientId> resolveRecipients(Collection<RecipientIdentifier.Single> recipients) throws IOException {
@@ -1334,8 +1335,8 @@ public class ManagerImpl implements Manager {
     }
 
     private RecipientId resolveRecipient(final RecipientIdentifier.Single recipient) throws IOException {
-        if (recipient instanceof RecipientIdentifier.Uuid) {
-            return account.getRecipientStore().resolveRecipient(((RecipientIdentifier.Uuid) recipient).uuid());
+        if (recipient instanceof RecipientIdentifier.Uuid uuidRecipient) {
+            return account.getRecipientStore().resolveRecipient(ACI.from(uuidRecipient.uuid()));
         } else {
             final var number = ((RecipientIdentifier.Number) recipient).number();
             return account.getRecipientStore().resolveRecipient(number, () -> {
index 8855e0626ea29b45d04000d2662b1165f307936e..bd9385a9251125801b71cec5e4f22809f7ca7716 100644 (file)
@@ -117,7 +117,7 @@ public class ProvisioningManager {
         try {
             account = SignalAccount.createOrUpdateLinkedAccount(pathConfig.dataPath(),
                     number,
-                    ret.getUuid(),
+                    ret.getAci(),
                     password,
                     encryptedDeviceName,
                     deviceId,
index 97361ec5b20b5a948cada789b89719f572705092..4ca12028bd7da62c8bacf96eacd1a3891c0a241b 100644 (file)
@@ -37,8 +37,8 @@ import org.whispersystems.signalservice.api.SignalServiceAccountManager;
 import org.whispersystems.signalservice.api.groupsv2.ClientZkOperations;
 import org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations;
 import org.whispersystems.signalservice.api.kbs.MasterKey;
+import org.whispersystems.signalservice.api.push.ACI;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
-import org.whispersystems.signalservice.api.util.UuidUtil;
 import org.whispersystems.signalservice.internal.ServiceResponse;
 import org.whispersystems.signalservice.internal.push.LockedException;
 import org.whispersystems.signalservice.internal.push.RequestVerificationCodeResponse;
@@ -190,7 +190,7 @@ public class RegistrationManager implements Closeable {
         }
 
         //accountManager.setGcmId(Optional.of(GoogleCloudMessaging.getInstance(this).register(REGISTRATION_ID)));
-        account.finishRegistration(UuidUtil.parseOrNull(response.getUuid()), masterKey, pin);
+        account.finishRegistration(ACI.parseOrNull(response.getUuid()), masterKey, pin);
 
         ManagerImpl m = null;
         try {
index 3478239f0dbac7fe86f1dae285486d0fe91433d2..0f28647fd619ec4abb87dec66f331da40ec1bb3d 100644 (file)
@@ -170,7 +170,7 @@ public class SignalDependencies {
     public SignalServiceCipher getCipher() {
         return getOrCreate(() -> cipher, () -> {
             final var certificateValidator = new CertificateValidator(serviceEnvironmentConfig.getUnidentifiedSenderTrustRoot());
-            final var address = new SignalServiceAddress(credentialsProvider.getUuid(), credentialsProvider.getE164());
+            final var address = new SignalServiceAddress(credentialsProvider.getAci(), credentialsProvider.getE164());
             cipher = new SignalServiceCipher(address, dataStore, sessionLock, certificateValidator);
         });
     }
index 7d26e214430d7eb6958cc5d2145f6ff0948762ba..776e9f32ee5a324f2d5e7bddd8b8c23113df77e0 100644 (file)
@@ -236,7 +236,7 @@ public record MessageEnvelope(
                     RecipientResolver recipientResolver,
                     RecipientAddressResolver addressResolver
             ) {
-                return new Mention(addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(mention.getUuid())),
+                return new Mention(addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(mention.getAci())),
                         mention.getStart(),
                         mention.getLength());
             }
index d7d605c34b0f871f2ca130e9bbe225a5ee471f72..7ef262c70d855ba0f3f340db0b85976d860b458d 100644 (file)
@@ -43,8 +43,8 @@ import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentStre
 import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
 import org.whispersystems.signalservice.api.messages.SignalServiceGroup;
 import org.whispersystems.signalservice.api.messages.SignalServiceGroupV2;
+import org.whispersystems.signalservice.api.push.ACI;
 import org.whispersystems.signalservice.api.push.exceptions.ConflictException;
-import org.whispersystems.signalservice.api.util.UuidUtil;
 
 import java.io.File;
 import java.io.IOException;
@@ -410,8 +410,8 @@ public class GroupHelper {
 
     private void storeProfileKeysFromMembers(final DecryptedGroup group) {
         for (var member : group.getMembersList()) {
-            final var uuid = UuidUtil.parseOrThrow(member.getUuid().toByteArray());
-            final var recipientId = account.getRecipientStore().resolveRecipient(uuid);
+            final var aci = ACI.fromByteString(member.getUuid());
+            final var recipientId = account.getRecipientStore().resolveRecipient(aci);
             try {
                 account.getProfileStore()
                         .storeProfileKey(recipientId, new ProfileKey(member.getProfileKey().toByteArray()));
index be2ab21530a6d12ee084c20e5977296078bf703f..47e0835f8f2ba16d61e08c36606baeb8b4412c05 100644 (file)
@@ -35,9 +35,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.SignalServiceAddress;
 import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
-import org.whispersystems.signalservice.api.util.UuidUtil;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -158,9 +158,9 @@ public class GroupV2Helper {
 
         if (!areMembersValid(members)) return null;
 
-        var self = new GroupCandidate(getSelfUuid(), Optional.fromNullable(profileKeyCredential));
+        var self = new GroupCandidate(getSelfAci().uuid(), Optional.fromNullable(profileKeyCredential));
         var candidates = members.stream()
-                .map(member -> new GroupCandidate(addressResolver.resolveSignalServiceAddress(member).getUuid(),
+                .map(member -> new GroupCandidate(addressResolver.resolveSignalServiceAddress(member).getAci().uuid(),
                         Optional.fromNullable(profileKeyCredentialProvider.getProfileKeyCredential(member))))
                 .collect(Collectors.toSet());
 
@@ -208,8 +208,7 @@ public class GroupV2Helper {
             change.setModifyAvatar(GroupChange.Actions.ModifyAvatarAction.newBuilder().setAvatar(avatarCdnKey));
         }
 
-        final var uuid = getSelfUuid();
-        change.setSourceUuid(UuidUtil.toByteString(uuid));
+        change.setSourceUuid(getSelfAci().toByteString());
 
         return commitChange(groupInfoV2, change);
     }
@@ -224,14 +223,14 @@ public class GroupV2Helper {
         }
 
         var candidates = newMembers.stream()
-                .map(member -> new GroupCandidate(addressResolver.resolveSignalServiceAddress(member).getUuid(),
+                .map(member -> new GroupCandidate(addressResolver.resolveSignalServiceAddress(member).getAci().uuid(),
                         Optional.fromNullable(profileKeyCredentialProvider.getProfileKeyCredential(member))))
                 .collect(Collectors.toSet());
 
-        final var uuid = getSelfUuid();
-        final var change = groupOperations.createModifyGroupMembershipChange(candidates, uuid);
+        final var aci = getSelfAci();
+        final var change = groupOperations.createModifyGroupMembershipChange(candidates, aci.uuid());
 
-        change.setSourceUuid(UuidUtil.toByteString(uuid));
+        change.setSourceUuid(getSelfAci().toByteString());
 
         return commitChange(groupInfoV2, change);
     }
@@ -240,8 +239,8 @@ public class GroupV2Helper {
             GroupInfoV2 groupInfoV2, Set<RecipientId> membersToMakeAdmin
     ) throws IOException {
         var pendingMembersList = groupInfoV2.getGroup().getPendingMembersList();
-        final var selfUuid = getSelfUuid();
-        var selfPendingMember = DecryptedGroupUtil.findPendingByUuid(pendingMembersList, selfUuid);
+        final var selfAci = getSelfAci();
+        var selfPendingMember = DecryptedGroupUtil.findPendingByUuid(pendingMembersList, selfAci.uuid());
 
         if (selfPendingMember.isPresent()) {
             return revokeInvites(groupInfoV2, Set.of(selfPendingMember.get()));
@@ -249,10 +248,12 @@ public class GroupV2Helper {
 
         final var adminUuids = membersToMakeAdmin.stream()
                 .map(addressResolver::resolveSignalServiceAddress)
-                .map(SignalServiceAddress::getUuid)
+                .map(SignalServiceAddress::getAci)
+                .map(ACI::uuid)
                 .collect(Collectors.toList());
         final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2);
-        return commitChange(groupInfoV2, groupOperations.createLeaveAndPromoteMembersToAdmin(selfUuid, adminUuids));
+        return commitChange(groupInfoV2,
+                groupOperations.createLeaveAndPromoteMembersToAdmin(selfAci.uuid(), adminUuids));
     }
 
     public Pair<DecryptedGroup, GroupChange> removeMembers(
@@ -260,7 +261,8 @@ public class GroupV2Helper {
     ) throws IOException {
         final var memberUuids = members.stream()
                 .map(addressResolver::resolveSignalServiceAddress)
-                .map(SignalServiceAddress::getUuid)
+                .map(SignalServiceAddress::getAci)
+                .map(ACI::uuid)
                 .collect(Collectors.toSet());
         return ejectMembers(groupInfoV2, memberUuids);
     }
@@ -271,7 +273,8 @@ public class GroupV2Helper {
         var pendingMembersList = groupInfoV2.getGroup().getPendingMembersList();
         final var memberUuids = members.stream()
                 .map(addressResolver::resolveSignalServiceAddress)
-                .map(SignalServiceAddress::getUuid)
+                .map(SignalServiceAddress::getAci)
+                .map(ACI::uuid)
                 .map(uuid -> DecryptedGroupUtil.findPendingByUuid(pendingMembersList, uuid))
                 .filter(Optional::isPresent)
                 .map(Optional::get)
@@ -341,8 +344,7 @@ public class GroupV2Helper {
                 ? groupOperations.createGroupJoinRequest(profileKeyCredential)
                 : groupOperations.createGroupJoinDirect(profileKeyCredential);
 
-        change.setSourceUuid(UuidUtil.toByteString(addressResolver.resolveSignalServiceAddress(selfRecipientId)
-                .getUuid()));
+        change.setSourceUuid(addressResolver.resolveSignalServiceAddress(selfRecipientId).getAci().toByteString());
 
         return commitChange(groupSecretParams, decryptedGroupJoinInfo.getRevision(), change, groupLinkPassword);
     }
@@ -358,8 +360,8 @@ public class GroupV2Helper {
 
         final var change = groupOperations.createAcceptInviteChange(profileKeyCredential);
 
-        final var uuid = addressResolver.resolveSignalServiceAddress(selfRecipientId).getUuid();
-        change.setSourceUuid(UuidUtil.toByteString(uuid));
+        final var aci = addressResolver.resolveSignalServiceAddress(selfRecipientId).getAci();
+        change.setSourceUuid(aci.toByteString());
 
         return commitChange(groupInfoV2, change);
     }
@@ -370,7 +372,7 @@ public class GroupV2Helper {
         final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2);
         final var address = addressResolver.resolveSignalServiceAddress(recipientId);
         final var newRole = admin ? Member.Role.ADMINISTRATOR : Member.Role.DEFAULT;
-        final var change = groupOperations.createChangeMemberRole(address.getUuid(), newRole);
+        final var change = groupOperations.createChangeMemberRole(address.getAci().uuid(), newRole);
         return commitChange(groupInfoV2, change);
     }
 
@@ -443,7 +445,7 @@ public class GroupV2Helper {
         final DecryptedGroup decryptedGroupState;
 
         try {
-            decryptedChange = groupOperations.decryptChange(changeActions, getSelfUuid());
+            decryptedChange = groupOperations.decryptChange(changeActions, getSelfAci().uuid());
             decryptedGroupState = DecryptedGroupUtil.apply(previousGroupState, decryptedChange);
         } catch (VerificationFailedException | InvalidGroupStateException | NotAbleToApplyGroupV2ChangeException e) {
             throw new IOException(e);
@@ -510,15 +512,15 @@ public class GroupV2Helper {
         final var credentials = groupsV2Api.getCredentials(today);
         // TODO cache credentials until they expire
         var authCredentialResponse = credentials.get(today);
-        final var uuid = getSelfUuid();
+        final var aci = getSelfAci();
         try {
-            return groupsV2Api.getGroupsV2AuthorizationString(uuid, today, groupSecretParams, authCredentialResponse);
+            return groupsV2Api.getGroupsV2AuthorizationString(aci, today, groupSecretParams, authCredentialResponse);
         } catch (VerificationFailedException e) {
             throw new IOException(e);
         }
     }
 
-    private UUID getSelfUuid() {
-        return addressResolver.resolveSignalServiceAddress(this.selfRecipientIdProvider.getSelfRecipientId()).getUuid();
+    private ACI getSelfAci() {
+        return addressResolver.resolveSignalServiceAddress(this.selfRecipientIdProvider.getSelfRecipientId()).getAci();
     }
 }
index 96188c4e351b3330f7faa992daf5ca7114edcf4d..d1c4f70e533ab44870686c574c1ecbbf65881948 100644 (file)
@@ -142,7 +142,7 @@ public final class ProfileHelper {
                     ? avatarStore.retrieveProfileAvatar(account.getSelfAddress())
                     : avatar.isPresent() ? Utils.createStreamDetailsFromFile(avatar.get()) : null) {
                 final var avatarPath = dependencies.getAccountManager()
-                        .setVersionedProfile(account.getUuid(),
+                        .setVersionedProfile(account.getAci(),
                                 account.getProfileKey(),
                                 newProfile.getInternalServiceName(),
                                 newProfile.getAbout() == null ? "" : newProfile.getAbout(),
index 37057008453ce1983d588ab19621515d82cd8463..e84028cfe7ebc6b66d54389171cd9c712de217f9 100644 (file)
@@ -44,6 +44,7 @@ import org.whispersystems.libsignal.state.SignedPreKeyRecord;
 import org.whispersystems.libsignal.util.Medium;
 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.SignalServiceAddress;
 import org.whispersystems.signalservice.api.storage.StorageKey;
 import org.whispersystems.signalservice.api.util.UuidUtil;
@@ -77,7 +78,7 @@ public class SignalAccount implements Closeable {
     private final FileLock lock;
 
     private String username;
-    private UUID uuid;
+    private ACI aci;
     private String encryptedDeviceName;
     private int deviceId = SignalServiceAddress.DEFAULT_DEVICE_ID;
     private boolean isMultiDevice = false;
@@ -205,7 +206,7 @@ public class SignalAccount implements Closeable {
     public static SignalAccount createOrUpdateLinkedAccount(
             File dataPath,
             String username,
-            UUID uuid,
+            ACI aci,
             String password,
             String encryptedDeviceName,
             int deviceId,
@@ -219,7 +220,7 @@ public class SignalAccount implements Closeable {
         if (!fileName.exists()) {
             return createLinkedAccount(dataPath,
                     username,
-                    uuid,
+                    aci,
                     password,
                     encryptedDeviceName,
                     deviceId,
@@ -230,7 +231,7 @@ public class SignalAccount implements Closeable {
         }
 
         final var account = load(dataPath, username, true, trustNewIdentity);
-        account.setProvisioningData(username, uuid, password, encryptedDeviceName, deviceId, profileKey);
+        account.setProvisioningData(username, aci, password, encryptedDeviceName, deviceId, profileKey);
         account.recipientStore.resolveRecipientTrusted(account.getSelfAddress());
         account.sessionStore.archiveAllSessions();
         account.senderKeyStore.deleteAll();
@@ -249,7 +250,7 @@ public class SignalAccount implements Closeable {
     private static SignalAccount createLinkedAccount(
             File dataPath,
             String username,
-            UUID uuid,
+            ACI aci,
             String password,
             String encryptedDeviceName,
             int deviceId,
@@ -264,7 +265,7 @@ public class SignalAccount implements Closeable {
         final var pair = openFileChannel(fileName, true);
         var account = new SignalAccount(pair.first(), pair.second());
 
-        account.setProvisioningData(username, uuid, password, encryptedDeviceName, deviceId, profileKey);
+        account.setProvisioningData(username, aci, password, encryptedDeviceName, deviceId, profileKey);
 
         account.initStores(dataPath, identityKey, registrationId, trustNewIdentity);
         account.groupStore = new GroupStore(getGroupCachePath(dataPath, username),
@@ -282,14 +283,14 @@ public class SignalAccount implements Closeable {
 
     private void setProvisioningData(
             final String username,
-            final UUID uuid,
+            final ACI aci,
             final String password,
             final String encryptedDeviceName,
             final int deviceId,
             final ProfileKey profileKey
     ) {
         this.username = username;
-        this.uuid = uuid;
+        this.aci = aci;
         this.password = password;
         this.profileKey = profileKey;
         this.encryptedDeviceName = encryptedDeviceName;
@@ -404,7 +405,7 @@ public class SignalAccount implements Closeable {
         registered = Utils.getNotNullNode(rootNode, "registered").asBoolean();
         if (rootNode.hasNonNull("uuid")) {
             try {
-                uuid = UUID.fromString(rootNode.get("uuid").asText());
+                aci = ACI.from(UUID.fromString(rootNode.get("uuid").asText()));
             } catch (IllegalArgumentException e) {
                 throw new IOException("Config file contains an invalid uuid, needs to be a valid UUID", e);
             }
@@ -702,7 +703,7 @@ public class SignalAccount implements Closeable {
             var rootNode = jsonProcessor.createObjectNode();
             rootNode.put("version", CURRENT_STORAGE_VERSION)
                     .put("username", username)
-                    .put("uuid", uuid == null ? null : uuid.toString())
+                    .put("uuid", aci == null ? null : aci.toString())
                     .put("deviceName", encryptedDeviceName)
                     .put("deviceId", deviceId)
                     .put("isMultiDevice", isMultiDevice)
@@ -830,21 +831,21 @@ public class SignalAccount implements Closeable {
         return username;
     }
 
-    public UUID getUuid() {
-        return uuid;
+    public ACI getAci() {
+        return aci;
     }
 
-    public void setUuid(final UUID uuid) {
-        this.uuid = uuid;
+    public void setAci(final ACI aci) {
+        this.aci = aci;
         save();
     }
 
     public SignalServiceAddress getSelfAddress() {
-        return new SignalServiceAddress(uuid, username);
+        return new SignalServiceAddress(aci, username);
     }
 
     public RecipientId getSelfRecipientId() {
-        return recipientStore.resolveRecipientTrusted(new RecipientAddress(uuid, username));
+        return recipientStore.resolveRecipientTrusted(new RecipientAddress(aci.uuid(), username));
     }
 
     public String getEncryptedDeviceName() {
@@ -991,7 +992,7 @@ public class SignalAccount implements Closeable {
         return true;
     }
 
-    public void finishRegistration(final UUID uuid, final MasterKey masterKey, final String pin) {
+    public void finishRegistration(final ACI aci, final MasterKey masterKey, final String pin) {
         this.pinMasterKey = masterKey;
         this.storageManifestVersion = -1;
         this.storageKey = null;
@@ -999,7 +1000,7 @@ public class SignalAccount implements Closeable {
         this.deviceId = SignalServiceAddress.DEFAULT_DEVICE_ID;
         this.isMultiDevice = false;
         this.registered = true;
-        this.uuid = uuid;
+        this.aci = aci;
         this.registrationLockPin = pin;
         this.lastReceiveTimestamp = 0;
         save();
index 793cde5d9c81b5c35464d1937ffd8cb14b17f100..752d42baf279d7d6e1a00df8c68ea8557dee34aa 100644 (file)
@@ -10,7 +10,7 @@ import org.signal.storageservice.protos.groups.Member;
 import org.signal.storageservice.protos.groups.local.DecryptedGroup;
 import org.signal.storageservice.protos.groups.local.EnabledState;
 import org.signal.zkgroup.groups.GroupMasterKey;
-import org.whispersystems.signalservice.api.util.UuidUtil;
+import org.whispersystems.signalservice.api.push.ACI;
 
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -99,7 +99,7 @@ public final class GroupInfoV2 extends GroupInfo {
         }
         return group.getMembersList()
                 .stream()
-                .map(m -> UuidUtil.parseOrThrow(m.getUuid().toByteArray()))
+                .map(m -> ACI.fromByteString(m.getUuid()))
                 .map(recipientResolver::resolveRecipient)
                 .collect(Collectors.toSet());
     }
@@ -111,7 +111,7 @@ public final class GroupInfoV2 extends GroupInfo {
         }
         return group.getPendingMembersList()
                 .stream()
-                .map(m -> UuidUtil.parseOrThrow(m.getUuid().toByteArray()))
+                .map(m -> ACI.fromByteString(m.getUuid()))
                 .map(recipientResolver::resolveRecipient)
                 .collect(Collectors.toSet());
     }
@@ -123,7 +123,7 @@ public final class GroupInfoV2 extends GroupInfo {
         }
         return group.getRequestingMembersList()
                 .stream()
-                .map(m -> UuidUtil.parseOrThrow(m.getUuid().toByteArray()))
+                .map(m -> ACI.fromByteString(m.getUuid()))
                 .map(recipientResolver::resolveRecipient)
                 .collect(Collectors.toSet());
     }
@@ -136,7 +136,7 @@ public final class GroupInfoV2 extends GroupInfo {
         return group.getMembersList()
                 .stream()
                 .filter(m -> m.getRole() == Member.Role.ADMINISTRATOR)
-                .map(m -> UuidUtil.parseOrThrow(m.getUuid().toByteArray()))
+                .map(m -> ACI.fromByteString(m.getUuid()))
                 .map(recipientResolver::resolveRecipient)
                 .collect(Collectors.toSet());
     }
index b74631b9300a5e5558e01271365a6afc5f026e50..1e33c47ea86228550695d8a853d47e3dd8ea707f 100644 (file)
@@ -1,5 +1,6 @@
 package org.asamk.signal.manager.storage.recipients;
 
+import org.whispersystems.signalservice.api.push.ACI;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 
 import java.util.Optional;
@@ -7,7 +8,7 @@ import java.util.UUID;
 
 public class RecipientAddress {
 
-    public static final UUID UNKNOWN_UUID = new UUID(0, 0);
+    public static final UUID UNKNOWN_UUID = ACI.UNKNOWN.uuid();
 
     private final Optional<UUID> uuid;
     private final Optional<String> e164;
@@ -33,7 +34,7 @@ public class RecipientAddress {
     }
 
     public RecipientAddress(SignalServiceAddress address) {
-        this(Optional.of(address.getUuid()), Optional.ofNullable(address.getNumber().orNull()));
+        this(Optional.of(address.getAci().uuid()), Optional.ofNullable(address.getNumber().orNull()));
     }
 
     public RecipientAddress(UUID uuid) {
@@ -75,7 +76,7 @@ public class RecipientAddress {
     }
 
     public SignalServiceAddress toSignalServiceAddress() {
-        return new SignalServiceAddress(uuid.orElse(UNKNOWN_UUID),
+        return new SignalServiceAddress(ACI.from(uuid.orElse(UNKNOWN_UUID)),
                 org.whispersystems.libsignal.util.guava.Optional.fromNullable(e164.orElse(null)));
     }
 
index a76e5b50dd385a682e5f0941b417234ee1ef520c..06747684f81e2f412b1d3ec247068a2418c7aca1 100644 (file)
@@ -1,9 +1,8 @@
 package org.asamk.signal.manager.storage.recipients;
 
+import org.whispersystems.signalservice.api.push.ACI;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 
-import java.util.UUID;
-
 public interface RecipientResolver {
 
     RecipientId resolveRecipient(String identifier);
@@ -12,5 +11,5 @@ public interface RecipientResolver {
 
     RecipientId resolveRecipient(SignalServiceAddress address);
 
-    RecipientId resolveRecipient(UUID uuid);
+    RecipientId resolveRecipient(ACI aci);
 }
index 180512584c013624abc968b91552414e50867c1b..26a43423927dba73a16a7b835b99f7b7e7a4ec56 100644 (file)
@@ -11,6 +11,7 @@ import org.signal.zkgroup.profiles.ProfileKey;
 import org.signal.zkgroup.profiles.ProfileKeyCredential;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.whispersystems.signalservice.api.push.ACI;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException;
 import org.whispersystems.signalservice.api.util.UuidUtil;
@@ -137,8 +138,8 @@ public class RecipientStore implements RecipientResolver, ContactsStore, Profile
     }
 
     @Override
-    public RecipientId resolveRecipient(UUID uuid) {
-        return resolveRecipient(new RecipientAddress(uuid), false);
+    public RecipientId resolveRecipient(ACI aci) {
+        return resolveRecipient(new RecipientAddress(aci.uuid()), false);
     }
 
     @Override
@@ -147,19 +148,19 @@ public class RecipientStore implements RecipientResolver, ContactsStore, Profile
     }
 
     public RecipientId resolveRecipient(
-            final String number, Supplier<UUID> uuidSupplier
+            final String number, Supplier<ACI> aciSupplier
     ) throws UnregisteredUserException {
         final Optional<Recipient> byNumber;
         synchronized (recipients) {
             byNumber = findByNumberLocked(number);
         }
         if (byNumber.isEmpty() || byNumber.get().getAddress().getUuid().isEmpty()) {
-            final var uuid = uuidSupplier.get();
-            if (uuid == null) {
+            final var aci = aciSupplier.get();
+            if (aci == null) {
                 throw new UnregisteredUserException(number, null);
             }
 
-            return resolveRecipient(new RecipientAddress(uuid, number), false);
+            return resolveRecipient(new RecipientAddress(aci.uuid(), number), false);
         }
         return byNumber.get().getRecipientId();
     }
index ed94f39e609044258fead499ec09f30016d463a6..7c754d55618b8b41b243dfd4ceeea628833c80f5 100644 (file)
@@ -2,8 +2,8 @@ package org.asamk.signal.manager.util;
 
 import org.whispersystems.libsignal.util.guava.Optional;
 import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
+import org.whispersystems.signalservice.api.push.ACI;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
-import org.whispersystems.signalservice.api.util.UuidUtil;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
@@ -11,7 +11,6 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
-import java.util.UUID;
 
 public class MessageCacheUtils {
 
@@ -24,9 +23,9 @@ public class MessageCacheUtils {
             }
             var type = in.readInt();
             var source = in.readUTF();
-            UUID sourceUuid = null;
+            ACI sourceAci = null;
             if (version >= 3) {
-                sourceUuid = UuidUtil.parseOrNull(in.readUTF());
+                sourceAci = ACI.parseOrNull(in.readUTF());
             }
             var sourceDevice = in.readInt();
             if (version == 1) {
@@ -59,9 +58,9 @@ public class MessageCacheUtils {
             if (version >= 4) {
                 serverDeliveredTimestamp = in.readLong();
             }
-            Optional<SignalServiceAddress> addressOptional = sourceUuid == null
+            Optional<SignalServiceAddress> addressOptional = sourceAci == null
                     ? Optional.absent()
-                    : Optional.of(new SignalServiceAddress(sourceUuid, source));
+                    : Optional.of(new SignalServiceAddress(sourceAci, source));
             return new SignalServiceEnvelope(type,
                     addressOptional,
                     sourceDevice,
index 3530d6ad7818d1cd51454f056541d55ba8eaa98a..02115c3e18759d3a46dcef1f9317ade363d28f56 100644 (file)
@@ -5,7 +5,6 @@ import org.whispersystems.libsignal.fingerprint.Fingerprint;
 import org.whispersystems.libsignal.fingerprint.NumericFingerprintGenerator;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 import org.whispersystems.signalservice.api.util.StreamDetails;
-import org.whispersystems.signalservice.api.util.UuidUtil;
 
 import java.io.BufferedInputStream;
 import java.io.File;
@@ -51,8 +50,8 @@ public class Utils {
         if (isUuidCapable) {
             // Version 2: UUID user
             version = 2;
-            ownId = UuidUtil.toByteArray(ownAddress.getUuid());
-            theirId = UuidUtil.toByteArray(theirAddress.getUuid());
+            ownId = ownAddress.getAci().toByteArray();
+            theirId = theirAddress.getAci().toByteArray();
         } else {
             // Version 1: E164 user
             version = 1;