diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/SignalActivityRule.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/SignalActivityRule.kt index c2b21082f3..f044d8b92c 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/SignalActivityRule.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/SignalActivityRule.kt @@ -8,6 +8,7 @@ import android.content.SharedPreferences import android.preference.PreferenceManager import androidx.test.core.app.ActivityScenario import androidx.test.platform.app.InstrumentationRegistry +import kotlinx.coroutines.runBlocking import okhttp3.mockwebserver.MockResponse import org.junit.rules.ExternalResource import org.signal.libsignal.protocol.IdentityKey @@ -25,7 +26,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.profiles.ProfileName import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId -import org.thoughtcrime.securesms.registration.VerifyResponse +import org.thoughtcrime.securesms.registration.data.LocalRegistrationMetadataUtil import org.thoughtcrime.securesms.registration.data.RegistrationData import org.thoughtcrime.securesms.registration.data.RegistrationRepository import org.thoughtcrime.securesms.registration.util.RegistrationUtil @@ -34,9 +35,6 @@ import org.thoughtcrime.securesms.util.Util import org.whispersystems.signalservice.api.profiles.SignalServiceProfile import org.whispersystems.signalservice.api.push.ServiceId.ACI import org.whispersystems.signalservice.api.push.SignalServiceAddress -import org.whispersystems.signalservice.internal.ServiceResponse -import org.whispersystems.signalservice.internal.ServiceResponseProcessor -import org.whispersystems.signalservice.internal.push.VerifyAccountResponse import java.util.UUID /** @@ -48,6 +46,7 @@ import java.util.UUID class SignalActivityRule(private val othersCount: Int = 4, private val createGroup: Boolean = false) : ExternalResource() { val application: Application = AppDependencies.application + private val TEST_E164 = "+15555550101" lateinit var context: Context private set @@ -93,31 +92,31 @@ class SignalActivityRule(private val othersCount: Int = 4, private val createGro SignalStore.account.generateAciIdentityKeyIfNecessary() SignalStore.account.generatePniIdentityKeyIfNecessary() - val registrationRepository = RegistrationRepository(application) - InstrumentationApplicationDependencyProvider.addMockWebRequestHandlers(Put("/v2/keys") { MockResponse().success() }) - val response: ServiceResponse = registrationRepository.registerAccount( - RegistrationData( + runBlocking { + val registrationData = RegistrationData( code = "123123", - e164 = "+15555550101", + e164 = TEST_E164, password = Util.getSecret(18), - registrationId = registrationRepository.registrationId, - profileKey = registrationRepository.getProfileKey("+15555550101"), + registrationId = RegistrationRepository.getRegistrationId(), + profileKey = RegistrationRepository.getProfileKey(TEST_E164), fcmToken = null, - pniRegistrationId = registrationRepository.pniRegistrationId, + pniRegistrationId = RegistrationRepository.getPniRegistrationId(), recoveryPassword = "asdfasdfasdfasdf" - ), - VerifyResponse( - verifyAccountResponse = VerifyAccountResponse(UUID.randomUUID().toString(), UUID.randomUUID().toString(), false), + ) + val remoteResult = RegistrationRepository.AccountRegistrationResult( + uuid = UUID.randomUUID().toString(), + pni = UUID.randomUUID().toString(), + storageCapable = false, + number = TEST_E164, masterKey = null, pin = null, aciPreKeyCollection = RegistrationRepository.generateSignedAndLastResortPreKeys(SignalStore.account.aciIdentityKey, SignalStore.account.aciPreKeys), pniPreKeyCollection = RegistrationRepository.generateSignedAndLastResortPreKeys(SignalStore.account.aciIdentityKey, SignalStore.account.pniPreKeys) - ), - false - ).blockingGet() - - ServiceResponseProcessor.DefaultProcessor(response).resultOrThrow + ) + val localRegistrationData = LocalRegistrationMetadataUtil.createLocalRegistrationMetadata(SignalStore.account.aciIdentityKey, SignalStore.account.pniIdentityKey, registrationData, remoteResult, false) + RegistrationRepository.registerAccountLocally(application, localRegistrationData) + } SignalStore.svr.optOut() RegistrationUtil.maybeMarkRegistrationComplete() diff --git a/app/src/benchmark/java/org/signal/benchmark/DummyAccountManagerFactory.kt b/app/src/benchmark/java/org/signal/benchmark/DummyAccountManagerFactory.kt deleted file mode 100644 index f211237c2a..0000000000 --- a/app/src/benchmark/java/org/signal/benchmark/DummyAccountManagerFactory.kt +++ /dev/null @@ -1,40 +0,0 @@ -package org.signal.benchmark - -import android.content.Context -import org.thoughtcrime.securesms.BuildConfig -import org.thoughtcrime.securesms.dependencies.AppDependencies -import org.thoughtcrime.securesms.push.AccountManagerFactory -import org.thoughtcrime.securesms.util.RemoteConfig -import org.whispersystems.signalservice.api.SignalServiceAccountManager -import org.whispersystems.signalservice.api.account.PreKeyUpload -import org.whispersystems.signalservice.api.push.ServiceId.ACI -import org.whispersystems.signalservice.api.push.ServiceId.PNI -import org.whispersystems.signalservice.internal.configuration.SignalServiceConfiguration -import java.io.IOException -import java.util.Optional - -class DummyAccountManagerFactory : AccountManagerFactory() { - override fun createAuthenticated(context: Context, aci: ACI, pni: PNI, number: String, deviceId: Int, password: String): SignalServiceAccountManager { - return DummyAccountManager( - AppDependencies.signalServiceNetworkAccess.getConfiguration(number), - aci, - pni, - number, - deviceId, - password, - BuildConfig.SIGNAL_AGENT, - RemoteConfig.okHttpAutomaticRetry, - RemoteConfig.groupLimits.hardLimit - ) - } - - private class DummyAccountManager(configuration: SignalServiceConfiguration?, aci: ACI?, pni: PNI?, e164: String?, deviceId: Int, password: String?, signalAgent: String?, automaticNetworkRetry: Boolean, maxGroupSize: Int) : SignalServiceAccountManager(configuration, aci, pni, e164, deviceId, password, signalAgent, automaticNetworkRetry, maxGroupSize) { - @Throws(IOException::class) - override fun setGcmId(gcmRegistrationId: Optional) { - } - - @Throws(IOException::class) - override fun setPreKeys(preKeyUpload: PreKeyUpload) { - } - } -} diff --git a/app/src/benchmark/java/org/signal/benchmark/setup/TestUsers.kt b/app/src/benchmark/java/org/signal/benchmark/setup/TestUsers.kt index 0a7a326909..7162c53ae4 100644 --- a/app/src/benchmark/java/org/signal/benchmark/setup/TestUsers.kt +++ b/app/src/benchmark/java/org/signal/benchmark/setup/TestUsers.kt @@ -3,8 +3,7 @@ package org.signal.benchmark.setup import android.app.Application import android.content.SharedPreferences import android.preference.PreferenceManager -import org.signal.benchmark.DummyAccountManagerFactory -import org.signal.core.util.concurrent.safeBlockingGet +import kotlinx.coroutines.runBlocking import org.signal.libsignal.protocol.SignalProtocolAddress import org.thoughtcrime.securesms.crypto.IdentityKeyUtil import org.thoughtcrime.securesms.crypto.MasterSecretUtil @@ -14,25 +13,22 @@ import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.net.DeviceTransferBlockingInterceptor import org.thoughtcrime.securesms.profiles.ProfileName -import org.thoughtcrime.securesms.push.AccountManagerFactory import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId -import org.thoughtcrime.securesms.registration.RegistrationData -import org.thoughtcrime.securesms.registration.RegistrationRepository -import org.thoughtcrime.securesms.registration.RegistrationUtil -import org.thoughtcrime.securesms.registration.VerifyResponse +import org.thoughtcrime.securesms.registration.data.LocalRegistrationMetadataUtil +import org.thoughtcrime.securesms.registration.data.RegistrationData +import org.thoughtcrime.securesms.registration.data.RegistrationRepository +import org.thoughtcrime.securesms.registration.util.RegistrationUtil import org.thoughtcrime.securesms.util.Util import org.whispersystems.signalservice.api.profiles.SignalServiceProfile import org.whispersystems.signalservice.api.push.ServiceId.ACI import org.whispersystems.signalservice.api.push.SignalServiceAddress -import org.whispersystems.signalservice.internal.ServiceResponse -import org.whispersystems.signalservice.internal.ServiceResponseProcessor -import org.whispersystems.signalservice.internal.push.VerifyAccountResponse import java.util.UUID object TestUsers { private var generatedOthers: Int = 0 + private val TEST_E164 = "+15555550101" fun setupSelf(): Recipient { val application: Application = AppDependencies.application @@ -47,35 +43,30 @@ object TestUsers { SignalStore.account.generateAciIdentityKeyIfNecessary() SignalStore.account.generatePniIdentityKeyIfNecessary() - val registrationRepository = RegistrationRepository(application) - val registrationData = RegistrationData( - code = "123123", - e164 = "+15555550101", - password = Util.getSecret(18), - registrationId = registrationRepository.registrationId, - profileKey = registrationRepository.getProfileKey("+15555550101"), - fcmToken = "fcm-token", - pniRegistrationId = registrationRepository.pniRegistrationId, - recoveryPassword = "asdfasdfasdfasdf" - ) - - val verifyResponse = VerifyResponse( - VerifyAccountResponse(UUID.randomUUID().toString(), UUID.randomUUID().toString(), false), - masterKey = null, - pin = null, - aciPreKeyCollection = RegistrationRepository.generateSignedAndLastResortPreKeys(SignalStore.account.aciIdentityKey, SignalStore.account.aciPreKeys), - pniPreKeyCollection = RegistrationRepository.generateSignedAndLastResortPreKeys(SignalStore.account.aciIdentityKey, SignalStore.account.pniPreKeys) - ) - - AccountManagerFactory.setInstance(DummyAccountManagerFactory()) - - val response: ServiceResponse = registrationRepository.registerAccount( - registrationData, - verifyResponse, - false - ).safeBlockingGet() - - ServiceResponseProcessor.DefaultProcessor(response).resultOrThrow + runBlocking { + val registrationData = RegistrationData( + code = "123123", + e164 = TEST_E164, + password = Util.getSecret(18), + registrationId = RegistrationRepository.getRegistrationId(), + profileKey = RegistrationRepository.getProfileKey(TEST_E164), + fcmToken = null, + pniRegistrationId = RegistrationRepository.getPniRegistrationId(), + recoveryPassword = "asdfasdfasdfasdf" + ) + val remoteResult = RegistrationRepository.AccountRegistrationResult( + uuid = UUID.randomUUID().toString(), + pni = UUID.randomUUID().toString(), + storageCapable = false, + number = TEST_E164, + masterKey = null, + pin = null, + aciPreKeyCollection = RegistrationRepository.generateSignedAndLastResortPreKeys(SignalStore.account.aciIdentityKey, SignalStore.account.aciPreKeys), + pniPreKeyCollection = RegistrationRepository.generateSignedAndLastResortPreKeys(SignalStore.account.aciIdentityKey, SignalStore.account.pniPreKeys) + ) + val localRegistrationData = LocalRegistrationMetadataUtil.createLocalRegistrationMetadata(SignalStore.account.aciIdentityKey, SignalStore.account.pniIdentityKey, registrationData, remoteResult, false) + RegistrationRepository.registerAccountLocally(application, localRegistrationData) + } SignalStore.svr.optOut() RegistrationUtil.maybeMarkRegistrationComplete() diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/data/RegistrationRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/data/RegistrationRepository.kt index 1c5c2483cf..06721b84d5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/data/RegistrationRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/data/RegistrationRepository.kt @@ -7,6 +7,7 @@ package org.thoughtcrime.securesms.registration.data import android.app.backup.BackupManager import android.content.Context +import androidx.annotation.VisibleForTesting import androidx.core.app.NotificationManagerCompat import com.google.android.gms.auth.api.phone.SmsRetriever import kotlinx.coroutines.Dispatchers @@ -587,7 +588,8 @@ object RegistrationRepository { return started == true } - private fun generateSignedAndLastResortPreKeys(identity: IdentityKeyPair, metadataStore: PreKeyMetadataStore): PreKeyCollection { + @VisibleForTesting + fun generateSignedAndLastResortPreKeys(identity: IdentityKeyPair, metadataStore: PreKeyMetadataStore): PreKeyCollection { val signedPreKey = PreKeyUtil.generateSignedPreKey(metadataStore.nextSignedPreKeyId, identity.privateKey) val lastResortKyberPreKey = PreKeyUtil.generateLastResortKyberPreKey(metadataStore.nextKyberPreKeyId, identity.privateKey)