import org.asamk.signal.manager.storage.SignalAccount;
import org.asamk.signal.manager.util.KeyUtils;
import org.asamk.signal.manager.util.NumberVerificationUtils;
-import org.asamk.signal.manager.util.Utils;
import org.signal.libsignal.usernames.BaseUsernameException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.whispersystems.signalservice.api.SignalServiceAccountManager;
import org.whispersystems.signalservice.api.account.PreKeyCollection;
-import org.whispersystems.signalservice.api.groupsv2.ClientZkOperations;
-import org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations;
import org.whispersystems.signalservice.api.kbs.MasterKey;
import org.whispersystems.signalservice.api.push.ServiceId.ACI;
import org.whispersystems.signalservice.api.push.ServiceId.PNI;
import org.whispersystems.signalservice.api.push.exceptions.DeprecatedVersionException;
import org.whispersystems.signalservice.api.svr.SecureValueRecovery;
import org.whispersystems.signalservice.internal.push.VerifyAccountResponse;
-import org.whispersystems.signalservice.internal.util.DynamicCredentialsProvider;
import java.io.IOException;
import java.util.function.Consumer;
import static org.asamk.signal.manager.util.KeyUtils.generatePreKeysForType;
+import static org.asamk.signal.manager.util.Utils.handleResponseException;
public class RegistrationManagerImpl implements RegistrationManager {
private final ServiceEnvironmentConfig serviceEnvironmentConfig;
private final String userAgent;
private final Consumer<Manager> newManagerListener;
- private final GroupsV2Operations groupsV2Operations;
- private final SignalServiceAccountManager accountManager;
+ private final SignalServiceAccountManager unauthenticatedAccountManager;
private final PinHelper pinHelper;
private final AccountFileUpdater accountFileUpdater;
this.userAgent = userAgent;
this.newManagerListener = newManagerListener;
- groupsV2Operations = new GroupsV2Operations(ClientZkOperations.create(serviceEnvironmentConfig.signalServiceConfiguration()),
- ServiceConfig.GROUP_MAX_SIZE);
- this.accountManager = new SignalServiceAccountManager(serviceEnvironmentConfig.signalServiceConfiguration(),
- new DynamicCredentialsProvider(
- // Using empty UUID, because registering doesn't work otherwise
- null, null, account.getNumber(), account.getPassword(), SignalServiceAddress.DEFAULT_DEVICE_ID),
+ this.unauthenticatedAccountManager = SignalServiceAccountManager.createWithStaticCredentials(
+ serviceEnvironmentConfig.signalServiceConfiguration(),
+ // Using empty UUID, because registering doesn't work otherwise
+ null,
+ null,
+ account.getNumber(),
+ SignalServiceAddress.DEFAULT_DEVICE_ID,
+ account.getPassword(),
userAgent,
- groupsV2Operations,
- ServiceConfig.AUTOMATIC_NETWORK_RETRY);
- final var secureValueRecoveryV2 = serviceEnvironmentConfig.svr2Mrenclaves()
+ ServiceConfig.AUTOMATIC_NETWORK_RETRY,
+ ServiceConfig.GROUP_MAX_SIZE);
+ final var secureValueRecovery = serviceEnvironmentConfig.svr2Mrenclaves()
.stream()
- .map(mr -> (SecureValueRecovery) accountManager.getSecureValueRecoveryV2(mr))
+ .map(mr -> (SecureValueRecovery) this.unauthenticatedAccountManager.getSecureValueRecoveryV2(mr))
.toList();
- this.pinHelper = new PinHelper(secureValueRecoveryV2);
+ this.pinHelper = new PinHelper(secureValueRecovery);
}
@Override
public void register(
- boolean voiceVerification, String captcha, final boolean forceRegister
+ boolean voiceVerification,
+ String captcha,
+ final boolean forceRegister
) throws IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException, RateLimitException, VerificationMethodNotAvailableException {
if (account.isRegistered()
&& account.getServiceEnvironment() != null
return;
}
- String sessionId = NumberVerificationUtils.handleVerificationSession(accountManager,
+ final var registrationApi = unauthenticatedAccountManager.getRegistrationApi();
+ logger.trace("Creating verification session");
+ String sessionId = NumberVerificationUtils.handleVerificationSession(registrationApi,
account.getSessionId(account.getNumber()),
id -> account.setSessionId(account.getNumber(), id),
voiceVerification,
captcha);
- NumberVerificationUtils.requestVerificationCode(accountManager, sessionId, voiceVerification);
+ logger.trace("Requesting verification code");
+ NumberVerificationUtils.requestVerificationCode(registrationApi, sessionId, voiceVerification);
+ logger.debug("Successfully requested verification code");
account.setRegistered(false);
} catch (DeprecatedVersionException e) {
logger.debug("Signal-Server returned deprecated version exception", e);
@Override
public void verifyAccount(
- String verificationCode, String pin
+ String verificationCode,
+ String pin
) throws IOException, PinLockedException, IncorrectPinException {
if (account.isRegistered()) {
throw new IOException("Account is already registered");
final var aciPreKeys = generatePreKeysForType(account.getAccountData(ServiceIdType.ACI));
final var pniPreKeys = generatePreKeysForType(account.getAccountData(ServiceIdType.PNI));
- final var response = Utils.handleResponseException(accountManager.registerAccount(null,
+ final var registrationApi = unauthenticatedAccountManager.getRegistrationApi();
+ final var response = handleResponseException(registrationApi.registerAccount(null,
recoveryPassword,
account.getAccountAttributes(null),
aciPreKeys,
private boolean attemptReactivateAccount() {
try {
- final var accountManager = new SignalServiceAccountManager(serviceEnvironmentConfig.signalServiceConfiguration(),
- account.getCredentialsProvider(),
+ final var dependencies = new SignalDependencies(serviceEnvironmentConfig,
userAgent,
- groupsV2Operations,
- ServiceConfig.AUTOMATIC_NETWORK_RETRY);
- accountManager.setAccountAttributes(account.getAccountAttributes(null));
+ account.getCredentialsProvider(),
+ account.getSignalServiceDataStore(),
+ null,
+ new ReentrantSignalSessionLock());
+ handleResponseException(dependencies.getAccountApi()
+ .setAccountAttributes(account.getAccountAttributes(null)));
account.setRegistered(true);
logger.info("Reactivated existing account, verify is not necessary.");
if (newManagerListener != null) {
final PreKeyCollection aciPreKeys,
final PreKeyCollection pniPreKeys
) throws IOException {
+ final var registrationApi = unauthenticatedAccountManager.getRegistrationApi();
try {
- Utils.handleResponseException(accountManager.verifyAccount(verificationCode, sessionId));
+ handleResponseException(registrationApi.verifyAccount(sessionId, verificationCode));
} catch (AlreadyVerifiedException e) {
// Already verified so can continue registering
}
- return Utils.handleResponseException(accountManager.registerAccount(sessionId,
+ return handleResponseException(registrationApi.registerAccount(sessionId,
null,
account.getAccountAttributes(registrationLock),
aciPreKeys,