import org.asamk.signal.manager.api.Pair;
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.whispersystems.signalservice.api.SignalServiceAccountManager;
+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.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.internal.ServiceResponse;
+import org.whispersystems.signalservice.api.registration.RegistrationApi;
import org.whispersystems.signalservice.internal.push.LockedException;
+import org.whispersystems.signalservice.internal.push.PushServiceSocket.VerificationCodeTransport;
import org.whispersystems.signalservice.internal.push.RegistrationSessionMetadataResponse;
import org.whispersystems.signalservice.internal.push.VerifyAccountResponse;
public class NumberVerificationUtils {
+ private static final Logger logger = LoggerFactory.getLogger(NumberVerificationUtils.class);
+
public static String handleVerificationSession(
- SignalServiceAccountManager accountManager,
+ RegistrationApi registrationApi,
String sessionId,
Consumer<String> sessionIdSaver,
boolean voiceVerification,
String captcha
- ) throws CaptchaRequiredException, IOException, RateLimitException {
+ ) throws CaptchaRequiredException, IOException, RateLimitException, VerificationMethodNotAvailableException {
RegistrationSessionMetadataResponse sessionResponse;
try {
- sessionResponse = getValidSession(accountManager, sessionId);
+ sessionResponse = getValidSession(registrationApi, sessionId);
} catch (PushChallengeRequiredException |
org.whispersystems.signalservice.api.push.exceptions.CaptchaRequiredException e) {
if (captcha != null) {
- sessionResponse = submitCaptcha(accountManager, sessionId, captcha);
+ sessionResponse = submitCaptcha(registrationApi, sessionId, captcha);
} else {
throw new CaptchaRequiredException("Captcha Required");
}
final var nextAttempt = voiceVerification
? sessionResponse.getBody().getNextCall()
: sessionResponse.getBody().getNextSms();
- if (nextAttempt != null && nextAttempt > 0) {
+ if (nextAttempt == null) {
+ throw new VerificationMethodNotAvailableException();
+ } else if (nextAttempt > 0) {
final var timestamp = sessionResponse.getHeaders().getTimestamp() + nextAttempt * 1000;
throw new RateLimitException(timestamp);
}
if (sessionResponse.getBody().getRequestedInformation().contains("captcha")) {
if (captcha != null) {
- sessionResponse = submitCaptcha(accountManager, sessionId, captcha);
+ sessionResponse = submitCaptcha(registrationApi, sessionId, captcha);
}
if (!sessionResponse.getBody().getAllowedToRequestCode()) {
throw new CaptchaRequiredException("Captcha Required");
}
public static void requestVerificationCode(
- SignalServiceAccountManager accountManager, String sessionId, boolean voiceVerification
+ RegistrationApi registrationApi, String sessionId, boolean voiceVerification
) throws IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException {
- final ServiceResponse<RegistrationSessionMetadataResponse> response;
+ final NetworkResult<RegistrationSessionMetadataResponse> response;
final var locale = Utils.getDefaultLocale(Locale.US);
if (voiceVerification) {
- response = accountManager.requestVoiceVerificationCode(sessionId, locale, false);
+ response = registrationApi.requestSmsVerificationCode(sessionId,
+ locale,
+ false,
+ VerificationCodeTransport.VOICE);
} else {
- response = accountManager.requestSmsVerificationCode(sessionId, locale, false);
+ response = registrationApi.requestSmsVerificationCode(sessionId,
+ locale,
+ false,
+ VerificationCodeTransport.SMS);
}
try {
Utils.handleResponseException(response);
}
private static RegistrationSessionMetadataResponse validateSession(
- final SignalServiceAccountManager accountManager, final String sessionId
+ final RegistrationApi registrationApi, final String sessionId
) throws IOException {
if (sessionId == null || sessionId.isEmpty()) {
throw new NoSuchSessionException();
}
- return Utils.handleResponseException(accountManager.getRegistrationSession(sessionId));
+ return Utils.handleResponseException(registrationApi.getRegistrationSessionStatus(sessionId));
}
private static RegistrationSessionMetadataResponse requestValidSession(
- final SignalServiceAccountManager accountManager
- ) throws NoSuchSessionException, IOException {
- return Utils.handleResponseException(accountManager.createRegistrationSession(null, "", ""));
+ final RegistrationApi registrationApi
+ ) throws IOException {
+ return Utils.handleResponseException(registrationApi.createRegistrationSession(null, "", ""));
}
private static RegistrationSessionMetadataResponse getValidSession(
- final SignalServiceAccountManager accountManager, final String sessionId
+ final RegistrationApi registrationApi, final String sessionId
) throws IOException {
try {
- return validateSession(accountManager, sessionId);
+ return validateSession(registrationApi, sessionId);
} catch (NoSuchSessionException e) {
- return requestValidSession(accountManager);
+ logger.debug("No registration session, creating new one.");
+ return requestValidSession(registrationApi);
}
}
private static RegistrationSessionMetadataResponse submitCaptcha(
- SignalServiceAccountManager accountManager, String sessionId, String captcha
+ RegistrationApi registrationApi, String sessionId, String captcha
) throws IOException, CaptchaRequiredException {
captcha = captcha == null ? null : captcha.replace("signalcaptcha://", "");
try {
- return Utils.handleResponseException(accountManager.submitCaptchaToken(sessionId, captcha));
+ return Utils.handleResponseException(registrationApi.submitCaptchaToken(sessionId, captcha));
} catch (PushChallengeRequiredException |
org.whispersystems.signalservice.api.push.exceptions.CaptchaRequiredException |
TokenNotAcceptedException _e) {