diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberViewModelTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberViewModelTest.kt index 18bf5b9abf..ab63dbee93 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberViewModelTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberViewModelTest.kt @@ -3,6 +3,9 @@ package org.thoughtcrime.securesms.components.settings.app.changenumber import androidx.lifecycle.SavedStateHandle import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.FlakyTest +import io.mockk.every +import io.mockk.mockkObject +import io.mockk.unmockkObject import okhttp3.mockwebserver.MockResponse import org.junit.After import org.junit.Before @@ -15,6 +18,7 @@ import org.signal.libsignal.protocol.state.SignedPreKeyRecord import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.dependencies.InstrumentationApplicationDependencyProvider import org.thoughtcrime.securesms.keyvalue.SignalStore +import org.thoughtcrime.securesms.pin.SvrRepository import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.registration.VerifyAccountRepository import org.thoughtcrime.securesms.registration.VerifyResponseProcessor @@ -34,10 +38,14 @@ import org.thoughtcrime.securesms.testing.parsedRequestBody import org.thoughtcrime.securesms.testing.success import org.thoughtcrime.securesms.testing.timeout import org.whispersystems.signalservice.api.account.ChangePhoneNumberRequest +import org.whispersystems.signalservice.api.kbs.MasterKey import org.whispersystems.signalservice.api.push.ServiceId import org.whispersystems.signalservice.api.push.ServiceId.PNI +import org.whispersystems.signalservice.api.svr.SecureValueRecovery +import org.whispersystems.signalservice.internal.push.AuthCredentials import org.whispersystems.signalservice.internal.push.MismatchedDevices import org.whispersystems.signalservice.internal.push.PreKeyState +import java.security.SecureRandom import java.util.UUID @RunWith(AndroidJUnit4::class) @@ -62,10 +70,13 @@ class ChangeNumberViewModelTest { viewModel.setNewCountry(1) viewModel.setNewNationalNumber("5555550102") } + + mockkObject(SvrRepository) } @After fun tearDown() { + unmockkObject(SvrRepository) InstrumentationApplicationDependencyProvider.clearHandlers() } @@ -249,6 +260,8 @@ class ChangeNumberViewModelTest { Get("/v1/certificate/delivery") { MockResponse().success(MockProvider.senderCertificate) } ) + every { SvrRepository.restoreMasterKeyPreRegistration(any(), any(), any()) } returns SecureValueRecovery.RestoreResponse.Success(MasterKey.createNew(SecureRandom()), AuthCredentials.create("username", "password")) + // WHEN viewModel.requestVerificationCode(VerifyAccountRepository.Mode.SMS_WITHOUT_LISTENER, null, null).blockingGet().resultOrThrow viewModel.verifyCodeWithoutRegistrationLock("123456").blockingGet().also { processor -> @@ -356,6 +369,8 @@ class ChangeNumberViewModelTest { Get("/v1/certificate/delivery") { MockResponse().success(MockProvider.senderCertificate) } ) + every { SvrRepository.restoreMasterKeyPreRegistration(any(), any(), any()) } returns SecureValueRecovery.RestoreResponse.Success(MasterKey.createNew(SecureRandom()), AuthCredentials.create("username", "password")) + // WHEN viewModel.requestVerificationCode(VerifyAccountRepository.Mode.SMS_WITHOUT_LISTENER, null, null).blockingGet().resultOrThrow viewModel.verifyCodeWithoutRegistrationLock("123456").blockingGet().also { processor -> diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/MockProvider.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/MockProvider.kt index 4175150446..ab8a3878f5 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/MockProvider.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/MockProvider.kt @@ -31,7 +31,7 @@ object MockProvider { val lockedFailure = PushServiceSocket.RegistrationLockFailure().apply { svr1Credentials = AuthCredentials.create("username", "password") - svr2Credentials = null + svr2Credentials = AuthCredentials.create("username", "password") } val primaryOnlyDeviceList = DeviceInfoList().apply { diff --git a/app/src/main/java/org/thoughtcrime/securesms/pin/SvrRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/pin/SvrRepository.kt index d1aa640b78..a82448ced4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/pin/SvrRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/pin/SvrRepository.kt @@ -6,6 +6,7 @@ package org.thoughtcrime.securesms.pin import android.app.backup.BackupManager +import androidx.annotation.VisibleForTesting import androidx.annotation.WorkerThread import org.signal.core.util.Stopwatch import org.signal.core.util.logging.Log @@ -359,7 +360,8 @@ object SvrRepository { } @WorkerThread - private fun restoreMasterKeyPreRegistration(svr: SecureValueRecovery, credentials: AuthCredentials?, userPin: String): RestoreResponse { + @VisibleForTesting + fun restoreMasterKeyPreRegistration(svr: SecureValueRecovery, credentials: AuthCredentials?, userPin: String): RestoreResponse { return if (credentials == null) { RestoreResponse.Missing } else { diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/svr/SecureValueRecoveryV2.kt b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/svr/SecureValueRecoveryV2.kt index 011dfd47a0..77fd500966 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/svr/SecureValueRecoveryV2.kt +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/svr/SecureValueRecoveryV2.kt @@ -26,7 +26,6 @@ import org.whispersystems.signalservice.internal.push.PushServiceSocket import org.whispersystems.signalservice.internal.util.Hex import org.whispersystems.signalservice.internal.util.JsonUtil import java.io.IOException -import kotlin.jvm.Throws import org.signal.svr2.proto.BackupResponse as ProtoBackupResponse import org.signal.svr2.proto.ExposeResponse as ProtoExposeResponse import org.signal.svr2.proto.RestoreResponse as ProtoRestoreResponse