X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/2e01a05e7110b4f94abb10489a28b73d9f4be9c0..b7005884fdcfa8d95f54e557ddbf2fe4201962f8:/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 90dc6c66..cfb4fe4b 100644 --- a/lib/src/main/java/org/asamk/signal/manager/ProvisioningManager.java +++ b/lib/src/main/java/org/asamk/signal/manager/ProvisioningManager.java @@ -38,6 +38,7 @@ import java.io.File; import java.io.IOException; import java.net.URI; import java.util.concurrent.TimeoutException; +import java.util.function.Consumer; public class ProvisioningManager { @@ -46,16 +47,23 @@ public class ProvisioningManager { private final PathConfig pathConfig; private final ServiceEnvironmentConfig serviceEnvironmentConfig; private final String userAgent; + private final Consumer newManagerListener; private final SignalServiceAccountManager accountManager; private final IdentityKeyPair tempIdentityKey; private final int registrationId; private final String password; - ProvisioningManager(PathConfig pathConfig, ServiceEnvironmentConfig serviceEnvironmentConfig, String userAgent) { + ProvisioningManager( + PathConfig pathConfig, + ServiceEnvironmentConfig serviceEnvironmentConfig, + String userAgent, + final Consumer newManagerListener + ) { this.pathConfig = pathConfig; this.serviceEnvironmentConfig = serviceEnvironmentConfig; this.userAgent = userAgent; + this.newManagerListener = newManagerListener; tempIdentityKey = KeyUtils.generateIdentityKeyPair(); registrationId = KeyHelper.generateRegistrationId(false); @@ -75,12 +83,21 @@ public class ProvisioningManager { public static ProvisioningManager init( File settingsPath, ServiceEnvironment serviceEnvironment, String userAgent + ) { + return init(settingsPath, serviceEnvironment, userAgent, null); + } + + public static ProvisioningManager init( + File settingsPath, + ServiceEnvironment serviceEnvironment, + String userAgent, + Consumer newManagerListener ) { var pathConfig = PathConfig.createDefault(settingsPath); final var serviceConfiguration = ServiceConfig.getServiceEnvironmentConfig(serviceEnvironment, userAgent); - return new ProvisioningManager(pathConfig, serviceConfiguration, userAgent); + return new ProvisioningManager(pathConfig, serviceConfiguration, userAgent, newManagerListener); } public URI getDeviceLinkUri() throws TimeoutException, IOException { @@ -89,14 +106,14 @@ public class ProvisioningManager { return new DeviceLinkInfo(deviceUuid, tempIdentityKey.getPublicKey().getPublicKey()).createDeviceLinkUri(); } - public Manager finishDeviceLink(String deviceName) throws IOException, TimeoutException, UserAlreadyExists { + public String finishDeviceLink(String deviceName) throws IOException, TimeoutException, UserAlreadyExists { var ret = accountManager.getNewDeviceRegistration(tempIdentityKey); var number = ret.getNumber(); logger.info("Received link information from {}, linking in progress ...", number); - if (SignalAccount.userExists(pathConfig.getDataPath(), number) && !canRelinkExistingAccount(number)) { - throw new UserAlreadyExists(number, SignalAccount.getFileName(pathConfig.getDataPath(), number)); + if (SignalAccount.userExists(pathConfig.dataPath(), number) && !canRelinkExistingAccount(number)) { + throw new UserAlreadyExists(number, SignalAccount.getFileName(pathConfig.dataPath(), number)); } var encryptedDeviceName = deviceName == null @@ -115,9 +132,9 @@ public class ProvisioningManager { SignalAccount account = null; try { - account = SignalAccount.createOrUpdateLinkedAccount(pathConfig.getDataPath(), + account = SignalAccount.createOrUpdateLinkedAccount(pathConfig.dataPath(), number, - ret.getUuid(), + ret.getAci(), password, encryptedDeviceName, deviceId, @@ -126,31 +143,31 @@ public class ProvisioningManager { profileKey, TrustNewIdentity.ON_FIRST_USE); - Manager m = null; + ManagerImpl m = null; try { - m = new Manager(account, pathConfig, serviceEnvironmentConfig, userAgent); + m = new ManagerImpl(account, pathConfig, serviceEnvironmentConfig, userAgent); + account = null; logger.debug("Refreshing pre keys"); try { m.refreshPreKeys(); } catch (Exception e) { - logger.error("Failed to check new account state."); - throw e; + logger.error("Failed to refresh pre keys."); } logger.debug("Requesting sync data"); try { m.requestAllSyncData(); } catch (Exception e) { - logger.error("Failed to request sync messages from linked device."); - throw e; + logger.error( + "Failed to request sync messages from linked device, data can be requested again with `sendSyncRequest`."); } - final var result = m; - account = null; - m = null; - - return result; + if (newManagerListener != null) { + newManagerListener.accept(m); + m = null; + } + return number; } finally { if (m != null) { m.close(); @@ -166,7 +183,7 @@ public class ProvisioningManager { private boolean canRelinkExistingAccount(final String number) throws IOException { final SignalAccount signalAccount; try { - signalAccount = SignalAccount.load(pathConfig.getDataPath(), number, false, TrustNewIdentity.ON_FIRST_USE); + signalAccount = SignalAccount.load(pathConfig.dataPath(), number, false, TrustNewIdentity.ON_FIRST_USE); } catch (IOException e) { logger.debug("Account in use or failed to load.", e); return false; @@ -178,7 +195,7 @@ public class ProvisioningManager { return false; } - final var m = new Manager(signalAccount, pathConfig, serviceEnvironmentConfig, userAgent); + final var m = new ManagerImpl(signalAccount, pathConfig, serviceEnvironmentConfig, userAgent); try (m) { m.checkAccountState(); } catch (AuthorizationFailedException ignored) {