diff --git a/app/src/main/java/com/x8bit/bitwarden/data/auth/datasource/network/api/AuthenticatedAccountsApi.kt b/app/src/main/java/com/x8bit/bitwarden/data/auth/datasource/network/api/AuthenticatedAccountsApi.kt index c323e8643..44c3df6a0 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/auth/datasource/network/api/AuthenticatedAccountsApi.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/auth/datasource/network/api/AuthenticatedAccountsApi.kt @@ -1,5 +1,6 @@ package com.x8bit.bitwarden.data.auth.datasource.network.api +import com.x8bit.bitwarden.data.auth.datasource.network.model.CreateAccountKeysRequest import com.x8bit.bitwarden.data.auth.datasource.network.model.DeleteAccountRequestJson import com.x8bit.bitwarden.data.auth.datasource.network.model.ResetPasswordRequestJson import com.x8bit.bitwarden.data.auth.datasource.network.model.SetPasswordRequestJson @@ -11,6 +12,12 @@ import retrofit2.http.POST * Defines raw calls under the /accounts API with authentication applied. */ interface AuthenticatedAccountsApi { + /** + * Creates the keys for the current account. + */ + @POST("/accounts/keys") + suspend fun createAccountKeys(@Body body: CreateAccountKeysRequest): Result + /** * Deletes the current account. */ diff --git a/app/src/main/java/com/x8bit/bitwarden/data/auth/datasource/network/model/CreateAccountKeysRequest.kt b/app/src/main/java/com/x8bit/bitwarden/data/auth/datasource/network/model/CreateAccountKeysRequest.kt new file mode 100644 index 000000000..ace528eda --- /dev/null +++ b/app/src/main/java/com/x8bit/bitwarden/data/auth/datasource/network/model/CreateAccountKeysRequest.kt @@ -0,0 +1,13 @@ +package com.x8bit.bitwarden.data.auth.datasource.network.model + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Represents the request body used to create the keys for an account. + */ +@Serializable +data class CreateAccountKeysRequest( + @SerialName("PublicKey") val publicKey: String, + @SerialName("EncryptedPrivateKey") val encryptedPrivateKey: String, +) diff --git a/app/src/main/java/com/x8bit/bitwarden/data/auth/datasource/network/service/AccountsService.kt b/app/src/main/java/com/x8bit/bitwarden/data/auth/datasource/network/service/AccountsService.kt index 3b9050860..03ab93c40 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/auth/datasource/network/service/AccountsService.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/auth/datasource/network/service/AccountsService.kt @@ -13,6 +13,11 @@ import com.x8bit.bitwarden.data.auth.datasource.network.model.SetPasswordRequest */ interface AccountsService { + /** + * Creates a new account's keys. + */ + suspend fun createAccountKeys(publicKey: String, encryptedPrivateKey: String): Result + /** * Make delete account request. */ diff --git a/app/src/main/java/com/x8bit/bitwarden/data/auth/datasource/network/service/AccountsServiceImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/auth/datasource/network/service/AccountsServiceImpl.kt index 7d29be97e..bfc4d9bd1 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/auth/datasource/network/service/AccountsServiceImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/auth/datasource/network/service/AccountsServiceImpl.kt @@ -2,6 +2,7 @@ package com.x8bit.bitwarden.data.auth.datasource.network.service import com.x8bit.bitwarden.data.auth.datasource.network.api.AccountsApi import com.x8bit.bitwarden.data.auth.datasource.network.api.AuthenticatedAccountsApi +import com.x8bit.bitwarden.data.auth.datasource.network.model.CreateAccountKeysRequest import com.x8bit.bitwarden.data.auth.datasource.network.model.DeleteAccountRequestJson import com.x8bit.bitwarden.data.auth.datasource.network.model.PasswordHintRequestJson import com.x8bit.bitwarden.data.auth.datasource.network.model.PasswordHintResponseJson @@ -22,6 +23,17 @@ class AccountsServiceImpl( private val json: Json, ) : AccountsService { + override suspend fun createAccountKeys( + publicKey: String, + encryptedPrivateKey: String, + ): Result = + authenticatedAccountsApi.createAccountKeys( + body = CreateAccountKeysRequest( + publicKey = publicKey, + encryptedPrivateKey = encryptedPrivateKey, + ), + ) + override suspend fun deleteAccount(masterPasswordHash: String): Result = authenticatedAccountsApi.deleteAccount(DeleteAccountRequestJson(masterPasswordHash)) diff --git a/app/src/test/java/com/x8bit/bitwarden/data/auth/datasource/network/service/AccountsServiceTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/auth/datasource/network/service/AccountsServiceTest.kt index cfa7496d3..ca4d8cfce 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/auth/datasource/network/service/AccountsServiceTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/auth/datasource/network/service/AccountsServiceTest.kt @@ -32,6 +32,22 @@ class AccountsServiceTest : BaseServiceTest() { }, ) + @Test + fun `createAccountKeys with empty response is success`() = runTest { + val publicKey = "publicKey" + val encryptedPrivateKey = "encryptedPrivateKey" + val json = "" + val response = MockResponse().setBody(json) + server.enqueue(response) + + val result = service.createAccountKeys( + publicKey = publicKey, + encryptedPrivateKey = encryptedPrivateKey, + ) + + assertTrue(result.isSuccess) + } + @Test fun `deleteAccount with empty response is success`() = runTest { val masterPasswordHash = "37y4d8r379r4789nt387r39k3dr87nr93"