import org.asamk.signal.manager.api.IncorrectPinException;
import org.asamk.signal.manager.api.NonNormalizedPhoneNumberException;
import org.asamk.signal.manager.api.Pair;
+import org.asamk.signal.manager.api.PinLockMissingException;
import org.asamk.signal.manager.api.PinLockedException;
import org.asamk.signal.manager.api.RateLimitException;
import org.asamk.signal.manager.api.VerificationMethodNotAvailableException;
import org.asamk.signal.manager.helper.PinHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.whispersystems.signalservice.api.NetworkResult;
import org.whispersystems.signalservice.api.kbs.MasterKey;
+import org.whispersystems.signalservice.api.push.exceptions.ChallengeRequiredException;
import org.whispersystems.signalservice.api.push.exceptions.NoSuchSessionException;
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
-import org.whispersystems.signalservice.api.push.exceptions.PushChallengeRequiredException;
import org.whispersystems.signalservice.api.push.exceptions.TokenNotAcceptedException;
import org.whispersystems.signalservice.api.registration.RegistrationApi;
import org.whispersystems.signalservice.internal.push.LockedException;
RegistrationSessionMetadataResponse sessionResponse;
try {
sessionResponse = getValidSession(registrationApi, sessionId);
- } catch (PushChallengeRequiredException |
- org.whispersystems.signalservice.api.push.exceptions.CaptchaRequiredException e) {
+ } catch (ChallengeRequiredException e) {
if (captcha != null) {
sessionResponse = submitCaptcha(registrationApi, sessionId, captcha);
} else {
}
}
- sessionId = sessionResponse.getBody().getId();
+ sessionId = sessionResponse.getMetadata().getId();
sessionIdSaver.accept(sessionId);
- if (sessionResponse.getBody().getVerified()) {
+ if (sessionResponse.getMetadata().getVerified()) {
return sessionId;
}
- if (sessionResponse.getBody().getAllowedToRequestCode()) {
+ if (sessionResponse.getMetadata().getAllowedToRequestCode()) {
return sessionId;
}
final var nextAttempt = voiceVerification
- ? sessionResponse.getBody().getNextCall()
- : sessionResponse.getBody().getNextSms();
+ ? sessionResponse.getMetadata().getNextCall()
+ : sessionResponse.getMetadata().getNextSms();
if (nextAttempt == null) {
throw new VerificationMethodNotAvailableException();
} else if (nextAttempt > 0) {
- final var timestamp = sessionResponse.getHeaders().getTimestamp() + nextAttempt * 1000;
+ final var timestamp = sessionResponse.getClientReceivedAtMilliseconds() + nextAttempt * 1000;
throw new RateLimitException(timestamp);
}
- final var nextVerificationAttempt = sessionResponse.getBody().getNextVerificationAttempt();
+ final var nextVerificationAttempt = sessionResponse.getMetadata().getNextVerificationAttempt();
if (nextVerificationAttempt != null && nextVerificationAttempt > 0) {
- final var timestamp = sessionResponse.getHeaders().getTimestamp() + nextVerificationAttempt * 1000;
+ final var timestamp = sessionResponse.getClientReceivedAtMilliseconds() + nextVerificationAttempt * 1000;
throw new CaptchaRequiredException(timestamp);
}
- if (sessionResponse.getBody().getRequestedInformation().contains("captcha")) {
+ if (sessionResponse.getMetadata().getRequestedInformation().contains("captcha")) {
if (captcha != null) {
sessionResponse = submitCaptcha(registrationApi, sessionId, captcha);
}
- if (!sessionResponse.getBody().getAllowedToRequestCode()) {
+ if (!sessionResponse.getMetadata().getAllowedToRequestCode()) {
throw new CaptchaRequiredException("Captcha Required");
}
}
}
public static void requestVerificationCode(
- RegistrationApi registrationApi, String sessionId, boolean voiceVerification
+ RegistrationApi registrationApi,
+ String sessionId,
+ boolean voiceVerification
) throws IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException {
- final NetworkResult<RegistrationSessionMetadataResponse> response;
final var locale = Utils.getDefaultLocale(Locale.US);
- if (voiceVerification) {
- response = registrationApi.requestSmsVerificationCode(sessionId,
- locale,
- false,
- VerificationCodeTransport.VOICE);
- } else {
- response = registrationApi.requestSmsVerificationCode(sessionId,
- locale,
- false,
- VerificationCodeTransport.SMS);
- }
+ final var response = registrationApi.requestSmsVerificationCode(sessionId,
+ locale,
+ false,
+ voiceVerification ? VerificationCodeTransport.VOICE : VerificationCodeTransport.SMS);
try {
Utils.handleResponseException(response);
- } catch (org.whispersystems.signalservice.api.push.exceptions.CaptchaRequiredException e) {
+ } catch (ChallengeRequiredException e) {
throw new CaptchaRequiredException(e.getMessage(), e);
} catch (org.whispersystems.signalservice.api.push.exceptions.NonNormalizedPhoneNumberException e) {
throw new NonNormalizedPhoneNumberException("Phone number is not normalized ("
}
public static Pair<VerifyAccountResponse, MasterKey> verifyNumber(
- String sessionId, String verificationCode, String pin, PinHelper pinHelper, Verifier verifier
- ) throws IOException, PinLockedException, IncorrectPinException {
+ String sessionId,
+ String verificationCode,
+ String pin,
+ PinHelper pinHelper,
+ Verifier verifier
+ ) throws IOException, PinLockedException, IncorrectPinException, PinLockMissingException {
verificationCode = verificationCode.replace("-", "");
try {
final var response = verifier.verify(sessionId, verificationCode, null);
final var registrationLockData = pinHelper.getRegistrationLockData(pin, e);
if (registrationLockData == null) {
- throw e;
+ throw new PinLockMissingException();
}
var registrationLock = registrationLockData.getMasterKey().deriveRegistrationLock();
}
private static RegistrationSessionMetadataResponse validateSession(
- final RegistrationApi registrationApi, final String sessionId
+ final RegistrationApi registrationApi,
+ final String sessionId
) throws IOException {
if (sessionId == null || sessionId.isEmpty()) {
throw new NoSuchSessionException();
}
private static RegistrationSessionMetadataResponse getValidSession(
- final RegistrationApi registrationApi, final String sessionId
+ final RegistrationApi registrationApi,
+ final String sessionId
) throws IOException {
try {
return validateSession(registrationApi, sessionId);
}
private static RegistrationSessionMetadataResponse submitCaptcha(
- RegistrationApi registrationApi, String sessionId, String captcha
+ RegistrationApi registrationApi,
+ String sessionId,
+ String captcha
) throws IOException, CaptchaRequiredException {
captcha = captcha == null ? null : captcha.replace("signalcaptcha://", "");
try {
return Utils.handleResponseException(registrationApi.submitCaptchaToken(sessionId, captcha));
- } catch (PushChallengeRequiredException |
- org.whispersystems.signalservice.api.push.exceptions.CaptchaRequiredException |
- TokenNotAcceptedException _e) {
+ } catch (ChallengeRequiredException | TokenNotAcceptedException _e) {
throw new CaptchaRequiredException("Captcha not accepted");
} catch (NonSuccessfulResponseCodeException e) {
- if (e.getCode() == 400) {
+ if (e.code == 400) {
throw new CaptchaRequiredException("Captcha has invalid format");
}
throw e;
public interface Verifier {
VerifyAccountResponse verify(
- String sessionId, String verificationCode, String registrationLock
+ String sessionId,
+ String verificationCode,
+ String registrationLock
) throws IOException;
}
}