]> nmode's Git Repositories - signal-cli/commitdiff
Update libsignal-service-java
authorAsamK <asamk@gmx.de>
Thu, 11 Aug 2022 17:09:41 +0000 (19:09 +0200)
committerAsamK <asamk@gmx.de>
Thu, 11 Aug 2022 18:17:21 +0000 (20:17 +0200)
graalvm-config-dir/reflect-config.json
lib/build.gradle.kts
lib/src/main/java/org/asamk/signal/manager/ProvisioningManagerImpl.java
lib/src/main/java/org/asamk/signal/manager/RegistrationManagerImpl.java
lib/src/main/java/org/asamk/signal/manager/SignalAccountFiles.java
lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java
lib/src/main/java/org/asamk/signal/manager/helper/IncomingMessageHandler.java
lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java

index 389c947c5bac4a29ecf374c4db225b07f76a9009..6777c329b47440fd0e1ca8dec6031a2206b4a5de 100644 (file)
     {"name":"messageRequestResponse_"}, 
     {"name":"outgoingPayment_"}, 
     {"name":"padding_"}, 
+    {"name":"pniChangeNumber_"}, 
     {"name":"pniIdentity_"}, 
     {"name":"read_"}, 
     {"name":"request_"}, 
index f525c91738741927bcd4af0f1b572a31f749674d..12020430579b782c65cd3dbdde2adef6ce4da37b 100644 (file)
@@ -14,7 +14,7 @@ repositories {
 }
 
 dependencies {
-    implementation("com.github.turasa", "signal-service-java", "2.15.3_unofficial_54")
+    implementation("com.github.turasa", "signal-service-java", "2.15.3_unofficial_55")
     implementation("com.fasterxml.jackson.core", "jackson-databind", "2.13.3")
     implementation("com.google.protobuf", "protobuf-javalite", "3.11.4")
     implementation("org.bouncycastle", "bcprov-jdk15on", "1.70")
index e405f54cf419345c178b6971c2708deca296a39b..17569401ba1c0933bf42b9e3fcf31bf96f8ad52e 100644 (file)
@@ -33,6 +33,7 @@ import org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 import org.whispersystems.signalservice.api.push.exceptions.AuthorizationFailedException;
 import org.whispersystems.signalservice.api.util.DeviceNameUtil;
+import org.whispersystems.signalservice.internal.push.ConfirmCodeMessage;
 import org.whispersystems.signalservice.internal.util.DynamicCredentialsProvider;
 
 import java.io.IOException;
@@ -54,6 +55,7 @@ class ProvisioningManagerImpl implements ProvisioningManager {
     private final SignalServiceAccountManager accountManager;
     private final IdentityKeyPair tempIdentityKey;
     private final int registrationId;
+    private final int pniRegistrationId;
     private final String password;
 
     ProvisioningManagerImpl(
@@ -71,6 +73,7 @@ class ProvisioningManagerImpl implements ProvisioningManager {
 
         tempIdentityKey = KeyUtils.generateIdentityKeyPair();
         registrationId = KeyHelper.generateRegistrationId(false);
+        pniRegistrationId = KeyHelper.generateRegistrationId(false);
         password = KeyUtils.createPassword();
         GroupsV2Operations groupsV2Operations;
         try {
@@ -123,10 +126,7 @@ class ProvisioningManagerImpl implements ProvisioningManager {
 
         logger.debug("Finishing new device registration");
         var deviceId = accountManager.finishNewDeviceRegistration(ret.getProvisioningCode(),
-                false,
-                true,
-                registrationId,
-                encryptedDeviceName);
+                new ConfirmCodeMessage(false, true, registrationId, pniRegistrationId, encryptedDeviceName, null));
 
         // Create new account with the synced identity
         var profileKey = ret.getProfileKey() == null ? KeyUtils.createProfileKey() : ret.getProfileKey();
@@ -145,6 +145,7 @@ class ProvisioningManagerImpl implements ProvisioningManager {
                     ret.getAciIdentity(),
                     ret.getPniIdentity(),
                     registrationId,
+                    pniRegistrationId,
                     profileKey,
                     TrustNewIdentity.ON_FIRST_USE);
 
index 5a99b82713de9c451b670c3ee3fba36b8a08e6d4..337aa348ae3811449d83b7d43843dcd4a7d7de37 100644 (file)
@@ -187,7 +187,8 @@ class RegistrationManagerImpl implements RegistrationManager {
                     account.isUnrestrictedUnidentifiedAccess(),
                     capabilities,
                     account.isDiscoverableByPhoneNumber(),
-                    account.getEncryptedDeviceName());
+                    account.getEncryptedDeviceName(),
+                    account.getLocalPniRegistrationId());
             account.setRegistered(true);
             logger.info("Reactivated existing account, verify is not necessary.");
             if (newManagerListener != null) {
@@ -216,7 +217,8 @@ class RegistrationManagerImpl implements RegistrationManager {
                     account.getSelfUnidentifiedAccessKey(),
                     account.isUnrestrictedUnidentifiedAccess(),
                     ServiceConfig.capabilities,
-                    account.isDiscoverableByPhoneNumber());
+                    account.isDiscoverableByPhoneNumber(),
+                    account.getLocalPniRegistrationId());
         } else {
             return accountManager.verifyAccountWithRegistrationLockPin(verificationCode,
                     account.getLocalRegistrationId(),
@@ -225,7 +227,8 @@ class RegistrationManagerImpl implements RegistrationManager {
                     account.getSelfUnidentifiedAccessKey(),
                     account.isUnrestrictedUnidentifiedAccess(),
                     ServiceConfig.capabilities,
-                    account.isDiscoverableByPhoneNumber());
+                    account.isDiscoverableByPhoneNumber(),
+                    account.getLocalPniRegistrationId());
         }
     }
 
index f397b5348e769b2985723eddc6f38b405e9fc586..95fd453d1c270aa782d9f82ab93864bb162f7f4e 100644 (file)
@@ -149,6 +149,7 @@ public class SignalAccountFiles {
             var aciIdentityKey = KeyUtils.generateIdentityKeyPair();
             var pniIdentityKey = KeyUtils.generateIdentityKeyPair();
             var registrationId = KeyHelper.generateRegistrationId(false);
+            var pniRegistrationId = KeyHelper.generateRegistrationId(false);
 
             var profileKey = KeyUtils.createProfileKey();
             var account = SignalAccount.create(pathConfig.dataPath(),
@@ -158,6 +159,7 @@ public class SignalAccountFiles {
                     aciIdentityKey,
                     pniIdentityKey,
                     registrationId,
+                    pniRegistrationId,
                     profileKey,
                     trustNewIdentity);
 
index 0c66a1821b90fef319a6e8b1ab31cf22c9d1513e..78cffa23e670fa0728a31817c958482c4514d0a7 100644 (file)
@@ -13,12 +13,17 @@ import org.asamk.signal.manager.util.NumberVerificationUtils;
 import org.signal.libsignal.protocol.InvalidKeyException;
 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.SignedPreKeyEntity;
 import org.whispersystems.signalservice.api.push.exceptions.AuthorizationFailedException;
 import org.whispersystems.signalservice.api.util.DeviceNameUtil;
+import org.whispersystems.signalservice.internal.push.OutgoingPushMessage;
 
 import java.io.IOException;
+import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 
@@ -103,11 +108,21 @@ public class AccountHelper {
     public void finishChangeNumber(
             String newNumber, String verificationCode, String pin
     ) throws IncorrectPinException, PinLockedException, IOException {
+        // TODO create new PNI identity key
+        final List<OutgoingPushMessage> deviceMessages = null;
+        final Map<String, SignedPreKeyEntity> devicePniSignedPreKeys = null;
+        final Map<String, Integer> pniRegistrationIds = null;
         final var result = NumberVerificationUtils.verifyNumber(verificationCode,
                 pin,
                 context.getPinHelper(),
                 (verificationCode1, registrationLock) -> dependencies.getAccountManager()
-                        .changeNumber(verificationCode1, newNumber, registrationLock));
+                        .changeNumber(new ChangePhoneNumberRequest(newNumber,
+                                verificationCode1,
+                                registrationLock,
+                                account.getPniIdentityKeyPair().getPublicKey(),
+                                deviceMessages,
+                                devicePniSignedPreKeys,
+                                pniRegistrationIds)));
         // TODO handle response
         updateSelfIdentifiers(newNumber, account.getAci(), PNI.parseOrThrow(result.first().getPni()));
     }
@@ -129,7 +144,8 @@ public class AccountHelper {
                         account.isUnrestrictedUnidentifiedAccess(),
                         ServiceConfig.capabilities,
                         account.isDiscoverableByPhoneNumber(),
-                        account.getEncryptedDeviceName());
+                        account.getEncryptedDeviceName(),
+                        account.getLocalPniRegistrationId());
     }
 
     public void addDevice(DeviceLinkInfo deviceLinkInfo) throws IOException, InvalidDeviceLinkException {
index 1d4678fa1d936016d6d14a82962fc0134c71268c..d89c517778b9d96ffddb20ea5a7faa04aec36afb 100644 (file)
@@ -492,6 +492,7 @@ public final class IncomingMessageHandler {
                     pniIdentity.getPrivateKey().toByteArray()));
             actions.add(RefreshPreKeysAction.create());
         }
+        // TODO handle PniChangeNumber
         return actions;
     }
 
