From cc6fd57d07f84ef03983f9e62b6bdf212dcc85f6 Mon Sep 17 00:00:00 2001 From: SeniorZhai Date: Wed, 29 Nov 2023 14:17:05 +0800 Subject: [PATCH] Integrity API --- app/build.gradle | 2 +- .../one/mixin/android/ui/home/MainActivity.kt | 40 ++++++++++++------- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9a04fbb414..ef15699f42 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -324,7 +324,7 @@ dependencies { implementation "com.google.mlkit:barcode-scanning:${mlkitBarcodeVersion}" implementation "com.google.android.play:app-update-ktx:${playVersion}" - implementation "com.google.android.gms:play-services-safetynet:${googlePlayServicesVersion}" + implementation 'com.google.android.play:integrity:1.4.0' implementation "com.google.android.gms:play-services-maps:19.0.0" implementation "com.google.android.gms:play-services-location:21.3.0" implementation "com.google.android.gms:play-services-cronet:${googlePlayServicesVersion}" diff --git a/app/src/main/java/one/mixin/android/ui/home/MainActivity.kt b/app/src/main/java/one/mixin/android/ui/home/MainActivity.kt index 5cd02f53ee..f4ed405486 100644 --- a/app/src/main/java/one/mixin/android/ui/home/MainActivity.kt +++ b/app/src/main/java/one/mixin/android/ui/home/MainActivity.kt @@ -16,7 +16,6 @@ import android.os.PowerManager import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.core.content.getSystemService -import androidx.core.view.children import androidx.fragment.app.DialogFragment import androidx.lifecycle.Lifecycle import androidx.lifecycle.ProcessLifecycleOwner @@ -24,7 +23,6 @@ import androidx.lifecycle.lifecycleScope import androidx.room.util.readVersion import com.google.android.gms.common.ConnectionResult import com.google.android.gms.common.GoogleApiAvailability -import com.google.android.gms.safetynet.SafetyNet import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import com.google.android.play.core.appupdate.AppUpdateManagerFactory @@ -33,6 +31,10 @@ import com.google.android.play.core.install.InstallStateUpdatedListener import com.google.android.play.core.install.model.AppUpdateType import com.google.android.play.core.install.model.InstallStatus import com.google.android.play.core.install.model.UpdateAvailability +import com.google.android.play.core.integrity.IntegrityManagerFactory +import com.google.android.play.core.integrity.IntegrityTokenRequest +import com.google.android.play.core.integrity.IntegrityTokenResponse +import com.google.firebase.FirebaseApp import com.google.firebase.crashlytics.FirebaseCrashlytics import com.microsoft.appcenter.AppCenter import com.uber.autodispose.autoDispose @@ -47,7 +49,6 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.withContext import one.mixin.android.BuildConfig import one.mixin.android.Constants import one.mixin.android.Constants.APP_VERSION @@ -73,7 +74,6 @@ import one.mixin.android.RxBus import one.mixin.android.api.request.SessionRequest import one.mixin.android.api.service.ConversationService import one.mixin.android.api.service.UserService -import one.mixin.android.crypto.Base64 import one.mixin.android.crypto.PrivacyPreference.getIsLoaded import one.mixin.android.crypto.PrivacyPreference.getIsSyncSession import one.mixin.android.databinding.ActivityMainBinding @@ -141,7 +141,6 @@ import one.mixin.android.ui.common.PinCodeFragment.Companion.FROM_LOGIN import one.mixin.android.ui.common.PinCodeFragment.Companion.PREF_LOGIN_FROM import one.mixin.android.ui.common.QrScanBottomSheetDialogFragment import one.mixin.android.ui.common.VerifyFragment -import one.mixin.android.ui.common.Web3Fragment import one.mixin.android.ui.common.biometric.buildEmptyTransferBiometricItem import one.mixin.android.ui.conversation.ConversationActivity import one.mixin.android.ui.conversation.TransferFragment @@ -165,7 +164,6 @@ import one.mixin.android.ui.tip.wc.WalletConnectActivity import one.mixin.android.ui.tip.wc.WalletUnlockBottomSheetDialogFragment import one.mixin.android.ui.tip.wc.WalletUnlockBottomSheetDialogFragment.Companion.TYPE_ETH import one.mixin.android.ui.tip.wc.WalletUnlockBottomSheetDialogFragment.Companion.TYPE_SOLANA -import one.mixin.android.ui.wallet.BackupMnemonicPhraseWarningBottomSheetDialogFragment import one.mixin.android.ui.wallet.WalletActivity import one.mixin.android.ui.wallet.WalletActivity.Companion.BUY import one.mixin.android.ui.wallet.WalletFragment @@ -619,8 +617,7 @@ class MainActivity : BlazeBaseActivity() { .subscribe( { resp -> resp.data?.let { - val nonce = Base64.decode(it.nonce) - validateSafetyNet(nonce) + validateIntegrity(it.nonce) } }, { @@ -629,17 +626,32 @@ class MainActivity : BlazeBaseActivity() { } } - private fun validateSafetyNet(nonce: ByteArray) { - val client = SafetyNet.getClient(this) - val task = client.attest(nonce, BuildConfig.SAFETYNET_API_KEY) - task.addOnSuccessListener { safetyResp -> - accountRepo.updateSession(SessionRequest(deviceCheckToken = safetyResp.jwsResult)) + private fun validateIntegrity(nonce: String) { + val integrityManager = IntegrityManagerFactory.create(this) + val projectNumber = FirebaseApp.getInstance().options.gcmSenderId!! + .toLong() + integrityManager.requestIntegrityToken( + IntegrityTokenRequest.builder() + .setCloudProjectNumber(projectNumber) + .setNonce(nonce) + .build() + ) + val integrityTokenResponse = integrityManager.requestIntegrityToken( + IntegrityTokenRequest.builder() + .setCloudProjectNumber(projectNumber) + .setNonce(nonce) + .build() + ) + integrityTokenResponse.addOnSuccessListener { response: IntegrityTokenResponse -> + // Todo replace api? + accountRepo.updateSession(SessionRequest(deviceCheckToken = response.token())) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .autoDispose(stopScope) .subscribe({}, {}) } - task.addOnFailureListener { e -> + + integrityTokenResponse.addOnFailureListener { e: Exception -> reportException(e) } }