PM-25431: Allow SYNC_SEND_DELETE notification to delete sends for inactive user (#5827)

This commit is contained in:
David Perez 2025-09-04 10:29:35 -05:00 committed by GitHub
parent 58db64da1a
commit eec4233486
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 23 additions and 18 deletions

View File

@ -27,6 +27,7 @@ import kotlinx.coroutines.flow.mapNotNull
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import kotlinx.serialization.json.Json
import timber.log.Timber
import java.time.Clock
import java.time.ZoneOffset
import java.time.ZonedDateTime
@ -129,8 +130,8 @@ class PushManagerImpl @Inject constructor(
@Suppress("LongMethod", "CyclomaticComplexMethod")
private fun onMessageReceived(notification: BitwardenNotification) {
if (authDiskSource.uniqueAppId == notification.contextId) return
val userId = activeUserId ?: return
Timber.d("Push Notification Received: ${notification.notificationType}")
when (val type = notification.notificationType) {
NotificationType.AUTH_REQUEST,
@ -266,9 +267,14 @@ class PushManagerImpl @Inject constructor(
.decodeFromString<NotificationPayload.SyncSendNotification>(
string = notification.payload,
)
.takeIf { isLoggedIn(userId) && it.userMatchesNotification(userId) }
?.sendId
?.let { mutableSyncSendDeleteSharedFlow.tryEmit(SyncSendDeleteData(it)) }
.takeIf { it.userId != null && it.sendId != null }
?.let {
SyncSendDeleteData(
userId = requireNotNull(it.userId),
sendId = requireNotNull(it.sendId),
)
}
?.let { mutableSyncSendDeleteSharedFlow.tryEmit(it) }
}
}
}

View File

@ -2,9 +2,8 @@ package com.x8bit.bitwarden.data.platform.manager.model
/**
* Required data for sync send delete operations.
*
* @property sendId The send ID.
*/
data class SyncSendDeleteData(
val userId: String,
val sendId: String,
)

View File

@ -1385,12 +1385,9 @@ class VaultRepositoryImpl(
* Deletes the send specified by [syncSendDeleteData] from disk.
*/
private suspend fun deleteSend(syncSendDeleteData: SyncSendDeleteData) {
val userId = activeUserId ?: return
val sendId = syncSendDeleteData.sendId
vaultDiskSource.deleteSend(
userId = userId,
sendId = sendId,
userId = syncSendDeleteData.userId,
sendId = syncSendDeleteData.sendId,
)
}

View File

@ -343,6 +343,7 @@ class PushManagerTest {
pushManager.onMessageReceived(SYNC_SEND_DELETE_NOTIFICATION_MAP)
assertEquals(
SyncSendDeleteData(
userId = "078966a2-93c2-4618-ae2a-0a2394c88d37",
sendId = "aab5cdcc-f4a7-4e65-bf6d-5e0eab052321",
),
awaitItem(),
@ -456,10 +457,16 @@ class PushManagerTest {
}
@Test
fun `onMessageReceived with sync send delete does nothing`() = runTest {
fun `onMessageReceived with sync send delete emits to syncSendDeleteFlow`() = runTest {
pushManager.syncSendDeleteFlow.test {
pushManager.onMessageReceived(SYNC_SEND_DELETE_NOTIFICATION_MAP)
expectNoEvents()
assertEquals(
SyncSendDeleteData(
userId = "078966a2-93c2-4618-ae2a-0a2394c88d37",
sendId = "aab5cdcc-f4a7-4e65-bf6d-5e0eab052321",
),
awaitItem(),
)
}
}

View File

@ -3679,13 +3679,9 @@ class VaultRepositoryTest {
fun `syncSendDeleteFlow should delete send from disk`() {
val userId = "mockId-1"
val sendId = "mockId-1"
fakeAuthDiskSource.userState = MOCK_USER_STATE
coEvery { vaultDiskSource.deleteSend(userId = userId, sendId = sendId) } just runs
mutableSyncSendDeleteFlow.tryEmit(
SyncSendDeleteData(sendId = sendId),
)
mutableSyncSendDeleteFlow.tryEmit(SyncSendDeleteData(userId = userId, sendId = sendId))
coVerify { vaultDiskSource.deleteSend(userId = userId, sendId = sendId) }
}