X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/9e3c9db5c0d8f8e35408ff65a60b7db0e455b73d..0bc21412458fbc21690f2b011c3e71ec19f374fb:/lib/src/main/java/org/asamk/signal/manager/ProvisioningManager.java diff --git a/lib/src/main/java/org/asamk/signal/manager/ProvisioningManager.java b/lib/src/main/java/org/asamk/signal/manager/ProvisioningManager.java index 67506be8..e6fe2a60 100644 --- a/lib/src/main/java/org/asamk/signal/manager/ProvisioningManager.java +++ b/lib/src/main/java/org/asamk/signal/manager/ProvisioningManager.java @@ -21,17 +21,15 @@ import org.asamk.signal.manager.config.ServiceEnvironment; import org.asamk.signal.manager.config.ServiceEnvironmentConfig; import org.asamk.signal.manager.storage.SignalAccount; import org.asamk.signal.manager.util.KeyUtils; -import org.signal.zkgroup.InvalidInputException; -import org.signal.zkgroup.profiles.ProfileKey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.whispersystems.libsignal.IdentityKeyPair; -import org.whispersystems.libsignal.InvalidKeyException; import org.whispersystems.libsignal.util.KeyHelper; 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.push.SignalServiceAddress; +import org.whispersystems.signalservice.api.util.DeviceNameUtil; import org.whispersystems.signalservice.api.util.SleepTimer; import org.whispersystems.signalservice.api.util.UptimeSleepTimer; import org.whispersystems.signalservice.internal.util.DynamicCredentialsProvider; @@ -50,7 +48,7 @@ public class ProvisioningManager { private final String userAgent; private final SignalServiceAccountManager accountManager; - private final IdentityKeyPair identityKey; + private final IdentityKeyPair tempIdentityKey; private final int registrationId; private final String password; @@ -59,7 +57,7 @@ public class ProvisioningManager { this.serviceEnvironmentConfig = serviceEnvironmentConfig; this.userAgent = userAgent; - identityKey = KeyUtils.generateIdentityKeyPair(); + tempIdentityKey = KeyUtils.generateIdentityKeyPair(); registrationId = KeyHelper.generateRegistrationId(false); password = KeyUtils.createPassword(); final SleepTimer timer = new UptimeSleepTimer(); @@ -90,38 +88,40 @@ public class ProvisioningManager { public URI getDeviceLinkUri() throws TimeoutException, IOException { var deviceUuid = accountManager.getNewDeviceUuid(); - return new DeviceLinkInfo(deviceUuid, identityKey.getPublicKey().getPublicKey()).createDeviceLinkUri(); + return new DeviceLinkInfo(deviceUuid, tempIdentityKey.getPublicKey().getPublicKey()).createDeviceLinkUri(); } - public Manager finishDeviceLink(String deviceName) throws IOException, InvalidKeyException, TimeoutException, UserAlreadyExists { - var ret = accountManager.finishNewDeviceRegistration(identityKey, false, true, registrationId, deviceName); + public Manager finishDeviceLink(String deviceName) throws IOException, TimeoutException, UserAlreadyExists { + var ret = accountManager.getNewDeviceRegistration(tempIdentityKey); + var number = ret.getNumber(); - var username = ret.getNumber(); - // TODO do this check before actually registering - if (SignalAccount.userExists(pathConfig.getDataPath(), username)) { - throw new UserAlreadyExists(username, SignalAccount.getFileName(pathConfig.getDataPath(), username)); + logger.info("Received link information from {}, linking in progress ...", number); + + if (SignalAccount.userExists(pathConfig.getDataPath(), number)) { + throw new UserAlreadyExists(number, SignalAccount.getFileName(pathConfig.getDataPath(), number)); } + var encryptedDeviceName = deviceName == null + ? null + : DeviceNameUtil.encryptDeviceName(deviceName, ret.getIdentity().getPrivateKey()); + + var deviceId = accountManager.finishNewDeviceRegistration(ret.getProvisioningCode(), + false, + true, + registrationId, + encryptedDeviceName); + // Create new account with the synced identity - var profileKeyBytes = ret.getProfileKey(); - ProfileKey profileKey; - if (profileKeyBytes == null) { - profileKey = KeyUtils.createProfileKey(); - } else { - try { - profileKey = new ProfileKey(profileKeyBytes); - } catch (InvalidInputException e) { - throw new IOException("Received invalid profileKey", e); - } - } + var profileKey = ret.getProfileKey() == null ? KeyUtils.createProfileKey() : ret.getProfileKey(); SignalAccount account = null; try { account = SignalAccount.createLinkedAccount(pathConfig.getDataPath(), - username, + number, ret.getUuid(), password, - ret.getDeviceId(), + encryptedDeviceName, + deviceId, ret.getIdentity(), registrationId, profileKey);