X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/a20bbe12461910d0b04e216f15181f911e4b2032..fa5c09d23b830f2999a52421c189a3e4661da99f:/lib/src/main/java/org/asamk/signal/manager/RegistrationManager.java diff --git a/lib/src/main/java/org/asamk/signal/manager/RegistrationManager.java b/lib/src/main/java/org/asamk/signal/manager/RegistrationManager.java index 4ca12028..24f0d5ba 100644 --- a/lib/src/main/java/org/asamk/signal/manager/RegistrationManager.java +++ b/lib/src/main/java/org/asamk/signal/manager/RegistrationManager.java @@ -26,6 +26,7 @@ import org.asamk.signal.manager.helper.PinHelper; import org.asamk.signal.manager.storage.SignalAccount; import org.asamk.signal.manager.storage.identities.TrustNewIdentity; import org.asamk.signal.manager.util.KeyUtils; +import org.asamk.signal.manager.util.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.whispersystems.libsignal.util.KeyHelper; @@ -48,7 +49,9 @@ import org.whispersystems.signalservice.internal.util.DynamicCredentialsProvider import java.io.Closeable; import java.io.File; import java.io.IOException; -import java.util.Locale; +import java.util.function.Consumer; + +import static org.asamk.signal.manager.config.ServiceConfig.capabilities; public class RegistrationManager implements Closeable { @@ -58,6 +61,7 @@ public class RegistrationManager implements Closeable { private final PathConfig pathConfig; private final ServiceEnvironmentConfig serviceEnvironmentConfig; private final String userAgent; + private final Consumer newManagerListener; private final SignalServiceAccountManager accountManager; private final PinHelper pinHelper; @@ -66,12 +70,14 @@ public class RegistrationManager implements Closeable { SignalAccount account, PathConfig pathConfig, ServiceEnvironmentConfig serviceEnvironmentConfig, - String userAgent + String userAgent, + Consumer newManagerListener ) { this.account = account; this.pathConfig = pathConfig; this.serviceEnvironmentConfig = serviceEnvironmentConfig; this.userAgent = userAgent; + this.newManagerListener = newManagerListener; GroupsV2Operations groupsV2Operations; try { @@ -82,7 +88,7 @@ public class RegistrationManager implements Closeable { this.accountManager = new SignalServiceAccountManager(serviceEnvironmentConfig.getSignalServiceConfiguration(), new DynamicCredentialsProvider( // Using empty UUID, because registering doesn't work otherwise - null, account.getUsername(), account.getPassword(), SignalServiceAddress.DEFAULT_DEVICE_ID), + null, account.getAccount(), account.getPassword(), SignalServiceAddress.DEFAULT_DEVICE_ID), userAgent, groupsV2Operations, ServiceConfig.AUTOMATIC_NETWORK_RETRY); @@ -96,6 +102,16 @@ public class RegistrationManager implements Closeable { public static RegistrationManager init( String number, File settingsPath, ServiceEnvironment serviceEnvironment, String userAgent + ) throws IOException { + return init(number, settingsPath, serviceEnvironment, userAgent, null); + } + + public static RegistrationManager init( + String number, + File settingsPath, + ServiceEnvironment serviceEnvironment, + String userAgent, + Consumer newManagerListener ) throws IOException { var pathConfig = PathConfig.createDefault(settingsPath); @@ -112,18 +128,51 @@ public class RegistrationManager implements Closeable { profileKey, TrustNewIdentity.ON_FIRST_USE); - return new RegistrationManager(account, pathConfig, serviceConfiguration, userAgent); + return new RegistrationManager(account, pathConfig, serviceConfiguration, userAgent, newManagerListener); } var account = SignalAccount.load(pathConfig.dataPath(), number, true, TrustNewIdentity.ON_FIRST_USE); - return new RegistrationManager(account, pathConfig, serviceConfiguration, userAgent); + return new RegistrationManager(account, pathConfig, serviceConfiguration, userAgent, newManagerListener); } public void register(boolean voiceVerification, String captcha) throws IOException, CaptchaRequiredException { + captcha = captcha == null ? null : captcha.replace("signalcaptcha://", ""); + if (account.getAci() != null) { + try { + final var accountManager = new SignalServiceAccountManager(serviceEnvironmentConfig.getSignalServiceConfiguration(), + new DynamicCredentialsProvider(account.getAci(), + account.getAccount(), + account.getPassword(), + account.getDeviceId()), + userAgent, + null, + ServiceConfig.AUTOMATIC_NETWORK_RETRY); + accountManager.setAccountAttributes(account.getEncryptedDeviceName(), + null, + account.getLocalRegistrationId(), + true, + null, + account.getPinMasterKey() == null ? null : account.getPinMasterKey().deriveRegistrationLock(), + account.getSelfUnidentifiedAccessKey(), + account.isUnrestrictedUnidentifiedAccess(), + capabilities, + account.isDiscoverableByPhoneNumber()); + account.setRegistered(true); + logger.info("Reactivated existing account, verify is not necessary."); + if (newManagerListener != null) { + final var m = new ManagerImpl(account, pathConfig, serviceEnvironmentConfig, userAgent); + account = null; + newManagerListener.accept(m); + } + return; + } catch (IOException e) { + logger.debug("Failed to reactivate account"); + } + } final ServiceResponse response; if (voiceVerification) { - response = accountManager.requestVoiceVerificationCode(getDefaultLocale(), + response = accountManager.requestVoiceVerificationCode(Utils.getDefaultLocale(), Optional.fromNullable(captcha), Optional.absent(), Optional.absent()); @@ -140,19 +189,7 @@ public class RegistrationManager implements Closeable { } } - private Locale getDefaultLocale() { - final var locale = Locale.getDefault(); - try { - Locale.LanguageRange.parse(locale.getLanguage() + "-" + locale.getCountry()); - } catch (IllegalArgumentException e) { - logger.debug("Invalid locale, ignoring: {}", locale); - return null; - } - - return locale; - } - - public Manager verifyAccount( + public void verifyAccount( String verificationCode, String pin ) throws IOException, PinLockedException, IncorrectPinException { verificationCode = verificationCode.replace("-", ""); @@ -208,10 +245,10 @@ public class RegistrationManager implements Closeable { logger.warn("Failed to set default profile: {}", e.getMessage()); } - final var result = m; - m = null; - - return result; + if (newManagerListener != null) { + newManagerListener.accept(m); + m = null; + } } finally { if (m != null) { m.close();