Skip to content

Commit e2015fc

Browse files
committed
fix: keep paykit flag out of backup
1 parent cb84239 commit e2015fc

3 files changed

Lines changed: 46 additions & 2 deletions

File tree

app/src/main/java/to/bitkit/data/SettingsStore.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,10 @@ fun SettingsData.resetPin() = this.copy(
157157
isBiometricEnabled = false,
158158
)
159159

160+
fun SettingsData.resetLocalOnlySettings() = copy(
161+
isPaykitEnabled = false,
162+
)
163+
160164
fun SettingsData.hasPublicPaykitPublicationState(): Boolean =
161165
hasConfirmedPublicPaykitEndpoints ||
162166
sharesPublicPaykitEndpoints ||

app/src/main/java/to/bitkit/repositories/BackupRepo.kt

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,16 @@ import kotlinx.coroutines.launch
2525
import kotlinx.coroutines.withContext
2626
import kotlinx.coroutines.withTimeout
2727
import kotlinx.serialization.Serializable
28+
import kotlinx.serialization.json.JsonObject
29+
import kotlinx.serialization.json.jsonObject
2830
import to.bitkit.R
2931
import to.bitkit.data.AppDb
3032
import to.bitkit.data.CacheStore
3133
import to.bitkit.data.SettingsStore
3234
import to.bitkit.data.WidgetsStore
3335
import to.bitkit.data.backup.VssBackupClient
3436
import to.bitkit.data.backup.VssBackupClientLdk
37+
import to.bitkit.data.resetLocalOnlySettings
3538
import to.bitkit.data.resetPin
3639
import to.bitkit.di.IoDispatcher
3740
import to.bitkit.di.json
@@ -468,12 +471,12 @@ class BackupRepo @Inject constructor(
468471

469472
private suspend fun getBackupDataBytes(category: BackupCategory): ByteArray = when (category) {
470473
BackupCategory.SETTINGS -> {
471-
val data = settingsStore.data.first().resetPin()
474+
val data = settingsStore.data.first().resetLocalOnlySettings().resetPin()
472475
val payload = SettingsBackupV1(
473476
createdAt = currentTimeMillis(),
474477
settings = data,
475478
)
476-
json.encodeToString(payload).toByteArray()
479+
payload.toSanitizedBackupBytes()
477480
}
478481

479482
BackupCategory.WIDGETS -> {
@@ -699,6 +702,15 @@ class BackupRepo @Inject constructor(
699702
}
700703
}
701704

705+
private fun SettingsBackupV1.toSanitizedBackupBytes(): ByteArray {
706+
val payload = json.encodeToJsonElement(SettingsBackupV1.serializer(), this).jsonObject
707+
val settings = payload.getValue("settings").jsonObject
708+
val sanitizedPayload = JsonObject(
709+
payload + ("settings" to JsonObject(settings - "isPaykitEnabled"))
710+
)
711+
return json.encodeToString(JsonObject.serializer(), sanitizedPayload).toByteArray()
712+
}
713+
702714
companion object {
703715
private const val TAG = "BackupRepo"
704716

app/src/test/java/to/bitkit/repositories/BackupRepoTest.kt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@ package to.bitkit.repositories
33
import android.content.Context
44
import com.synonym.vssclient.VssItem
55
import kotlinx.coroutines.flow.MutableStateFlow
6+
import kotlinx.serialization.json.jsonObject
67
import org.junit.Before
78
import org.junit.Test
89
import org.mockito.kotlin.any
910
import org.mockito.kotlin.anyOrNull
11+
import org.mockito.kotlin.argumentCaptor
12+
import org.mockito.kotlin.eq
1013
import org.mockito.kotlin.mock
1114
import org.mockito.kotlin.never
1215
import org.mockito.kotlin.verify
@@ -23,11 +26,13 @@ import to.bitkit.data.entities.TransferEntity
2326
import to.bitkit.di.json
2427
import to.bitkit.models.BackupCategory
2528
import to.bitkit.models.PrivatePaykitContactLinkBackupV1
29+
import to.bitkit.models.SettingsBackupV1
2630
import to.bitkit.models.WalletBackupV1
2731
import to.bitkit.services.LightningService
2832
import to.bitkit.test.BaseUnitTest
2933
import to.bitkit.utils.AppError
3034
import javax.inject.Provider
35+
import kotlin.test.assertFalse
3136
import kotlin.test.assertTrue
3237
import kotlin.time.Clock
3338
import kotlin.time.ExperimentalTime
@@ -65,6 +70,8 @@ class BackupRepoTest : BaseUnitTest() {
6570
whenever(settingsStore.data).thenReturn(settingsData)
6671
whenever { settingsStore.update(any()) }.thenReturn(Unit)
6772
whenever { vssBackupClient.getObject(any()) }.thenReturn(Result.success(null))
73+
whenever { vssBackupClient.putObject(any(), any()) }
74+
.thenReturn(Result.success(VssItem(key = BackupCategory.SETTINGS.name, value = byteArrayOf(), version = 1)))
6875
whenever { privatePaykitRepo.restoreBackup(anyOrNull()) }.thenReturn(Result.success(Unit))
6976
whenever { privatePaykitAddressReservationRepo.restoreBackup(any()) }.thenReturn(Result.success(Unit))
7077
whenever {
@@ -126,6 +133,27 @@ class BackupRepoTest : BaseUnitTest() {
126133
verify(privatePaykitRepo).setContactSharingCleanupPending(true)
127134
}
128135

136+
@Test
137+
fun `settings backup excludes local Paykit UI flag`() = test {
138+
settingsData.value = SettingsData(
139+
isPaykitEnabled = true,
140+
sharesPublicPaykitEndpoints = true,
141+
publicPaykitBolt11 = "lnbc1backup",
142+
)
143+
val dataCaptor = argumentCaptor<ByteArray>()
144+
145+
sut.triggerBackup(BackupCategory.SETTINGS)
146+
147+
verify(vssBackupClient).putObject(eq(BackupCategory.SETTINGS.name), dataCaptor.capture())
148+
val backupJson = json.parseToJsonElement(dataCaptor.firstValue.decodeToString()).jsonObject
149+
val settingsJson = backupJson.getValue("settings").jsonObject
150+
val payload = json.decodeFromString<SettingsBackupV1>(dataCaptor.firstValue.decodeToString())
151+
assertFalse("isPaykitEnabled" in settingsJson)
152+
assertFalse(payload.settings.isPaykitEnabled)
153+
assertTrue(payload.settings.sharesPublicPaykitEndpoints)
154+
assertTrue(payload.settings.publicPaykitBolt11.isNotBlank())
155+
}
156+
129157
private fun stubWalletBackup(
130158
privatePaykitContactLinks: Map<String, PrivatePaykitContactLinkBackupV1>? = null,
131159
) {

0 commit comments

Comments
 (0)