diff --git a/app/build.gradle b/app/build.gradle index 0d0252651b..b068aa47c2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -328,7 +328,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 b708a8bc80..d51a531964 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 @@ -23,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 @@ -32,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.uber.autodispose.autoDispose import dagger.hilt.android.AndroidEntryPoint @@ -70,7 +73,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 @@ -615,8 +617,7 @@ class MainActivity : BlazeBaseActivity() { .subscribe( { resp -> resp.data?.let { - val nonce = Base64.decode(it.nonce) - validateSafetyNet(nonce) + validateIntegrity(it.nonce) } }, { @@ -625,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) } }