kopia lustrzana https://github.com/ryukoposting/Signal-Android
Attempt to Skip PIN Entry on Re-Registration.
rodzic
13f43799d6
commit
e4cc7f5181
|
@ -7,9 +7,7 @@ import org.signal.core.util.logging.Log
|
||||||
import org.thoughtcrime.securesms.AppCapabilities
|
import org.thoughtcrime.securesms.AppCapabilities
|
||||||
import org.thoughtcrime.securesms.gcm.FcmUtil
|
import org.thoughtcrime.securesms.gcm.FcmUtil
|
||||||
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
||||||
import org.thoughtcrime.securesms.pin.KbsRepository
|
|
||||||
import org.thoughtcrime.securesms.pin.KeyBackupSystemWrongPinException
|
import org.thoughtcrime.securesms.pin.KeyBackupSystemWrongPinException
|
||||||
import org.thoughtcrime.securesms.pin.TokenData
|
|
||||||
import org.thoughtcrime.securesms.push.AccountManagerFactory
|
import org.thoughtcrime.securesms.push.AccountManagerFactory
|
||||||
import org.thoughtcrime.securesms.util.TextSecurePreferences
|
import org.thoughtcrime.securesms.util.TextSecurePreferences
|
||||||
import org.whispersystems.signalservice.api.KbsPinData
|
import org.whispersystems.signalservice.api.KbsPinData
|
||||||
|
@ -77,7 +75,11 @@ class VerifyAccountRepository(private val context: Application) {
|
||||||
}.subscribeOn(Schedulers.io())
|
}.subscribeOn(Schedulers.io())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun verifyAccountWithPin(registrationData: RegistrationData, pin: String, tokenData: TokenData): Single<ServiceResponse<VerifyResponse>> {
|
fun verifyAccountWithReregistrationData(registrationData: RegistrationData, kbsPinDataProducer: KbsPinDataProducer): Single<ServiceResponse<VerifyResponse>> {
|
||||||
|
return verifyAccountWithPin(registrationData, "", kbsPinDataProducer)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun verifyAccountWithPin(registrationData: RegistrationData, pin: String, kbsPinDataProducer: KbsPinDataProducer): Single<ServiceResponse<VerifyResponse>> {
|
||||||
val universalUnidentifiedAccess: Boolean = TextSecurePreferences.isUniversalUnidentifiedAccess(context)
|
val universalUnidentifiedAccess: Boolean = TextSecurePreferences.isUniversalUnidentifiedAccess(context)
|
||||||
val unidentifiedAccessKey: ByteArray = UnidentifiedAccess.deriveAccessKeyFrom(registrationData.profileKey)
|
val unidentifiedAccessKey: ByteArray = UnidentifiedAccess.deriveAccessKeyFrom(registrationData.profileKey)
|
||||||
|
|
||||||
|
@ -90,7 +92,7 @@ class VerifyAccountRepository(private val context: Application) {
|
||||||
|
|
||||||
return Single.fromCallable {
|
return Single.fromCallable {
|
||||||
try {
|
try {
|
||||||
val kbsData: KbsPinData = KbsRepository.restoreMasterKey(pin, tokenData.enclave, tokenData.basicAuth, tokenData.tokenResponse)!!
|
val kbsData = kbsPinDataProducer.produceKbsPinData()
|
||||||
val registrationLockV2: String = kbsData.masterKey.deriveRegistrationLock()
|
val registrationLockV2: String = kbsData.masterKey.deriveRegistrationLock()
|
||||||
|
|
||||||
val response: ServiceResponse<VerifyAccountResponse> = accountManager.verifyAccountWithRegistrationLockPin(
|
val response: ServiceResponse<VerifyAccountResponse> = accountManager.verifyAccountWithRegistrationLockPin(
|
||||||
|
@ -115,6 +117,11 @@ class VerifyAccountRepository(private val context: Application) {
|
||||||
}.subscribeOn(Schedulers.io())
|
}.subscribeOn(Schedulers.io())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface KbsPinDataProducer {
|
||||||
|
@Throws(IOException::class, KeyBackupSystemWrongPinException::class, KeyBackupSystemNoDataException::class)
|
||||||
|
fun produceKbsPinData(): KbsPinData
|
||||||
|
}
|
||||||
|
|
||||||
enum class Mode(val isSmsRetrieverSupported: Boolean) {
|
enum class Mode(val isSmsRetrieverSupported: Boolean) {
|
||||||
SMS_WITH_LISTENER(true),
|
SMS_WITH_LISTENER(true),
|
||||||
SMS_WITHOUT_LISTENER(false),
|
SMS_WITHOUT_LISTENER(false),
|
||||||
|
@ -125,5 +132,4 @@ class VerifyAccountRepository(private val context: Application) {
|
||||||
private val TAG = Log.tag(VerifyAccountRepository::class.java)
|
private val TAG = Log.tag(VerifyAccountRepository::class.java)
|
||||||
private val PUSH_REQUEST_TIMEOUT = TimeUnit.SECONDS.toMillis(5)
|
private val PUSH_REQUEST_TIMEOUT = TimeUnit.SECONDS.toMillis(5)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -205,8 +205,12 @@ public abstract class BaseRegistrationViewModel extends ViewModel {
|
||||||
onVerificationCodeEntered(code);
|
onVerificationCodeEntered(code);
|
||||||
|
|
||||||
return verifyAccountWithoutRegistrationLock()
|
return verifyAccountWithoutRegistrationLock()
|
||||||
.map(VerifyResponseWithoutKbs::new)
|
.flatMap(response -> {
|
||||||
.flatMap(processor -> {
|
if (response.getResult().isPresent() && response.getResult().get().getKbsData() != null) {
|
||||||
|
return onVerifySuccessWithRegistrationLock(new VerifyResponseWithRegistrationLockProcessor(response, null), response.getResult().get().getPin());
|
||||||
|
}
|
||||||
|
|
||||||
|
VerifyResponseProcessor processor = new VerifyResponseWithoutKbs(response);
|
||||||
if (processor.hasResult()) {
|
if (processor.hasResult()) {
|
||||||
return onVerifySuccess(processor);
|
return onVerifySuccess(processor);
|
||||||
} else if (processor.registrationLock() && !processor.isKbsLocked()) {
|
} else if (processor.registrationLock() && !processor.isKbsLocked()) {
|
||||||
|
|
|
@ -9,6 +9,7 @@ import androidx.lifecycle.ViewModel;
|
||||||
import androidx.savedstate.SavedStateRegistryOwner;
|
import androidx.savedstate.SavedStateRegistryOwner;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
||||||
|
import org.thoughtcrime.securesms.keyvalue.SignalStore;
|
||||||
import org.thoughtcrime.securesms.pin.KbsRepository;
|
import org.thoughtcrime.securesms.pin.KbsRepository;
|
||||||
import org.thoughtcrime.securesms.pin.TokenData;
|
import org.thoughtcrime.securesms.pin.TokenData;
|
||||||
import org.thoughtcrime.securesms.registration.RegistrationData;
|
import org.thoughtcrime.securesms.registration.RegistrationData;
|
||||||
|
@ -20,8 +21,11 @@ import org.thoughtcrime.securesms.registration.VerifyResponseProcessor;
|
||||||
import org.thoughtcrime.securesms.registration.VerifyResponseWithRegistrationLockProcessor;
|
import org.thoughtcrime.securesms.registration.VerifyResponseWithRegistrationLockProcessor;
|
||||||
import org.thoughtcrime.securesms.registration.VerifyResponseWithoutKbs;
|
import org.thoughtcrime.securesms.registration.VerifyResponseWithoutKbs;
|
||||||
import org.thoughtcrime.securesms.util.Util;
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
|
import org.whispersystems.signalservice.api.KbsPinData;
|
||||||
import org.whispersystems.signalservice.internal.ServiceResponse;
|
import org.whispersystems.signalservice.internal.ServiceResponse;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
import io.reactivex.rxjava3.core.Single;
|
import io.reactivex.rxjava3.core.Single;
|
||||||
|
|
||||||
public final class RegistrationViewModel extends BaseRegistrationViewModel {
|
public final class RegistrationViewModel extends BaseRegistrationViewModel {
|
||||||
|
@ -104,12 +108,30 @@ public final class RegistrationViewModel extends BaseRegistrationViewModel {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Single<ServiceResponse<VerifyResponse>> verifyAccountWithoutRegistrationLock() {
|
protected Single<ServiceResponse<VerifyResponse>> verifyAccountWithoutRegistrationLock() {
|
||||||
return verifyAccountRepository.verifyAccount(getRegistrationData());
|
return verifyAccountRepository.verifyAccount(getRegistrationData())
|
||||||
|
.flatMap(verifyAccountWithoutKbsResponse -> {
|
||||||
|
VerifyResponseProcessor processor = new VerifyResponseWithoutKbs(verifyAccountWithoutKbsResponse);
|
||||||
|
|
||||||
|
if (processor.registrationLock() && SignalStore.kbsValues().getRegistrationLockToken() != null) {
|
||||||
|
KbsPinData pinData = new KbsPinData(SignalStore.kbsValues().getOrCreateMasterKey(), SignalStore.kbsValues().getRegistrationLockTokenResponse());
|
||||||
|
|
||||||
|
return verifyAccountRepository.verifyAccountWithReregistrationData(getRegistrationData(), () -> pinData)
|
||||||
|
.map(verifyAccountWithPinResponse -> {
|
||||||
|
if (verifyAccountWithPinResponse.getResult().isPresent() && verifyAccountWithPinResponse.getResult().get().getKbsData() != null) {
|
||||||
|
return verifyAccountWithPinResponse;
|
||||||
|
} else {
|
||||||
|
return verifyAccountWithoutKbsResponse;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
return Single.just(verifyAccountWithoutKbsResponse);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Single<ServiceResponse<VerifyResponse>> verifyAccountWithRegistrationLock(@NonNull String pin, @NonNull TokenData kbsTokenData) {
|
protected Single<ServiceResponse<VerifyResponse>> verifyAccountWithRegistrationLock(@NonNull String pin, @NonNull TokenData kbsTokenData) {
|
||||||
return verifyAccountRepository.verifyAccountWithPin(getRegistrationData(), pin, kbsTokenData);
|
return verifyAccountRepository.verifyAccountWithPin(getRegistrationData(), pin, () -> Objects.requireNonNull(KbsRepository.restoreMasterKey(pin, kbsTokenData.getEnclave(), kbsTokenData.getBasicAuth(), kbsTokenData.getTokenResponse())));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Ładowanie…
Reference in New Issue