Skip to content

Commit 974b10d

Browse files
committed
chore: improvements to appcheck implementation
Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent 55f005b commit 974b10d

3 files changed

Lines changed: 44 additions & 16 deletions

File tree

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

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,41 +3,69 @@ package com.getcode.network.appcheck
33
import com.codeinc.gen.common.v1.Model
44
import com.google.firebase.Firebase
55
import com.google.firebase.appcheck.AppCheckToken
6+
import com.google.firebase.appcheck.AppCheckTokenResult
67
import com.google.firebase.appcheck.appCheck
78
import io.reactivex.rxjava3.core.BackpressureStrategy
89
import io.reactivex.rxjava3.core.Flowable
910
import io.reactivex.rxjava3.core.Single
1011
import kotlinx.coroutines.flow.Flow
1112
import kotlinx.coroutines.reactive.asFlow
13+
import timber.log.Timber
14+
15+
data class DeviceTokenResult(
16+
val token: AppCheckToken?
17+
)
1218

1319
object AppCheck {
1420

1521
@Deprecated("Replace with Flow variant")
16-
fun limitedUseTokenSingle(): Single<AppCheckToken> {
22+
fun limitedUseTokenSingle(): Single<DeviceTokenResult> {
1723
return Single.create { emitter ->
1824
Firebase.appCheck.limitedUseAppCheckToken
19-
.addOnSuccessListener { emitter.onSuccess(it) }
20-
.addOnFailureListener { emitter.onError(it) }
25+
.addOnSuccessListener { emitter.onSuccess(DeviceTokenResult(it)) }
26+
.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) {
32+
emitter.onError(error)
33+
return@addOnFailureListener
34+
}
35+
36+
emitter.onSuccess(DeviceTokenResult(null))
37+
}
2138
}
2239
}
2340

2441
@Deprecated("Replace with Flow variant")
2542
fun limitedUseTokenFlowable(
2643
backpressureStrategy: BackpressureStrategy = BackpressureStrategy.BUFFER
27-
): Flowable<AppCheckToken> {
44+
): Flowable<DeviceTokenResult> {
2845
return Flowable.create({ emitter ->
2946
Firebase.appCheck.limitedUseAppCheckToken
30-
.addOnSuccessListener { emitter.onNext(it) }
31-
.addOnFailureListener { emitter.onError(it) }
47+
.addOnSuccessListener { emitter.onNext(DeviceTokenResult(it)) }
48+
.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) {
54+
emitter.onError(error)
55+
return@addOnFailureListener
56+
}
57+
58+
emitter.onNext(DeviceTokenResult(null))
59+
}
3260
}, backpressureStrategy)
3361
}
3462

3563
fun limitedUseToken(
3664
backpressureStrategy: BackpressureStrategy = BackpressureStrategy.BUFFER
37-
): Flow<AppCheckToken> {
65+
): Flow<DeviceTokenResult> {
3866
return limitedUseTokenFlowable(backpressureStrategy).asFlow()
3967
}
4068
}
4169

42-
fun AppCheckToken.toDeviceToken() = Model.DeviceToken.newBuilder().setValue(token).build()
70+
fun AppCheckToken.toDeviceToken() = Model.DeviceToken.newBuilder().setValue(this.token).build()
4371
fun String.toDeviceToken() = Model.DeviceToken.newBuilder().setValue(this).build()

api/src/main/java/com/getcode/network/repository/PhoneRepository.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,12 @@
11
package com.getcode.network.repository
22

3-
import com.codeinc.gen.common.v1.Model.DeviceToken
43
import com.codeinc.gen.phone.v1.PhoneVerificationService
54
import com.getcode.db.Database
6-
import com.getcode.db.InMemoryDao
75
import com.getcode.ed25519.Ed25519
8-
import com.getcode.model.PrefsBool
9-
import com.getcode.model.PrefsString
10-
import com.getcode.network.core.NetworkOracle
116
import com.getcode.network.api.PhoneApi
127
import com.getcode.network.appcheck.AppCheck
138
import com.getcode.network.appcheck.toDeviceToken
9+
import com.getcode.network.core.NetworkOracle
1410
import com.google.firebase.Firebase
1511
import com.google.firebase.appcheck.AppCheckToken
1612
import com.google.firebase.appcheck.appCheck
@@ -60,8 +56,12 @@ class PhoneRepository @Inject constructor(
6056
val request =
6157
PhoneVerificationService.SendVerificationCodeRequest.newBuilder()
6258
.setPhoneNumber(phoneValue.toPhoneNumber())
63-
.setDeviceToken(tokenResult.toDeviceToken())
64-
.build()
59+
.apply {
60+
if (tokenResult.token != null) {
61+
setDeviceToken(tokenResult.token.toDeviceToken())
62+
}
63+
}.build()
64+
6565

6666
phoneApi.sendVerificationCode(request)
6767
.map { it.result }

api/src/main/java/com/getcode/network/repository/TransactionRepository.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ class TransactionRepository @Inject constructor(
9090

9191
return AppCheck.limitedUseTokenSingle()
9292
.flatMap { tokenResult ->
93-
submit(createAccounts, organizer.tray.owner.getCluster().authority.keyPair, tokenResult.token)
93+
submit(createAccounts, organizer.tray.owner.getCluster().authority.keyPair, tokenResult.token?.token)
9494
}
9595
}
9696

0 commit comments

Comments
 (0)