diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/RegistrationData.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/RegistrationData.kt index a310b9027c..41a7db86d5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/RegistrationData.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/RegistrationData.kt @@ -12,6 +12,6 @@ data class RegistrationData( val pniRegistrationId: Int, val recoveryPassword: String? ) { - val isFcm: Boolean = fcmToken != null - val isNotFcm: Boolean = fcmToken == null + val isNotFcm: Boolean = fcmToken.isNullOrBlank() + val isFcm: Boolean = !isNotFcm } diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/RegistrationRepository.java b/app/src/main/java/org/thoughtcrime/securesms/registration/RegistrationRepository.java index b9b97ec3ef..e30360dee7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/RegistrationRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/RegistrationRepository.java @@ -218,10 +218,10 @@ public final class RegistrationRepository { return null; } - public Single getKbsAuthCredential(@NonNull RegistrationData registrationData) { + public Single getKbsAuthCredential(@NonNull RegistrationData registrationData, List usernamePasswords) { SignalServiceAccountManager accountManager = AccountManagerFactory.createUnauthenticated(context, registrationData.getE164(), SignalServiceAddress.DEFAULT_DEVICE_ID, registrationData.getPassword()); - return accountManager.checkBackupAuthCredentials(registrationData.getE164(), SignalStore.kbsValues().getKbsAuthTokenList()) + return accountManager.checkBackupAuthCredentials(registrationData.getE164(), usernamePasswords) .map(BackupAuthCheckProcessor::new) .doOnSuccess(processor -> { if (SignalStore.kbsValues().removeAuthTokens(processor.getInvalid())) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/BaseEnterSmsCodeFragment.java b/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/BaseEnterSmsCodeFragment.java index feaf1efc8f..2b172f49d7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/BaseEnterSmsCodeFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/BaseEnterSmsCodeFragment.java @@ -384,8 +384,7 @@ public abstract class BaseEnterSmsCodeFragment { if (!processor.hasResult()) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/EnterPhoneNumberFragment.java b/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/EnterPhoneNumberFragment.java index cacffdea9c..4e9420af8c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/EnterPhoneNumberFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/EnterPhoneNumberFragment.java @@ -355,15 +355,14 @@ public final class EnterPhoneNumberFragment extends LoggingFragment implements R public void onStart() { super.onStart(); String sessionE164 = viewModel.getSessionE164(); - if (sessionE164 != null && viewModel.getSessionId() != null) { + if (sessionE164 != null && viewModel.getSessionId() != null && viewModel.getCaptchaToken() == null) { checkIfSessionIsInProgressAndAdvance(sessionE164); } } private void checkIfSessionIsInProgressAndAdvance(@NonNull String sessionE164) { NavController navController = NavHostFragment.findNavController(this); - MccMncProducer mccMncProducer = new MccMncProducer(requireContext()); - Disposable request = viewModel.validateSession(sessionE164, mccMncProducer.getMcc(), mccMncProducer.getMnc()) + Disposable request = viewModel.validateSession(sessionE164) .observeOn(AndroidSchedulers.mainThread()) .subscribe(processor -> { if (processor.hasResult() && processor.canSubmitProofImmediately()) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/BaseRegistrationViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/BaseRegistrationViewModel.java index f92f1e0777..8609a5bf88 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/BaseRegistrationViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/BaseRegistrationViewModel.java @@ -254,7 +254,7 @@ public abstract class BaseRegistrationViewModel extends ViewModel { }); } - public Single validateSession(String e164, @Nullable String mcc, @Nullable String mnc) { + public Single validateSession(String e164) { String storedSessionId = null; if (e164.equals(getSessionE164())) { storedSessionId = getSessionId(); @@ -264,7 +264,7 @@ public abstract class BaseRegistrationViewModel extends ViewModel { } public Single getValidSession(String e164, @Nullable String mcc, @Nullable String mnc) { - return validateSession(e164, mcc, mnc) + return validateSession(e164) .flatMap(processor -> { if (processor.isInvalidSession()) { return verifyAccountRepository.requestValidSession(e164, getRegistrationSecret(), mcc, mnc) diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/RegistrationViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/RegistrationViewModel.java index b4f7acef1f..c2b5ff6d22 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/RegistrationViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/RegistrationViewModel.java @@ -36,10 +36,14 @@ import org.whispersystems.signalservice.api.push.exceptions.IncorrectCodeExcepti import org.whispersystems.signalservice.internal.ServiceResponse; import org.whispersystems.signalservice.internal.contacts.entities.TokenResponse; import org.whispersystems.signalservice.internal.push.RegistrationSessionMetadataResponse; +import org.whispersystems.util.Base64; import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.List; import java.util.Objects; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.core.Single; @@ -88,7 +92,11 @@ public final class RegistrationViewModel extends BaseRegistrationViewModel { } public @Nullable String getFcmToken() { - return savedState.get(STATE_FCM_TOKEN); + String token = savedState.get(STATE_FCM_TOKEN); + if (token == null || token.isEmpty()) { + return null; + } + return token; } @MainThread @@ -351,7 +359,24 @@ public final class RegistrationViewModel extends BaseRegistrationViewModel { } private Single checkForValidKbsAuthCredentials() { - return registrationRepository.getKbsAuthCredential(getRegistrationData()) + final List kbsAuthTokenList = SignalStore.kbsValues().getKbsAuthTokenList(); + List usernamePasswords = kbsAuthTokenList + .stream() + .limit(10) + .map(t -> { + try { + return new String(Base64.decode(t.replace("Basic ", "").trim()), StandardCharsets.ISO_8859_1); + } catch (IOException e) { + return null; + } + }) + .collect(Collectors.toList()); + + if (usernamePasswords.isEmpty()) { + return Single.just(false); + } + + return registrationRepository.getKbsAuthCredential(getRegistrationData(), usernamePasswords) .flatMap(p -> { if (p.getValid() != null) { return kbsRepository.getToken(p.getValid()) diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java index d129627af5..2f2569b567 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java @@ -211,18 +211,7 @@ public class SignalServiceAccountManager { } } - public Single> checkBackupAuthCredentials(@Nonnull String e164, @Nonnull List basicAuthTokens) { - List usernamePasswords = basicAuthTokens - .stream() - .limit(10) - .map(t -> { - try { - return new String(Base64.decode(t.replace("Basic ", "").trim()), StandardCharsets.ISO_8859_1); - } catch (IOException e) { - return null; - } - }) - .collect(Collectors.toList()); + public Single> checkBackupAuthCredentials(@Nonnull String e164, @Nonnull List usernamePasswords) { return pushServiceSocket.checkBackupAuthCredentials(new BackupAuthCheckRequest(e164, usernamePasswords), DefaultResponseMapper.getDefault(BackupAuthCheckResponse.class)); }