[PM-20192] Migrate CiphersService to network module (#5052)

This commit is contained in:
Patrick Honkonen 2025-04-16 11:08:17 -04:00 committed by GitHub
parent 83de8b888d
commit 2d416eade5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 53 additions and 69 deletions

View File

@ -1,10 +1,10 @@
package com.x8bit.bitwarden.data.vault.datasource.network.di
import com.bitwarden.network.service.CiphersService
import com.bitwarden.network.service.CiphersServiceImpl
import com.bitwarden.network.service.FolderService
import com.bitwarden.network.service.FolderServiceImpl
import com.x8bit.bitwarden.data.platform.datasource.network.retrofit.Retrofits
import com.x8bit.bitwarden.data.vault.datasource.network.service.CiphersService
import com.x8bit.bitwarden.data.vault.datasource.network.service.CiphersServiceImpl
import com.x8bit.bitwarden.data.vault.datasource.network.service.DownloadService
import com.x8bit.bitwarden.data.vault.datasource.network.service.DownloadServiceImpl
import com.x8bit.bitwarden.data.vault.datasource.network.service.SendsService

View File

@ -9,6 +9,8 @@ import com.bitwarden.network.model.AttachmentJsonResponse
import com.bitwarden.network.model.CreateCipherInOrganizationJsonRequest
import com.bitwarden.network.model.ShareCipherJsonRequest
import com.bitwarden.network.model.UpdateCipherCollectionsJsonRequest
import com.bitwarden.network.model.UpdateCipherResponseJson
import com.bitwarden.network.service.CiphersService
import com.bitwarden.vault.AttachmentView
import com.bitwarden.vault.Cipher
import com.bitwarden.vault.CipherView
@ -16,8 +18,6 @@ import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource
import com.x8bit.bitwarden.data.platform.error.NoActiveUserException
import com.x8bit.bitwarden.data.platform.manager.ReviewPromptManager
import com.x8bit.bitwarden.data.vault.datasource.disk.VaultDiskSource
import com.x8bit.bitwarden.data.vault.datasource.network.model.UpdateCipherResponseJson
import com.x8bit.bitwarden.data.vault.datasource.network.service.CiphersService
import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource
import com.x8bit.bitwarden.data.vault.manager.model.DownloadResult
import com.x8bit.bitwarden.data.vault.repository.model.CreateAttachmentResult

View File

@ -2,6 +2,7 @@ package com.x8bit.bitwarden.data.vault.manager.di
import android.content.Context
import com.bitwarden.data.manager.DispatcherManager
import com.bitwarden.network.service.CiphersService
import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource
import com.x8bit.bitwarden.data.auth.datasource.sdk.AuthSdkSource
import com.x8bit.bitwarden.data.auth.manager.TrustedDeviceManager
@ -10,7 +11,6 @@ import com.x8bit.bitwarden.data.platform.manager.AppStateManager
import com.x8bit.bitwarden.data.platform.manager.ReviewPromptManager
import com.x8bit.bitwarden.data.platform.repository.SettingsRepository
import com.x8bit.bitwarden.data.vault.datasource.disk.VaultDiskSource
import com.x8bit.bitwarden.data.vault.datasource.network.service.CiphersService
import com.x8bit.bitwarden.data.vault.datasource.network.service.DownloadService
import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource
import com.x8bit.bitwarden.data.vault.manager.CipherManager

View File

@ -18,6 +18,7 @@ import com.bitwarden.exporters.ExportFormat
import com.bitwarden.fido.Fido2CredentialAutofillView
import com.bitwarden.network.model.SyncResponseJson
import com.bitwarden.network.model.UpdateFolderResponseJson
import com.bitwarden.network.service.CiphersService
import com.bitwarden.network.service.FolderService
import com.bitwarden.network.util.isNoConnectionError
import com.bitwarden.sdk.Fido2CredentialStore
@ -52,7 +53,6 @@ import com.x8bit.bitwarden.data.vault.datasource.disk.VaultDiskSource
import com.x8bit.bitwarden.data.vault.datasource.network.model.CreateFileSendResponse
import com.x8bit.bitwarden.data.vault.datasource.network.model.CreateSendJsonResponse
import com.x8bit.bitwarden.data.vault.datasource.network.model.UpdateSendResponseJson
import com.x8bit.bitwarden.data.vault.datasource.network.service.CiphersService
import com.x8bit.bitwarden.data.vault.datasource.network.service.SendsService
import com.x8bit.bitwarden.data.vault.datasource.network.service.SyncService
import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource

View File

@ -1,6 +1,7 @@
package com.x8bit.bitwarden.data.vault.repository.di
import com.bitwarden.data.manager.DispatcherManager
import com.bitwarden.network.service.CiphersService
import com.bitwarden.network.service.FolderService
import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource
import com.x8bit.bitwarden.data.auth.manager.UserLogoutManager
@ -9,7 +10,6 @@ import com.x8bit.bitwarden.data.platform.manager.DatabaseSchemeManager
import com.x8bit.bitwarden.data.platform.manager.PushManager
import com.x8bit.bitwarden.data.platform.manager.ReviewPromptManager
import com.x8bit.bitwarden.data.vault.datasource.disk.VaultDiskSource
import com.x8bit.bitwarden.data.vault.datasource.network.service.CiphersService
import com.x8bit.bitwarden.data.vault.datasource.network.service.SendsService
import com.x8bit.bitwarden.data.vault.datasource.network.service.SyncService
import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource

View File

@ -9,11 +9,13 @@ import com.bitwarden.network.model.CreateCipherInOrganizationJsonRequest
import com.bitwarden.network.model.ShareCipherJsonRequest
import com.bitwarden.network.model.SyncResponseJson
import com.bitwarden.network.model.UpdateCipherCollectionsJsonRequest
import com.bitwarden.network.model.UpdateCipherResponseJson
import com.bitwarden.network.model.createMockAttachment
import com.bitwarden.network.model.createMockAttachmentJsonResponse
import com.bitwarden.network.model.createMockAttachmentResponse
import com.bitwarden.network.model.createMockCipher
import com.bitwarden.network.model.createMockCipherJsonRequest
import com.bitwarden.network.service.CiphersService
import com.bitwarden.vault.Attachment
import com.bitwarden.vault.AttachmentView
import com.bitwarden.vault.Cipher
@ -24,8 +26,6 @@ import com.x8bit.bitwarden.data.auth.datasource.disk.util.FakeAuthDiskSource
import com.x8bit.bitwarden.data.platform.error.NoActiveUserException
import com.x8bit.bitwarden.data.platform.manager.ReviewPromptManager
import com.x8bit.bitwarden.data.vault.datasource.disk.VaultDiskSource
import com.x8bit.bitwarden.data.vault.datasource.network.model.UpdateCipherResponseJson
import com.x8bit.bitwarden.data.vault.datasource.network.service.CiphersService
import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockAttachmentView
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherView

View File

@ -31,6 +31,7 @@ import com.bitwarden.network.model.createMockProfile
import com.bitwarden.network.model.createMockSend
import com.bitwarden.network.model.createMockSendJsonRequest
import com.bitwarden.network.model.createMockSyncResponse
import com.bitwarden.network.service.CiphersService
import com.bitwarden.network.service.FolderService
import com.bitwarden.sdk.Fido2CredentialStore
import com.bitwarden.send.SendType
@ -63,7 +64,6 @@ import com.x8bit.bitwarden.data.vault.datasource.disk.VaultDiskSource
import com.x8bit.bitwarden.data.vault.datasource.network.model.CreateFileSendResponse
import com.x8bit.bitwarden.data.vault.datasource.network.model.CreateSendJsonResponse
import com.x8bit.bitwarden.data.vault.datasource.network.model.UpdateSendResponseJson
import com.x8bit.bitwarden.data.vault.datasource.network.service.CiphersService
import com.x8bit.bitwarden.data.vault.datasource.network.service.SendsService
import com.x8bit.bitwarden.data.vault.datasource.network.service.SyncService
import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource

View File

@ -0,0 +1,14 @@
package com.bitwarden.network.model
/**
* Information about a cipher attachment to share.
*
* @property id The attachment's ID.
* @property key The attachment's encrypted key value.
* @property fileName The attachment's encrypted file name.
*/
data class AttachmentInfo(
val id: String,
val key: String,
val fileName: String?,
)

View File

@ -1,4 +1,4 @@
package com.x8bit.bitwarden.data.vault.datasource.network.model
package com.bitwarden.network.model
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

View File

@ -1,6 +1,5 @@
package com.x8bit.bitwarden.data.vault.datasource.network.model
package com.bitwarden.network.model
import com.bitwarden.network.model.SyncResponseJson
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

View File

@ -1,16 +1,16 @@
package com.x8bit.bitwarden.data.vault.datasource.network.service
package com.bitwarden.network.service
import com.bitwarden.network.model.AttachmentInfo
import com.bitwarden.network.model.AttachmentJsonRequest
import com.bitwarden.network.model.AttachmentJsonResponse
import com.bitwarden.network.model.CipherJsonRequest
import com.bitwarden.network.model.CreateCipherInOrganizationJsonRequest
import com.bitwarden.network.model.ImportCiphersJsonRequest
import com.bitwarden.network.model.ImportCiphersResponseJson
import com.bitwarden.network.model.ShareCipherJsonRequest
import com.bitwarden.network.model.SyncResponseJson
import com.bitwarden.network.model.UpdateCipherCollectionsJsonRequest
import com.bitwarden.vault.Attachment
import com.x8bit.bitwarden.data.vault.datasource.network.model.ImportCiphersResponseJson
import com.x8bit.bitwarden.data.vault.datasource.network.model.UpdateCipherResponseJson
import com.bitwarden.network.model.UpdateCipherResponseJson
import java.io.File
/**
@ -67,7 +67,7 @@ interface CiphersService {
*/
suspend fun shareAttachment(
cipherId: String,
attachment: Attachment,
attachment: AttachmentInfo,
organizationId: String,
encryptedFile: File,
): Result<Unit>

View File

@ -1,25 +1,24 @@
package com.x8bit.bitwarden.data.vault.datasource.network.service
package com.bitwarden.network.service
import androidx.core.net.toUri
import com.bitwarden.core.data.util.asFailure
import com.bitwarden.network.api.AzureApi
import com.bitwarden.network.api.CiphersApi
import com.bitwarden.network.model.AttachmentInfo
import com.bitwarden.network.model.AttachmentJsonRequest
import com.bitwarden.network.model.AttachmentJsonResponse
import com.bitwarden.network.model.CipherJsonRequest
import com.bitwarden.network.model.CreateCipherInOrganizationJsonRequest
import com.bitwarden.network.model.FileUploadType
import com.bitwarden.network.model.ImportCiphersJsonRequest
import com.bitwarden.network.model.ImportCiphersResponseJson
import com.bitwarden.network.model.ShareCipherJsonRequest
import com.bitwarden.network.model.SyncResponseJson
import com.bitwarden.network.model.UpdateCipherCollectionsJsonRequest
import com.bitwarden.network.model.UpdateCipherResponseJson
import com.bitwarden.network.model.toBitwardenError
import com.bitwarden.network.util.NetworkErrorCode
import com.bitwarden.network.util.parseErrorBodyOrNull
import com.bitwarden.network.util.toResult
import com.bitwarden.vault.Attachment
import com.x8bit.bitwarden.data.vault.datasource.network.model.ImportCiphersResponseJson
import com.x8bit.bitwarden.data.vault.datasource.network.model.UpdateCipherResponseJson
import kotlinx.serialization.json.Json
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.MultipartBody
@ -127,18 +126,14 @@ class CiphersServiceImpl(
override suspend fun shareAttachment(
cipherId: String,
attachment: Attachment,
attachment: AttachmentInfo,
organizationId: String,
encryptedFile: File,
): Result<Unit> {
val attachmentId = attachment.id
?: return IllegalStateException("Attachment must have ID").asFailure()
val attachmentKey = attachment.key
?: return IllegalStateException("Attachment must have Key").asFailure()
return ciphersApi
.shareAttachment(
cipherId = cipherId,
attachmentId = attachmentId,
attachmentId = attachment.id,
organizationId = organizationId,
body = this
.createMultipartBodyBuilder(
@ -148,7 +143,7 @@ class CiphersServiceImpl(
.addPart(
part = MultipartBody.Part.createFormData(
name = "key",
value = attachmentKey,
value = attachment.key,
),
)
.build(),

View File

@ -0,0 +1,10 @@
package com.bitwarden.network.model
/**
* Creates a mock [AttachmentInfo] with the given [number].
*/
fun createMockAttachmentInfo(number: Int = 1): AttachmentInfo = AttachmentInfo(
id = "mockId-$number",
key = "mockKey-$number",
fileName = "mockFileName-$number",
)

View File

@ -1,4 +1,4 @@
package com.x8bit.bitwarden.data.vault.datasource.network.service
package com.bitwarden.network.service
import android.net.Uri
import com.bitwarden.network.api.AzureApi
@ -8,17 +8,17 @@ import com.bitwarden.network.model.AttachmentJsonResponse
import com.bitwarden.network.model.CreateCipherInOrganizationJsonRequest
import com.bitwarden.network.model.FileUploadType
import com.bitwarden.network.model.ImportCiphersJsonRequest
import com.bitwarden.network.model.ImportCiphersResponseJson
import com.bitwarden.network.model.ShareCipherJsonRequest
import com.bitwarden.network.model.UpdateCipherCollectionsJsonRequest
import com.bitwarden.network.model.UpdateCipherResponseJson
import com.bitwarden.network.model.createMockAttachment
import com.bitwarden.network.model.createMockAttachmentInfo
import com.bitwarden.network.model.createMockAttachmentJsonRequest
import com.bitwarden.network.model.createMockAttachmentJsonResponse
import com.bitwarden.network.model.createMockAttachmentResponse
import com.bitwarden.network.model.createMockCipher
import com.bitwarden.network.model.createMockCipherJsonRequest
import com.x8bit.bitwarden.data.vault.datasource.network.model.ImportCiphersResponseJson
import com.x8bit.bitwarden.data.vault.datasource.network.model.UpdateCipherResponseJson
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockSdkAttachment
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkStatic
@ -216,46 +216,12 @@ class CiphersServiceTest : BaseServiceTest() {
assertEquals(Unit, result.getOrThrow())
}
@Test
fun `shareAttachment without attachment ID should return an error`() = runTest {
val cipherId = "cipherId"
val organizationId = "organizationId"
val attachment = createMockSdkAttachment(number = 1).copy(id = null)
val encryptedFile = File.createTempFile("mockFile", "temp")
val result = ciphersService.shareAttachment(
cipherId = cipherId,
attachment = attachment,
organizationId = organizationId,
encryptedFile = encryptedFile,
)
assertTrue(result.isFailure)
}
@Test
fun `shareAttachment without attachment key should return an error`() = runTest {
val cipherId = "cipherId"
val organizationId = "organizationId"
val attachment = createMockSdkAttachment(number = 1, key = null)
val encryptedFile = File.createTempFile("mockFile", "temp")
val result = ciphersService.shareAttachment(
cipherId = cipherId,
attachment = attachment,
organizationId = organizationId,
encryptedFile = encryptedFile,
)
assertTrue(result.isFailure)
}
@Test
fun `shareAttachment should execute the share attachment API`() = runTest {
server.enqueue(MockResponse().setResponseCode(200))
val cipherId = "cipherId"
val organizationId = "organizationId"
val attachment = createMockSdkAttachment(number = 1)
val attachment = createMockAttachmentInfo(number = 1)
val encryptedFile = File.createTempFile("mockFile", "temp")
val result = ciphersService.shareAttachment(