Fix FCM token via phone call registration.

Fixes #8992
This commit is contained in:
Alan Evans 2020-04-30 17:30:58 -03:00 committed by Greyson Parrelli
parent c3832cf8b1
commit 0c2afa9438
3 changed files with 28 additions and 46 deletions

View file

@ -164,19 +164,20 @@ public final class EnterPhoneNumberFragment extends BaseRegistrationFragment {
if (fcmSupported) { if (fcmSupported) {
SmsRetrieverClient client = SmsRetriever.getClient(context); SmsRetrieverClient client = SmsRetriever.getClient(context);
Task<Void> task = client.startSmsRetriever(); Task<Void> task = client.startSmsRetriever();
task.addOnSuccessListener(none -> { task.addOnSuccessListener(none -> {
Log.i(TAG, "Successfully registered SMS listener."); Log.i(TAG, "Successfully registered SMS listener.");
requestVerificationCode(e164number, RegistrationCodeRequest.Mode.SMS_FCM_WITH_LISTENER); requestVerificationCode(e164number, RegistrationCodeRequest.Mode.SMS_WITH_LISTENER);
}); });
task.addOnFailureListener(e -> { task.addOnFailureListener(e -> {
Log.w(TAG, "Failed to register SMS listener.", e); Log.w(TAG, "Failed to register SMS listener.", e);
requestVerificationCode(e164number, RegistrationCodeRequest.Mode.SMS_FCM_NO_LISTENER); requestVerificationCode(e164number, RegistrationCodeRequest.Mode.SMS_WITHOUT_LISTENER);
}); });
} else { } else {
requestVerificationCode(e164number, RegistrationCodeRequest.Mode.SMS_NO_FCM); Log.i(TAG, "FCM is not supported, using no SMS listener");
requestVerificationCode(e164number, RegistrationCodeRequest.Mode.SMS_WITHOUT_LISTENER);
} }
} }

View file

