diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/PushManagerImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/PushManagerImpl.kt index a73bf51cba..177edd8d3a 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/PushManagerImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/PushManagerImpl.kt @@ -190,9 +190,14 @@ class PushManagerImpl @Inject constructor( .decodeFromString( string = notification.payload, ) - .takeIf { isLoggedIn(userId) && it.userMatchesNotification(userId) } - ?.cipherId - ?.let { mutableSyncCipherDeleteSharedFlow.tryEmit(SyncCipherDeleteData(it)) } + .takeIf { it.userId != null && it.cipherId != null } + ?.let { + SyncCipherDeleteData( + userId = requireNotNull(it.userId), + cipherId = requireNotNull(it.cipherId), + ) + } + ?.let { mutableSyncCipherDeleteSharedFlow.tryEmit(it) } } NotificationType.SYNC_CIPHERS, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/SyncCipherDeleteData.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/SyncCipherDeleteData.kt index 66531a6223..a6dab52017 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/SyncCipherDeleteData.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/SyncCipherDeleteData.kt @@ -2,9 +2,8 @@ package com.x8bit.bitwarden.data.platform.manager.model /** * Required data for sync cipher delete operations. - * - * @property cipherId The cipher ID. */ data class SyncCipherDeleteData( + val userId: String, val cipherId: String, ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt index 2ad983a869..76dd3d60c7 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt @@ -1248,12 +1248,9 @@ class VaultRepositoryImpl( * Deletes the cipher specified by [syncCipherDeleteData] from disk. */ private suspend fun deleteCipher(syncCipherDeleteData: SyncCipherDeleteData) { - val userId = activeUserId ?: return - - val cipherId = syncCipherDeleteData.cipherId vaultDiskSource.deleteCipher( - userId = userId, - cipherId = cipherId, + userId = syncCipherDeleteData.userId, + cipherId = syncCipherDeleteData.cipherId, ) } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/PushManagerTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/PushManagerTest.kt index 1a53a56052..94a7ef70a6 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/PushManagerTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/PushManagerTest.kt @@ -237,6 +237,7 @@ class PushManagerTest { pushManager.onMessageReceived(SYNC_CIPHER_DELETE_NOTIFICATION_MAP) assertEquals( SyncCipherDeleteData( + userId = "078966a2-93c2-4618-ae2a-0a2394c88d37", cipherId = "aab5cdcc-f4a7-4e65-bf6d-5e0eab052321", ), awaitItem(), @@ -316,6 +317,7 @@ class PushManagerTest { pushManager.onMessageReceived(SYNC_LOGIN_DELETE_NOTIFICATION_MAP) assertEquals( SyncCipherDeleteData( + userId = "078966a2-93c2-4618-ae2a-0a2394c88d37", cipherId = "aab5cdcc-f4a7-4e65-bf6d-5e0eab052321", ), awaitItem(), @@ -405,7 +407,13 @@ class PushManagerTest { fun `onMessageReceived with sync cipher delete does nothing`() = runTest { pushManager.syncCipherDeleteFlow.test { pushManager.onMessageReceived(SYNC_CIPHER_DELETE_NOTIFICATION_MAP) - expectNoEvents() + assertEquals( + SyncCipherDeleteData( + userId = "078966a2-93c2-4618-ae2a-0a2394c88d37", + cipherId = "aab5cdcc-f4a7-4e65-bf6d-5e0eab052321", + ), + awaitItem(), + ) } } @@ -449,12 +457,19 @@ class PushManagerTest { } @Test - fun `onMessageReceived with sync login delete does nothing`() = runTest { - pushManager.syncCipherDeleteFlow.test { - pushManager.onMessageReceived(SYNC_LOGIN_DELETE_NOTIFICATION_MAP) - expectNoEvents() + fun `onMessageReceived with sync login delete emits to syncCipherDeleteFlow`() = + runTest { + pushManager.syncCipherDeleteFlow.test { + pushManager.onMessageReceived(SYNC_LOGIN_DELETE_NOTIFICATION_MAP) + assertEquals( + SyncCipherDeleteData( + userId = "078966a2-93c2-4618-ae2a-0a2394c88d37", + cipherId = "aab5cdcc-f4a7-4e65-bf6d-5e0eab052321", + ), + awaitItem(), + ) + } } - } @Test fun `onMessageReceived with sync send create does nothing`() = runTest { diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt index 40bcf2d8b4..2fc25ae20a 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt @@ -3317,11 +3317,10 @@ class VaultRepositoryTest { val userId = "mockId-1" val cipherId = "mockId-1" - fakeAuthDiskSource.userState = MOCK_USER_STATE coEvery { vaultDiskSource.deleteCipher(userId = userId, cipherId = cipherId) } just runs mutableSyncCipherDeleteFlow.tryEmit( - SyncCipherDeleteData(cipherId = cipherId), + SyncCipherDeleteData(userId = userId, cipherId = cipherId), ) coVerify { vaultDiskSource.deleteCipher(userId = userId, cipherId = cipherId) }