From a4e34e600e9b00b7ff24937c8262c8447a4bdae2 Mon Sep 17 00:00:00 2001 From: AsamK Date: Sat, 8 May 2021 15:19:49 +0200 Subject: [PATCH] Check if account file already exists before actually completing device link --- lib/build.gradle.kts | 2 +- .../signal/manager/ProvisioningManager.java | 36 ++++++++----------- .../asamk/signal/commands/LinkCommand.java | 5 --- 3 files changed, 15 insertions(+), 28 deletions(-) diff --git a/lib/build.gradle.kts b/lib/build.gradle.kts index b9dfbc21..327d1538 100644 --- a/lib/build.gradle.kts +++ b/lib/build.gradle.kts @@ -14,7 +14,7 @@ repositories { } dependencies { - api("com.github.turasa:signal-service-java:2.15.3_unofficial_19") + api("com.github.turasa:signal-service-java:2.15.3_unofficial_20") implementation("com.google.protobuf:protobuf-javalite:3.10.0") implementation("org.bouncycastle:bcprov-jdk15on:1.68") implementation("org.slf4j:slf4j-api:1.7.30") 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..f20afc46 100644 --- a/lib/src/main/java/org/asamk/signal/manager/ProvisioningManager.java +++ b/lib/src/main/java/org/asamk/signal/manager/ProvisioningManager.java @@ -21,12 +21,9 @@ 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; @@ -93,35 +90,30 @@ public class ProvisioningManager { return new DeviceLinkInfo(deviceUuid, identityKey.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(identityKey); + 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)); + if (SignalAccount.userExists(pathConfig.getDataPath(), number)) { + throw new UserAlreadyExists(number, SignalAccount.getFileName(pathConfig.getDataPath(), number)); } + var deviceId = accountManager.finishNewDeviceRegistration(ret.getProvisioningCode(), + false, + true, + registrationId, + deviceName); + // 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(), + deviceId, ret.getIdentity(), registrationId, profileKey); diff --git a/src/main/java/org/asamk/signal/commands/LinkCommand.java b/src/main/java/org/asamk/signal/commands/LinkCommand.java index cd2e188e..4090e9ec 100644 --- a/src/main/java/org/asamk/signal/commands/LinkCommand.java +++ b/src/main/java/org/asamk/signal/commands/LinkCommand.java @@ -6,13 +6,11 @@ import net.sourceforge.argparse4j.inf.Subparser; import org.asamk.signal.PlainTextWriterImpl; import org.asamk.signal.commands.exceptions.CommandException; import org.asamk.signal.commands.exceptions.IOErrorException; -import org.asamk.signal.commands.exceptions.UnexpectedErrorException; import org.asamk.signal.commands.exceptions.UserErrorException; import org.asamk.signal.manager.ProvisioningManager; import org.asamk.signal.manager.UserAlreadyExists; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.whispersystems.libsignal.InvalidKeyException; import java.io.IOException; import java.util.concurrent.TimeoutException; @@ -43,9 +41,6 @@ public class LinkCommand implements ProvisioningCommand { throw new UserErrorException("Link request timed out, please try again."); } catch (IOException e) { throw new IOErrorException("Link request error: " + e.getMessage()); - } catch (InvalidKeyException e) { - logger.debug("Finish device link failed", e); - throw new UnexpectedErrorException("Invalid key: " + e.getMessage()); } catch (UserAlreadyExists e) { throw new UserErrorException("The user " + e.getUsername() -- 2.50.1