diff --git a/app/src/main/java/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSource.kt b/app/src/main/java/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSource.kt index 1b87afdf60..afbd42923e 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSource.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSource.kt @@ -8,6 +8,7 @@ import com.bitwarden.core.CollectionView import com.bitwarden.core.Folder import com.bitwarden.core.FolderView import com.bitwarden.core.InitOrgCryptoRequest +import com.bitwarden.core.InitUserCryptoMethod import com.bitwarden.core.InitUserCryptoRequest import com.bitwarden.core.PasswordHistory import com.bitwarden.core.PasswordHistoryView @@ -27,6 +28,15 @@ interface VaultSdkSource { */ fun clearCrypto(userId: String) + /** + * Gets the user's encryption key, which can be used to later unlock their vault via a call to + * [initializeCrypto] with [InitUserCryptoMethod.DecryptedKey]. + * + * This should only be called after a successful call to [initializeCrypto] for the associated + * user. + */ + suspend fun getUserEncryptionKey(userId: String): Result + /** * Attempts to initialize cryptography functionality for an individual user with the given * [userId] for the Bitwarden SDK with a given [InitUserCryptoRequest]. diff --git a/app/src/main/java/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceImpl.kt index 9d7634ee7c..2afefd95ed 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceImpl.kt @@ -31,6 +31,15 @@ class VaultSdkSourceImpl( sdkClientManager.destroyClient(userId = userId) } + override suspend fun getUserEncryptionKey( + userId: String, + ): Result = + runCatching { + getClient(userId = userId) + .crypto() + .getUserEncryptionKey() + } + override suspend fun initializeCrypto( userId: String, request: InitUserCryptoRequest, diff --git a/app/src/test/java/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceTest.kt index a97e73bbec..c9fd0896d3 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceTest.kt @@ -60,6 +60,25 @@ class VaultSdkSourceTest { verify { sdkClientManager.destroyClient(userId = userId) } } + @Test + fun `getUserEncryptionKey should call SDK and return a Result with correct data`() = + runBlocking { + val userId = "userId" + val expectedResult = "userEncryptionKey" + coEvery { + clientCrypto.getUserEncryptionKey() + } returns expectedResult + val result = vaultSdkSource.getUserEncryptionKey(userId = userId) + assertEquals( + expectedResult.asSuccess(), + result, + ) + coVerify { + clientCrypto.getUserEncryptionKey() + } + verify { sdkClientManager.getOrCreateClient(userId = userId) } + } + @Test fun `initializeUserCrypto with sdk success should return InitializeCryptoResult Success`() = runBlocking {