Don't reset session on return from captcha.

This commit is contained in:
Nicholas Tinsley
2023-03-10 13:49:04 -05:00
parent d62191ca3c
commit a7b584a974
7 changed files with 37 additions and 25 deletions

View File

@@ -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
}

View File

@@ -218,10 +218,10 @@ public final class RegistrationRepository {
return null;
}
public Single<BackupAuthCheckProcessor> getKbsAuthCredential(@NonNull RegistrationData registrationData) {
public Single<BackupAuthCheckProcessor> getKbsAuthCredential(@NonNull RegistrationData registrationData, List<String> 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())) {

View File

@@ -384,8 +384,7 @@ public abstract class BaseEnterSmsCodeFragment<ViewModel extends BaseRegistratio
subheader.setText(requireContext().getString(R.string.RegistrationActivity_enter_the_code_we_sent_to_s, viewModel.getNumber().getFullFormattedNumber()));
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()) {

View File

@@ -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()) {

View File

@@ -254,7 +254,7 @@ public abstract class BaseRegistrationViewModel extends ViewModel {
});
}
public Single<RegistrationSessionProcessor.RegistrationSessionProcessorForSession> validateSession(String e164, @Nullable String mcc, @Nullable String mnc) {
public Single<RegistrationSessionProcessor.RegistrationSessionProcessorForSession> validateSession(String e164) {
String storedSessionId = null;
if (e164.equals(getSessionE164())) {
storedSessionId = getSessionId();
@@ -264,7 +264,7 @@ public abstract class BaseRegistrationViewModel extends ViewModel {
}
public Single<RegistrationSessionProcessor.RegistrationSessionProcessorForSession> 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)

View File

@@ -35,10 +35,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;
@@ -87,7 +91,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
@@ -350,7 +358,24 @@ public final class RegistrationViewModel extends BaseRegistrationViewModel {
}
private Single<Boolean> checkForValidKbsAuthCredentials() {
return registrationRepository.getKbsAuthCredential(getRegistrationData())
final List<String> kbsAuthTokenList = SignalStore.kbsValues().getKbsAuthTokenList();
List<String> 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())

View File

@@ -211,18 +211,7 @@ public class SignalServiceAccountManager {
}
}
public Single<ServiceResponse<BackupAuthCheckResponse>> checkBackupAuthCredentials(@Nonnull String e164, @Nonnull List<String> basicAuthTokens) {
List<String> 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<ServiceResponse<BackupAuthCheckResponse>> checkBackupAuthCredentials(@Nonnull String e164, @Nonnull List<String> usernamePasswords) {
return pushServiceSocket.checkBackupAuthCredentials(new BackupAuthCheckRequest(e164, usernamePasswords), DefaultResponseMapper.getDefault(BackupAuthCheckResponse.class));
}