Skip to content

Commit 35de152

Browse files
committed
chore(appcheck): use debug provider on debug builds
Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent 2d85ca5 commit 35de152

6 files changed

Lines changed: 43 additions & 20 deletions

File tree

api/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ dependencies {
6565

6666
implementation(platform(Libs.firebase_bom))
6767
implementation(Libs.firebase_appcheck)
68+
implementation(Libs.firebase_appcheck_debug)
69+
implementation(Libs.firebase_appcheck_playintegrity)
6870

6971
implementation(Libs.androidx_paging_runtime)
7072

api/src/main/java/com/getcode/model/intents/IntentType.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,13 @@ abstract class IntentType {
4949
submitActionsBuilder.id = id.toIntentId()
5050
submitActionsBuilder.metadata = metadata()
5151
submitActionsBuilder.addAllActions(actionGroup.actions.map { it.action() })
52-
submitActionsBuilder.signature = submitActionsBuilder.sign(owner)
5352

5453
if (deviceToken != null) {
5554
submitActionsBuilder.setDeviceToken(deviceToken.toDeviceToken())
5655
}
5756

57+
submitActionsBuilder.signature = submitActionsBuilder.sign(owner)
58+
5859
return TransactionService.SubmitIntentRequest.newBuilder()
5960
.setSubmitActions(submitActionsBuilder)
6061
.build()

api/src/main/java/com/getcode/network/appcheck/AppCheck.kt

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,59 @@
11
package com.getcode.network.appcheck
22

33
import com.codeinc.gen.common.v1.Model
4+
import com.getcode.api.BuildConfig
45
import com.google.firebase.Firebase
56
import com.google.firebase.appcheck.AppCheckToken
67
import com.google.firebase.appcheck.AppCheckTokenResult
78
import 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
812
import io.reactivex.rxjava3.core.BackpressureStrategy
913
import io.reactivex.rxjava3.core.Flowable
1014
import io.reactivex.rxjava3.core.Single
1115
import kotlinx.coroutines.flow.Flow
1216
import kotlinx.coroutines.reactive.asFlow
1317
import timber.log.Timber
18+
import java.lang.Exception
1419

1520
data class DeviceTokenResult(
1621
val token: AppCheckToken?
1722
)
1823

1924
object 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
}

app/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,6 @@ dependencies {
162162

163163
implementation(platform(Libs.firebase_bom))
164164
implementation(Libs.firebase_analytics)
165-
implementation(Libs.firebase_appcheck_playintegrity)
166165

167166
implementation(Libs.hilt_nav_compose)
168167
implementation(Libs.lib_phone_number_port)

app/src/main/java/com/getcode/App.kt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,10 @@ import android.app.Application
44
import androidx.appcompat.app.AppCompatDelegate
55
import com.bugsnag.android.Bugsnag
66
import com.getcode.manager.AuthManager
7+
import com.getcode.network.appcheck.AppCheck
78
import com.getcode.utils.ErrorUtils
89
import com.getcode.view.main.bill.CashBillAssets
910
import com.google.firebase.Firebase
10-
import com.google.firebase.app
11-
import com.google.firebase.appcheck.appCheck
12-
import com.google.firebase.appcheck.playintegrity.PlayIntegrityAppCheckProviderFactory
1311
import com.google.firebase.initialize
1412
import dagger.hilt.android.HiltAndroidApp
1513
import io.reactivex.rxjava3.plugins.RxJavaPlugins
@@ -29,9 +27,7 @@ class App : Application() {
2927
CashBillAssets.load(this)
3028

3129
Firebase.initialize(this)
32-
Firebase.appCheck.installAppCheckProviderFactory(
33-
PlayIntegrityAppCheckProviderFactory.getInstance()
34-
)
30+
AppCheck.register()
3531

3632
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
3733

buildSrc/src/main/java/Dependencies.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ object Libs {
176176
const val firebase_bom = "com.google.firebase:firebase-bom:${Versions.firebase_bom}"
177177
const val firebase_analytics = "com.google.firebase:firebase-analytics-ktx"
178178
const val firebase_appcheck = "com.google.firebase:firebase-appcheck-ktx"
179+
const val firebase_appcheck_debug = "com.google.firebase:firebase-appcheck-debug"
179180
const val firebase_appcheck_playintegrity = "com.google.firebase:firebase-appcheck-playintegrity"
180181
const val firebase_crashlytics = "com.google.firebase:firebase-crashlytics-ktx"
181182
const val firebase_messaging = "com.google.firebase:firebase-messaging-ktx"

0 commit comments

Comments
 (0)