index b797290ab0adaa51f35a92c8d11492ecdecb2c38..b3345153bff4864ce692ac3ab289d1e69ec5569e 100644 (file)
@@ -45,6 +45,7 @@ import org.signal.libsignal.protocol.SignalProtocolAddress;
 import org.signal.libsignal.protocol.state.PreKeyRecord;
 import org.signal.libsignal.protocol.state.SessionRecord;
 import org.signal.libsignal.protocol.state.SignedPreKeyRecord;
+import org.signal.libsignal.protocol.util.KeyHelper;
 import org.signal.libsignal.protocol.util.Medium;
 import org.signal.libsignal.zkgroup.InvalidInputException;
 import org.signal.libsignal.zkgroup.profiles.ProfileKey;
@@ -125,6 +126,7 @@ public class SignalAccount implements Closeable {
     private IdentityKeyPair aciIdentityKeyPair;
     private IdentityKeyPair pniIdentityKeyPair;
     private int localRegistrationId;
+    private int localPniRegistrationId;
     private TrustNewIdentity trustNewIdentity;
     private long lastReceiveTimestamp = 0;
 
@@ -186,6 +188,7 @@ public class SignalAccount implements Closeable {
             IdentityKeyPair aciIdentityKey,
             IdentityKeyPair pniIdentityKey,
             int registrationId,
+            int pniRegistrationId,
             ProfileKey profileKey,
             final TrustNewIdentity trustNewIdentity
     ) throws IOException {
@@ -207,6 +210,7 @@ public class SignalAccount implements Closeable {
         signalAccount.aciIdentityKeyPair = aciIdentityKey;
         signalAccount.pniIdentityKeyPair = pniIdentityKey;
         signalAccount.localRegistrationId = registrationId;
+        signalAccount.localPniRegistrationId = pniRegistrationId;
         signalAccount.trustNewIdentity = trustNewIdentity;
         signalAccount.groupStore = new GroupStore(getGroupCachePath(dataPath, accountPath),
                 signalAccount.getRecipientResolver(),
@@ -236,6 +240,7 @@ public class SignalAccount implements Closeable {
             IdentityKeyPair aciIdentityKey,
             IdentityKeyPair pniIdentityKey,
             int registrationId,
+            int pniRegistrationId,
             ProfileKey profileKey,
             final TrustNewIdentity trustNewIdentity
     ) throws IOException {
@@ -254,6 +259,7 @@ public class SignalAccount implements Closeable {
                     aciIdentityKey,
                     pniIdentityKey,
                     registrationId,
+                    pniRegistrationId,
                     profileKey,
                     trustNewIdentity);
         }
@@ -305,6 +311,7 @@ public class SignalAccount implements Closeable {
             IdentityKeyPair aciIdentityKey,
             IdentityKeyPair pniIdentityKey,
             int registrationId,
+            int pniRegistrationId,
             ProfileKey profileKey,
             final TrustNewIdentity trustNewIdentity
     ) throws IOException {
@@ -318,6 +325,7 @@ public class SignalAccount implements Closeable {
         signalAccount.accountPath = accountPath;
         signalAccount.serviceEnvironment = serviceEnvironment;
         signalAccount.localRegistrationId = registrationId;
+        signalAccount.localPniRegistrationId = pniRegistrationId;
         signalAccount.trustNewIdentity = trustNewIdentity;
         signalAccount.setProvisioningData(number,
                 aci,
@@ -549,6 +557,11 @@ public class SignalAccount implements Closeable {
         if (rootNode.hasNonNull("registrationId")) {
             registrationId = rootNode.get("registrationId").asInt();
         }
+        if (rootNode.hasNonNull("pniRegistrationId")) {
+            localPniRegistrationId = rootNode.get("pniRegistrationId").asInt();
+        } else {
+            localPniRegistrationId = KeyHelper.generateRegistrationId(false);
+        }
         IdentityKeyPair aciIdentityKeyPair = null;
         if (rootNode.hasNonNull("identityPrivateKey") && rootNode.hasNonNull("identityKey")) {
             final var publicKeyBytes = Base64.getDecoder().decode(rootNode.get("identityKey").asText());
@@ -855,6 +868,7 @@ public class SignalAccount implements Closeable {
                     .put("lastReceiveTimestamp", lastReceiveTimestamp)
                     .put("password", password)
                     .put("registrationId", localRegistrationId)
+                    .put("pniRegistrationId", localPniRegistrationId)
                     .put("identityPrivateKey",
                             Base64.getEncoder().encodeToString(aciIdentityKeyPair.getPrivateKey().serialize()))
                     .put("identityKey",
@@ -1245,6 +1259,10 @@ public class SignalAccount implements Closeable {
         return localRegistrationId;
     }
 
+    public int getLocalPniRegistrationId() {
+        return localPniRegistrationId;
+    }
+
     public String getPassword() {
         return password;
     }