import org.asamk.signal.manager.api.IncorrectPinException;
import org.asamk.signal.manager.api.NonNormalizedPhoneNumberException;
import org.asamk.signal.manager.api.PinLockedException;
+import org.asamk.signal.manager.api.RateLimitException;
import org.asamk.signal.manager.api.UpdateProfile;
import org.asamk.signal.manager.config.ServiceConfig;
import org.asamk.signal.manager.config.ServiceEnvironmentConfig;
import org.asamk.signal.manager.helper.PinHelper;
import org.asamk.signal.manager.storage.SignalAccount;
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.push.ACI;
import org.whispersystems.signalservice.api.push.PNI;
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
-import org.whispersystems.signalservice.internal.ServiceResponse;
+import org.whispersystems.signalservice.api.push.exceptions.AlreadyVerifiedException;
+import org.whispersystems.signalservice.api.push.exceptions.DeprecatedVersionException;
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.config.ServiceConfig.capabilities;
-
class RegistrationManagerImpl implements RegistrationManager {
private final static Logger logger = LoggerFactory.getLogger(RegistrationManagerImpl.class);
@Override
public void register(
boolean voiceVerification, String captcha
- ) throws IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException {
+ ) throws IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException, RateLimitException {
if (account.isRegistered()
&& account.getServiceEnvironment() != null
&& account.getServiceEnvironment() != serviceEnvironmentConfig.getType()) {
throw new IOException("Account is registered in another environment: " + account.getServiceEnvironment());
}
- if (account.getAci() != null && attemptReactivateAccount()) {
- return;
- }
+ try {
+ if (account.getAci() != null && attemptReactivateAccount()) {
+ return;
+ }
- NumberVerificationUtils.requestVerificationCode(accountManager, captcha, voiceVerification);
+ String sessionId = NumberVerificationUtils.handleVerificationSession(accountManager,
+ account.getSessionId(account.getNumber()),
+ id -> account.setSessionId(account.getNumber(), id),
+ voiceVerification,
+ captcha);
+ NumberVerificationUtils.requestVerificationCode(accountManager, sessionId, voiceVerification);
+ } catch (DeprecatedVersionException e) {
+ logger.debug("Signal-Server returned deprecated version exception", e);
+ throw e;
+ }
}
@Override
public void verifyAccount(
String verificationCode, String pin
) throws IOException, PinLockedException, IncorrectPinException {
- final var result = NumberVerificationUtils.verifyNumber(verificationCode,
+ var sessionId = account.getSessionId(account.getNumber());
+ final var result = NumberVerificationUtils.verifyNumber(sessionId,
+ verificationCode,
pin,
pinHelper,
this::verifyAccountWithCode);
logger.warn("Failed to set default profile: {}", e.getMessage());
}
+ try {
+ m.refreshCurrentUsername();
+ } catch (IOException | BaseUsernameException e) {
+ logger.warn("Failed to refresh current username", e);
+ }
+
if (newManagerListener != null) {
newManagerListener.accept(m);
m = null;
userAgent,
null,
ServiceConfig.AUTOMATIC_NETWORK_RETRY);
- accountManager.setAccountAttributes(null,
- account.getLocalRegistrationId(),
- true,
- null,
- account.getRegistrationLock(),
- account.getSelfUnidentifiedAccessKey(),
- account.isUnrestrictedUnidentifiedAccess(),
- capabilities,
- account.isDiscoverableByPhoneNumber(),
- account.getEncryptedDeviceName(),
- account.getLocalPniRegistrationId());
+ accountManager.setAccountAttributes(account.getAccountAttributes(null));
account.setRegistered(true);
logger.info("Reactivated existing account, verify is not necessary.");
if (newManagerListener != null) {
return false;
}
- private ServiceResponse<VerifyAccountResponse> verifyAccountWithCode(
- final String verificationCode, final String registrationLock
- ) {
- if (registrationLock == null) {
- return accountManager.verifyAccount(verificationCode,
- account.getLocalRegistrationId(),
- true,
- account.getSelfUnidentifiedAccessKey(),
- account.isUnrestrictedUnidentifiedAccess(),
- ServiceConfig.capabilities,
- account.isDiscoverableByPhoneNumber(),
- account.getLocalPniRegistrationId());
- } else {
- return accountManager.verifyAccountWithRegistrationLockPin(verificationCode,
- account.getLocalRegistrationId(),
- true,
- registrationLock,
- account.getSelfUnidentifiedAccessKey(),
- account.isUnrestrictedUnidentifiedAccess(),
- ServiceConfig.capabilities,
- account.isDiscoverableByPhoneNumber(),
- account.getLocalPniRegistrationId());
+ private VerifyAccountResponse verifyAccountWithCode(
+ final String sessionId, final String verificationCode, final String registrationLock
+ ) throws IOException {
+ try {
+ Utils.handleResponseException(accountManager.verifyAccount(verificationCode, sessionId));
+ } catch (AlreadyVerifiedException e) {
+ // Already verified so can continue registering
}
+ return Utils.handleResponseException(accountManager.registerAccount(sessionId,
+ null,
+ account.getAccountAttributes(registrationLock),
+ true));
}
@Override