11package com.getcode.network.appcheck
22
33import com.codeinc.gen.common.v1.Model
4+ import com.getcode.api.BuildConfig
45import com.google.firebase.Firebase
56import com.google.firebase.appcheck.AppCheckToken
67import com.google.firebase.appcheck.AppCheckTokenResult
78import com.google.firebase.appcheck.appCheck
9+ import com.google.firebase.appcheck.debug.DebugAppCheckProviderFactory
10+ import com.google.firebase.appcheck.debug.internal.DebugAppCheckProvider
11+ import com.google.firebase.appcheck.playintegrity.PlayIntegrityAppCheckProviderFactory
812import io.reactivex.rxjava3.core.BackpressureStrategy
913import io.reactivex.rxjava3.core.Flowable
1014import io.reactivex.rxjava3.core.Single
1115import kotlinx.coroutines.flow.Flow
1216import kotlinx.coroutines.reactive.asFlow
1317import timber.log.Timber
18+ import java.lang.Exception
1419
1520data class DeviceTokenResult (
1621 val token : AppCheckToken ?
1722)
1823
1924object AppCheck {
2025
26+ fun register () {
27+ // if (BuildConfig.DEBUG) {
28+ Firebase .appCheck.installAppCheckProviderFactory(
29+ DebugAppCheckProviderFactory .getInstance()
30+ )
31+ // } else {
32+ // Firebase.appCheck.installAppCheckProviderFactory(
33+ // PlayIntegrityAppCheckProviderFactory.getInstance()
34+ // )
35+ // }
36+ }
37+
38+ private fun handleAppCheckError (error : Exception ): Boolean {
39+ val match = " code: \\ d+" .toRegex().find(error.message.orEmpty())
40+ val errorCode = match?.value?.removePrefix(" code: " )?.toInt() ? : - 1
41+ Timber .e(" Failed to get appcheck token: errorCode=$errorCode ${error.message} " )
42+
43+ return errorCode == 403 // bad attestation
44+ || errorCode >= 500
45+ }
46+
2147 @Deprecated(" Replace with Flow variant" )
2248 fun limitedUseTokenSingle (): Single <DeviceTokenResult > {
2349 return Single .create { emitter ->
2450 Firebase .appCheck.limitedUseAppCheckToken
25- .addOnSuccessListener { emitter.onSuccess(DeviceTokenResult (it)) }
51+ .addOnSuccessListener {
52+ Timber .d(" attestation passed" )
53+ emitter.onSuccess(DeviceTokenResult (it))
54+ }
2655 .addOnFailureListener { error ->
27- val match = " code: \\ d+" .toRegex().find(error.message.orEmpty())
28- val errorCode = match?.value?.removePrefix(" code: " )?.toInt() ? : - 1
29- Timber .e(" Failed to get appcheck token: errorCode=$errorCode ${error.message} " )
30-
31- if (errorCode >= 500 ) {
56+ if (! handleAppCheckError(error)) {
3257 emitter.onError(error)
3358 return @addOnFailureListener
3459 }
@@ -44,13 +69,12 @@ object AppCheck {
4469 ): Flowable <DeviceTokenResult > {
4570 return Flowable .create({ emitter ->
4671 Firebase .appCheck.limitedUseAppCheckToken
47- .addOnSuccessListener { emitter.onNext(DeviceTokenResult (it)) }
72+ .addOnSuccessListener {
73+ Timber .d(" attestation passed" )
74+ emitter.onNext(DeviceTokenResult (it))
75+ }
4876 .addOnFailureListener { error ->
49- val match = " code: \\ d+" .toRegex().find(error.message.orEmpty())
50- val errorCode = match?.value?.removePrefix(" code: " )?.toInt() ? : - 1
51- Timber .e(" Failed to get appcheck token: errorCode=$errorCode ${error.message} " )
52-
53- if (errorCode >= 500 ) {
77+ if (! handleAppCheckError(error)) {
5478 emitter.onError(error)
5579 return @addOnFailureListener
5680 }
0 commit comments