@ -42,13 +42,7 @@ public final class RegistrationCodeRequest {
try { try {
markAsVerifying(context); markAsVerifying(context);
Optional<String> fcmToken; Optional<String> fcmToken = FcmUtil.getToken();
if (mode.isFcm()) {
fcmToken = FcmUtil.getToken();
} else {
fcmToken = Optional.absent();
}
SignalServiceAccountManager accountManager = AccountManagerFactory.createUnauthenticated(context, credentials.getE164number(), credentials.getPassword()); SignalServiceAccountManager accountManager = AccountManagerFactory.createUnauthenticated(context, credentials.getE164number(), credentials.getPassword());
@ -101,43 +95,30 @@ public final class RegistrationCodeRequest {
public enum Mode { public enum Mode {
/** /**
* Device supports FCM and SMS retrieval. * Device is requesting an SMS and supports SMS retrieval.
* *
* The SMS sent will be formatted for automatic SMS retrieval. * The SMS sent will be formatted for automatic SMS retrieval.
*/ */
SMS_FCM_WITH_LISTENER(true, true), SMS_WITH_LISTENER(true),
/** /**
* Device supports FCM but not SMS retrieval. * Device is requesting an SMS and does not support SMS retrieval.
* *
* The SMS sent will be not be specially formatted for automatic SMS retrieval. * The SMS sent will be not be specially formatted for automatic SMS retrieval.
*/ */
SMS_FCM_NO_LISTENER(true, false), SMS_WITHOUT_LISTENER(false),
/**
* Device does not support FCM and so also not SMS retrieval.
*/
SMS_NO_FCM(false, false),
/** /**
* Device is requesting a phone call. * Device is requesting a phone call.
*
* Neither FCM or SMS retrieval is relevant in this mode.
*/ */
PHONE_CALL(false, false); PHONE_CALL(false);
private final boolean fcm;
private final boolean smsRetrieverSupported; private final boolean smsRetrieverSupported;
Mode(boolean fcm, boolean smsRetrieverSupported) { Mode(boolean smsRetrieverSupported) {
this.fcm = fcm;
this.smsRetrieverSupported = smsRetrieverSupported; this.smsRetrieverSupported = smsRetrieverSupported;
} }
public boolean isFcm() {
return fcm;
}
public boolean isSmsRetrieverSupported() { public boolean isSmsRetrieverSupported() {
return smsRetrieverSupported; return smsRetrieverSupported;
} }

View file

@ -12,63 +12,63 @@ public final class LocalCodeRequestRateLimiterTest {
public void initially_can_request() { public void initially_can_request() {
LocalCodeRequestRateLimiter limiter = new LocalCodeRequestRateLimiter(60_000); LocalCodeRequestRateLimiter limiter = new LocalCodeRequestRateLimiter(60_000);
assertTrue(limiter.canRequest(RegistrationCodeRequest.Mode.SMS_NO_FCM, "+155512345678", 1000)); assertTrue(limiter.canRequest(RegistrationCodeRequest.Mode.SMS_WITHOUT_LISTENER, "+155512345678", 1000));
} }
@Test @Test
public void cant_request_within_same_time_period() { public void cant_request_within_same_time_period() {
LocalCodeRequestRateLimiter limiter = new LocalCodeRequestRateLimiter(60_000); LocalCodeRequestRateLimiter limiter = new LocalCodeRequestRateLimiter(60_000);
assertTrue(limiter.canRequest(RegistrationCodeRequest.Mode.SMS_NO_FCM, "+155512345678", 1000)); assertTrue(limiter.canRequest(RegistrationCodeRequest.Mode.SMS_WITHOUT_LISTENER, "+155512345678", 1000));
limiter.onSuccessfulRequest(RegistrationCodeRequest.Mode.SMS_NO_FCM, "+155512345678", 1000); limiter.onSuccessfulRequest(RegistrationCodeRequest.Mode.SMS_WITHOUT_LISTENER, "+155512345678", 1000);
assertFalse(limiter.canRequest(RegistrationCodeRequest.Mode.SMS_NO_FCM, "+155512345678", 1000 + 59_000)); assertFalse(limiter.canRequest(RegistrationCodeRequest.Mode.SMS_WITHOUT_LISTENER, "+155512345678", 1000 + 59_000));
} }
@Test @Test
public void can_request_within_same_time_period_if_different_number() { public void can_request_within_same_time_period_if_different_number() {
LocalCodeRequestRateLimiter limiter = new LocalCodeRequestRateLimiter(60_000); LocalCodeRequestRateLimiter limiter = new LocalCodeRequestRateLimiter(60_000);
assertTrue(limiter.canRequest(RegistrationCodeRequest.Mode.SMS_NO_FCM, "+155512345678", 1000)); assertTrue(limiter.canRequest(RegistrationCodeRequest.Mode.SMS_WITHOUT_LISTENER, "+155512345678", 1000));
limiter.onSuccessfulRequest(RegistrationCodeRequest.Mode.SMS_NO_FCM, "+155512345678", 1000); limiter.onSuccessfulRequest(RegistrationCodeRequest.Mode.SMS_WITHOUT_LISTENER, "+155512345678", 1000);
assertTrue(limiter.canRequest(RegistrationCodeRequest.Mode.SMS_NO_FCM, "+15559874566", 1000 + 59_000)); assertTrue(limiter.canRequest(RegistrationCodeRequest.Mode.SMS_WITHOUT_LISTENER, "+15559874566", 1000 + 59_000));
} }
@Test @Test
public void can_request_within_same_time_period_if_different_mode() { public void can_request_within_same_time_period_if_different_mode() {
LocalCodeRequestRateLimiter limiter = new LocalCodeRequestRateLimiter(60_000); LocalCodeRequestRateLimiter limiter = new LocalCodeRequestRateLimiter(60_000);
assertTrue(limiter.canRequest(RegistrationCodeRequest.Mode.SMS_NO_FCM, "+155512345678", 1000)); assertTrue(limiter.canRequest(RegistrationCodeRequest.Mode.SMS_WITH_LISTENER, "+155512345678", 1000));
limiter.onSuccessfulRequest(RegistrationCodeRequest.Mode.SMS_NO_FCM, "+155512345678", 1000); limiter.onSuccessfulRequest(RegistrationCodeRequest.Mode.SMS_WITH_LISTENER, "+155512345678", 1000);
assertTrue(limiter.canRequest(RegistrationCodeRequest.Mode.SMS_FCM_NO_LISTENER, "+155512345678", 1000 + 59_000)); assertTrue(limiter.canRequest(RegistrationCodeRequest.Mode.SMS_WITHOUT_LISTENER, "+155512345678", 1000 + 59_000));
} }
@Test @Test
public void can_request_after_time_period() { public void can_request_after_time_period() {
LocalCodeRequestRateLimiter limiter = new LocalCodeRequestRateLimiter(60_000); LocalCodeRequestRateLimiter limiter = new LocalCodeRequestRateLimiter(60_000);
assertTrue(limiter.canRequest(RegistrationCodeRequest.Mode.SMS_NO_FCM, "+155512345678", 1000)); assertTrue(limiter.canRequest(RegistrationCodeRequest.Mode.SMS_WITH_LISTENER, "+155512345678", 1000));
limiter.onSuccessfulRequest(RegistrationCodeRequest.Mode.SMS_NO_FCM, "+155512345678", 1000); limiter.onSuccessfulRequest(RegistrationCodeRequest.Mode.SMS_WITH_LISTENER, "+155512345678", 1000);
assertTrue(limiter.canRequest(RegistrationCodeRequest.Mode.SMS_NO_FCM, "+155512345678", 1000 + 60_001)); assertTrue(limiter.canRequest(RegistrationCodeRequest.Mode.SMS_WITH_LISTENER, "+155512345678", 1000 + 60_001));
} }
@Test @Test
public void can_request_within_same_time_period_if_an_unsuccessful_request_is_seen() { public void can_request_within_same_time_period_if_an_unsuccessful_request_is_seen() {
LocalCodeRequestRateLimiter limiter = new LocalCodeRequestRateLimiter(60_000); LocalCodeRequestRateLimiter limiter = new LocalCodeRequestRateLimiter(60_000);
assertTrue(limiter.canRequest(RegistrationCodeRequest.Mode.SMS_NO_FCM, "+155512345678", 1000)); assertTrue(limiter.canRequest(RegistrationCodeRequest.Mode.SMS_WITH_LISTENER, "+155512345678", 1000));
limiter.onSuccessfulRequest(RegistrationCodeRequest.Mode.SMS_NO_FCM, "+155512345678", 1000); limiter.onSuccessfulRequest(RegistrationCodeRequest.Mode.SMS_WITH_LISTENER, "+155512345678", 1000);
limiter.onUnsuccessfulRequest(); limiter.onUnsuccessfulRequest();
assertTrue(limiter.canRequest(RegistrationCodeRequest.Mode.SMS_NO_FCM, "+155512345678", 1000 + 59_000)); assertTrue(limiter.canRequest(RegistrationCodeRequest.Mode.SMS_WITH_LISTENER, "+155512345678", 1000 + 59_000));
} }
} }