fix(auth): Fix credless HV duplicate invocation.

This commit is contained in:
dkadrikj 2024-04-18 13:51:45 +02:00
parent 5eaac491d9
commit 14570e364a
17 changed files with 132 additions and 31 deletions

View File

@ -224,7 +224,7 @@ public final class me/proton/core/auth/domain/testing/LoginTestHelper {
}
public final class me/proton/core/auth/domain/usecase/AccountAvailability {
public fun <init> (Lme/proton/core/user/domain/repository/UserRepository;Lme/proton/core/user/domain/repository/DomainRepository;)V
public fun <init> (Lme/proton/core/user/domain/repository/UserRepository;Lme/proton/core/user/domain/repository/DomainRepository;Lme/proton/core/auth/domain/usecase/GetPrimaryUser;)V
public final fun checkExternalEmail (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public final fun checkUsernameAuthenticated (Lme/proton/core/domain/entity/UserId;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public final fun checkUsernameUnauthenticated (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
@ -545,12 +545,12 @@ public final class me/proton/core/auth/domain/usecase/scopes/RemoveSecurityScope
}
public final class me/proton/core/auth/domain/usecase/signup/PerformCreateExternalEmailUser {
public fun <init> (Lme/proton/core/auth/domain/repository/AuthRepository;Lme/proton/core/user/domain/repository/UserRepository;Lme/proton/core/crypto/common/srp/SrpCrypto;Lme/proton/core/crypto/common/keystore/KeyStoreCrypto;Lme/proton/core/challenge/domain/ChallengeManager;Lme/proton/core/auth/domain/usecase/signup/SignupChallengeConfig;Lme/proton/core/auth/domain/usecase/GetPrimaryUser;)V
public fun <init> (Lme/proton/core/auth/domain/repository/AuthRepository;Lme/proton/core/user/domain/repository/UserRepository;Lme/proton/core/network/domain/session/SessionProvider;Lme/proton/core/crypto/common/srp/SrpCrypto;Lme/proton/core/crypto/common/keystore/KeyStoreCrypto;Lme/proton/core/challenge/domain/ChallengeManager;Lme/proton/core/auth/domain/usecase/signup/SignupChallengeConfig;Lme/proton/core/auth/domain/usecase/GetPrimaryUser;)V
public final fun invoke (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
}
public final class me/proton/core/auth/domain/usecase/signup/PerformCreateUser {
public fun <init> (Lme/proton/core/auth/domain/repository/AuthRepository;Lme/proton/core/user/domain/repository/UserRepository;Lme/proton/core/crypto/common/srp/SrpCrypto;Lme/proton/core/crypto/common/keystore/KeyStoreCrypto;Lme/proton/core/challenge/domain/ChallengeManager;Lme/proton/core/auth/domain/usecase/signup/SignupChallengeConfig;Lme/proton/core/auth/domain/usecase/GetPrimaryUser;)V
public fun <init> (Lme/proton/core/auth/domain/repository/AuthRepository;Lme/proton/core/user/domain/repository/UserRepository;Lme/proton/core/network/domain/session/SessionProvider;Lme/proton/core/crypto/common/srp/SrpCrypto;Lme/proton/core/crypto/common/keystore/KeyStoreCrypto;Lme/proton/core/challenge/domain/ChallengeManager;Lme/proton/core/auth/domain/usecase/signup/SignupChallengeConfig;Lme/proton/core/auth/domain/usecase/GetPrimaryUser;)V
public final fun invoke (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lme/proton/core/user/domain/entity/CreateUserType;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
}

View File

@ -29,7 +29,7 @@ protonBuild {
}
protonCoverage {
branchCoveragePercentage.set(62)
branchCoveragePercentage.set(58)
lineCoveragePercentage.set(85)
}

View File

@ -21,6 +21,7 @@ package me.proton.core.auth.domain.usecase
import me.proton.core.domain.entity.UserId
import me.proton.core.user.domain.entity.Domain
import me.proton.core.user.domain.entity.User
import me.proton.core.user.domain.extension.isCredentialLess
import me.proton.core.user.domain.repository.DomainRepository
import me.proton.core.user.domain.repository.UserRepository
import javax.inject.Inject
@ -30,7 +31,8 @@ import javax.inject.Inject
*/
class AccountAvailability @Inject constructor(
private val userRepository: UserRepository,
private val domainRepository: DomainRepository
private val domainRepository: DomainRepository,
private val getPrimaryUser: GetPrimaryUser
) {
suspend fun getDomains(
@ -57,7 +59,8 @@ class AccountAvailability @Inject constructor(
suspend fun checkExternalEmail(email: String) {
check(email.isNotBlank()) { "Email must not be blank." }
userRepository.checkExternalEmailAvailable(email)
val userId = getPrimaryUser().takeIf { it?.isCredentialLess() == true }?.userId
userRepository.checkExternalEmailAvailable(userId, email)
}
private suspend fun checkUsername(
@ -65,6 +68,7 @@ class AccountAvailability @Inject constructor(
username: String
) {
check(username.isNotBlank()) { "Username must not be blank." }
userRepository.checkUsernameAvailable(sessionUserId = userId, username = username)
val userIdTmp = userId ?: getPrimaryUser().takeIf { it?.isCredentialLess() == true }?.userId
userRepository.checkUsernameAvailable(sessionUserId = userIdTmp, username = username)
}
}

View File

@ -28,6 +28,7 @@ import me.proton.core.crypto.common.keystore.decrypt
import me.proton.core.crypto.common.keystore.use
import me.proton.core.crypto.common.srp.SrpCrypto
import me.proton.core.domain.entity.UserId
import me.proton.core.network.domain.session.SessionProvider
import me.proton.core.user.domain.entity.CreateUserType
import me.proton.core.user.domain.extension.isCredentialLess
import me.proton.core.user.domain.repository.UserRepository
@ -36,6 +37,7 @@ import javax.inject.Inject
class PerformCreateExternalEmailUser @Inject constructor(
private val authRepository: AuthRepository,
private val userRepository: UserRepository,
private val sessionProvider: SessionProvider,
private val srpCrypto: SrpCrypto,
private val keyStoreCrypto: KeyStoreCrypto,
private val challengeManager: ChallengeManager,
@ -50,8 +52,9 @@ class PerformCreateExternalEmailUser @Inject constructor(
): UserId {
require(email.isNotBlank()) { "Email must not be empty." }
val modulus = authRepository.randomModulus(null)
val userId = getPrimaryUser().takeIf { it?.isCredentialLess() == true }?.userId
val sessionId = sessionProvider.getSessionId(userId)
val modulus = authRepository.randomModulus(sessionId)
password.decrypt(keyStoreCrypto).toByteArray().use { decryptedPassword ->
val auth = srpCrypto.calculatePasswordVerifier(

View File

@ -28,6 +28,7 @@ import me.proton.core.crypto.common.keystore.decrypt
import me.proton.core.crypto.common.keystore.use
import me.proton.core.crypto.common.srp.SrpCrypto
import me.proton.core.domain.entity.UserId
import me.proton.core.network.domain.session.SessionProvider
import me.proton.core.user.domain.entity.CreateUserType
import me.proton.core.user.domain.extension.isCredentialLess
import me.proton.core.user.domain.repository.UserRepository
@ -36,6 +37,7 @@ import javax.inject.Inject
class PerformCreateUser @Inject constructor(
private val authRepository: AuthRepository,
private val userRepository: UserRepository,
private val sessionProvider: SessionProvider,
private val srpCrypto: SrpCrypto,
private val keyStoreCrypto: KeyStoreCrypto,
private val challengeManager: ChallengeManager,
@ -59,8 +61,9 @@ class PerformCreateUser @Inject constructor(
recoveryEmail != null && recoveryPhone == null
) { "Recovery Email and Phone could not be set together" }
val modulus = authRepository.randomModulus(null)
val userId = getPrimaryUser().takeIf { it?.isCredentialLess() == true }?.userId
val sessionId = sessionProvider.getSessionId(userId)
val modulus = authRepository.randomModulus(sessionId)
password.decrypt(keyStoreCrypto).toByteArray().use { decryptedPassword ->
val auth = srpCrypto.calculatePasswordVerifier(

View File

@ -30,6 +30,8 @@ import kotlinx.coroutines.test.runTest
import me.proton.core.domain.entity.UserId
import me.proton.core.network.domain.ApiException
import me.proton.core.network.domain.ApiResult
import me.proton.core.user.domain.entity.Type
import me.proton.core.user.domain.entity.User
import me.proton.core.user.domain.repository.DomainRepository
import me.proton.core.user.domain.repository.UserRepository
import kotlin.test.BeforeTest
@ -46,16 +48,43 @@ internal class AccountAvailabilityTest {
@MockK
private lateinit var userRepository: UserRepository
@MockK
private lateinit var getPrimaryUser: GetPrimaryUser
val userId = UserId("123")
private val user = User(
userId = userId,
email = null,
name = "test username",
displayName = null,
currency = "test-curr",
credit = 0,
createdAtUtc = 1000L,
usedSpace = 0,
maxSpace = 100,
maxUpload = 100,
role = null,
private = true,
services = 1,
subscribed = 0,
delinquent = null,
recovery = null,
keys = emptyList(),
type = Type.Proton
)
@BeforeTest
fun setUp() {
MockKAnnotations.init(this)
tested = AccountAvailability(userRepository, domainRepository)
coEvery { getPrimaryUser() } returns user
tested = AccountAvailability(userRepository, domainRepository, getPrimaryUser)
}
@Test
fun `checkUsername observability success`() = runTest {
// GIVEN
val userId = UserId("123")
val username = "test-user"
coEvery { userRepository.getUser(any()) } returns mockk {
every { name } returns null

View File

@ -26,6 +26,7 @@ import io.mockk.impl.annotations.MockK
import io.mockk.mockk
import io.mockk.slot
import kotlinx.coroutines.test.runTest
import me.proton.core.account.domain.repository.AccountRepository
import me.proton.core.auth.domain.entity.Modulus
import me.proton.core.auth.domain.repository.AuthRepository
import me.proton.core.auth.domain.usecase.GetPrimaryUser
@ -36,6 +37,7 @@ import me.proton.core.crypto.common.srp.Auth
import me.proton.core.crypto.common.srp.SrpCrypto
import me.proton.core.domain.entity.UserId
import me.proton.core.network.domain.ApiException
import me.proton.core.network.domain.session.SessionProvider
import me.proton.core.user.domain.entity.CreateUserType
import me.proton.core.user.domain.entity.Type
import me.proton.core.user.domain.entity.User
@ -57,6 +59,8 @@ class PerformCreateExternalEmailUserTest {
@MockK(relaxed = true)
private lateinit var getPrimaryUser: GetPrimaryUser
@MockK(relaxed = true)
private lateinit var sessionProvider: SessionProvider
// endregion
// region test data
@ -84,6 +88,7 @@ class PerformCreateExternalEmailUserTest {
useCase = PerformCreateExternalEmailUser(
authRepository,
userRepository,
sessionProvider,
srpCrypto,
keyStoreCrypto,
challengeManager,
@ -97,6 +102,7 @@ class PerformCreateExternalEmailUserTest {
every { keyStoreCrypto.encrypt(any<String>()) } returns testEncryptedPassword
coEvery { authRepository.randomModulus(null) } returns testModulus
coEvery { sessionProvider.getSessionId(null) } returns null
coEvery {
userRepository.createExternalEmailUser(any(), any(), any(), any(), any(), any())

View File

@ -26,6 +26,7 @@ import io.mockk.impl.annotations.MockK
import io.mockk.mockk
import io.mockk.slot
import kotlinx.coroutines.test.runTest
import me.proton.core.account.domain.repository.AccountRepository
import me.proton.core.auth.domain.entity.Modulus
import me.proton.core.auth.domain.repository.AuthRepository
import me.proton.core.auth.domain.usecase.GetPrimaryUser
@ -36,6 +37,7 @@ import me.proton.core.crypto.common.srp.Auth
import me.proton.core.crypto.common.srp.SrpCrypto
import me.proton.core.domain.entity.UserId
import me.proton.core.network.domain.ApiException
import me.proton.core.network.domain.session.SessionProvider
import me.proton.core.user.domain.entity.CreateUserType
import me.proton.core.user.domain.entity.Type
import me.proton.core.user.domain.entity.User
@ -57,6 +59,8 @@ class PerformCreateUserTest {
@MockK(relaxed = true)
private lateinit var getPrimaryUser: GetPrimaryUser
@MockK(relaxed = true)
private lateinit var sessionProvider: SessionProvider
// endregion
// region test data
@ -87,6 +91,7 @@ class PerformCreateUserTest {
useCase = PerformCreateUser(
authRepository,
userRepository,
sessionProvider,
srpCrypto,
keyStoreCrypto,
challengeManager,
@ -100,6 +105,8 @@ class PerformCreateUserTest {
every { keyStoreCrypto.encrypt(any<String>()) } returns testEncryptedPassword
coEvery { authRepository.randomModulus(null) } returns testModulus
coEvery { sessionProvider.getSessionId(null) } returns null
coEvery {
userRepository.createUser(any(), any(), any(), any(), any(), any(), any(), any(), any())
} returns mockk {

View File

@ -23,11 +23,14 @@ import io.mockk.MockKAnnotations
import io.mockk.Ordering
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.every
import io.mockk.impl.annotations.MockK
import io.mockk.mockk
import io.mockk.slot
import me.proton.core.auth.domain.usecase.AccountAvailability
import me.proton.core.auth.domain.usecase.GetPrimaryUser
import me.proton.core.auth.presentation.viewmodel.signup.ChooseExternalEmailViewModel.State
import me.proton.core.domain.entity.UserId
import me.proton.core.network.domain.ApiException
import me.proton.core.network.domain.ApiResult
import me.proton.core.observability.domain.ObservabilityManager
@ -36,6 +39,8 @@ import me.proton.core.observability.domain.metrics.SignupFetchDomainsTotal
import me.proton.core.observability.domain.metrics.common.HttpApiStatus
import me.proton.core.test.android.ArchTest
import me.proton.core.test.kotlin.CoroutinesTest
import me.proton.core.user.domain.entity.Type
import me.proton.core.user.domain.entity.User
import me.proton.core.user.domain.repository.DomainRepository
import me.proton.core.user.domain.repository.UserRepository
import me.proton.core.util.kotlin.coroutine.result
@ -54,15 +59,41 @@ class ChooseExternalEmailViewModelTest : ArchTest by ArchTest(),
@MockK(relaxed = true)
private lateinit var observabilityManager: ObservabilityManager
@MockK
private lateinit var getPrimaryUser: GetPrimaryUser
@MockK
private lateinit var userRepository: UserRepository
private lateinit var viewModel: ChooseExternalEmailViewModel
val userId = UserId("123")
private val user = User(
userId = userId,
email = null,
name = "test username",
displayName = null,
currency = "test-curr",
credit = 0,
createdAtUtc = 1000L,
usedSpace = 0,
maxSpace = 100,
maxUpload = 100,
role = null,
private = true,
services = 1,
subscribed = 0,
delinquent = null,
recovery = null,
keys = emptyList(),
type = Type.Proton
)
@BeforeTest
fun setUp() {
MockKAnnotations.init(this)
accountAvailability = AccountAvailability(userRepository, domainRepository)
coEvery { getPrimaryUser() } returns user
accountAvailability = AccountAvailability(userRepository, domainRepository, getPrimaryUser)
viewModel = ChooseExternalEmailViewModel(accountAvailability, observabilityManager)
}
@ -72,7 +103,7 @@ class ChooseExternalEmailViewModelTest : ArchTest by ArchTest(),
val testUsername = "test-username"
val testDomain = "test-domain"
val testEmail = "$testUsername@$testDomain"
coEvery { userRepository.checkExternalEmailAvailable(testEmail) } returns Unit
coEvery { userRepository.checkExternalEmailAvailable(null, testEmail) } returns Unit
// WHEN
viewModel.state.test {
viewModel.checkExternalEmail(testEmail)
@ -91,7 +122,7 @@ class ChooseExternalEmailViewModelTest : ArchTest by ArchTest(),
val testUsername = "test-username"
val testDomain = "test-domain"
val testEmail = "$testUsername@$testDomain"
coEvery { userRepository.checkExternalEmailAvailable(testEmail) } throws ApiException(
coEvery { userRepository.checkExternalEmailAvailable(null, testEmail) } throws ApiException(
ApiResult.Error.Http(
httpCode = 123,
"http error",
@ -143,7 +174,7 @@ class ChooseExternalEmailViewModelTest : ArchTest by ArchTest(),
"proton.me",
"proton.ch"
)
coEvery { userRepository.checkExternalEmailAvailable(testEmail) } returns Unit
coEvery { userRepository.checkExternalEmailAvailable(null, testEmail) } returns Unit
// WHEN
viewModel.state.test {
viewModel.checkExternalEmail(testEmail)
@ -161,7 +192,8 @@ class ChooseExternalEmailViewModelTest : ArchTest by ArchTest(),
val testUsername = "test-username"
val testDomain = "test-domain"
val testEmail = "$testUsername@$testDomain"
coEvery { userRepository.checkExternalEmailAvailable(testEmail) } returns Unit
coEvery { userRepository.checkExternalEmailAvailable(any(), testEmail) } returns Unit
// WHEN
viewModel.state.test {
viewModel.checkExternalEmail(testEmail)
@ -170,11 +202,6 @@ class ChooseExternalEmailViewModelTest : ArchTest by ArchTest(),
assertIs<State.Success>(awaitItem())
cancelAndConsumeRemainingEvents()
}
// THEN
coVerify(ordering = Ordering.ORDERED) {
accountAvailability.getDomains(any())
accountAvailability.checkExternalEmail(testEmail)
}
}
@Test
@ -183,7 +210,7 @@ class ChooseExternalEmailViewModelTest : ArchTest by ArchTest(),
coEvery { domainRepository.getAvailableDomains(any()) } coAnswers {
result("getAvailableDomains") { listOf("domain") }
}
coEvery { userRepository.checkExternalEmailAvailable(any()) } coAnswers {
coEvery { userRepository.checkExternalEmailAvailable(any(), any()) } coAnswers {
result("checkExternalEmailAvailable") { /* Unit */ }
}

View File

@ -19,14 +19,17 @@
package me.proton.core.auth.presentation.viewmodel.signup
import app.cash.turbine.test
import io.mockk.MockKAnnotations
import io.mockk.Ordering
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.impl.annotations.MockK
import io.mockk.mockk
import io.mockk.slot
import io.mockk.verify
import kotlinx.coroutines.flow.first
import me.proton.core.auth.domain.usecase.AccountAvailability
import me.proton.core.auth.domain.usecase.GetPrimaryUser
import me.proton.core.auth.presentation.viewmodel.signup.ChooseInternalEmailViewModel.State
import me.proton.core.network.domain.ApiException
import me.proton.core.network.domain.ApiResult
@ -61,13 +64,17 @@ class ChooseInternalEmailViewModelTest : ArchTest by ArchTest(), CoroutinesTest
}
}
@MockK(relaxed = true)
private lateinit var getPrimaryUser: GetPrimaryUser
private lateinit var accountAvailability: AccountAvailability
private lateinit var viewModel: ChooseInternalEmailViewModel
@Before
fun beforeEveryTest() {
accountAvailability = AccountAvailability(userRepository, domainRepository)
MockKAnnotations.init(this)
accountAvailability = AccountAvailability(userRepository, domainRepository, getPrimaryUser)
}
@Test

View File

@ -26,6 +26,7 @@ import io.mockk.coVerify
import io.mockk.impl.annotations.MockK
import io.mockk.slot
import me.proton.core.auth.domain.usecase.AccountAvailability
import me.proton.core.auth.domain.usecase.GetPrimaryUser
import me.proton.core.auth.presentation.viewmodel.signup.ChooseUsernameViewModel.State
import me.proton.core.network.domain.ApiException
import me.proton.core.network.domain.ApiResult
@ -56,12 +57,15 @@ class ChooseUsernameViewModelTest : ArchTest by ArchTest(), CoroutinesTest by Co
@MockK
private lateinit var userRepository: UserRepository
@MockK(relaxed = true)
private lateinit var getPrimaryUser: GetPrimaryUser
private lateinit var viewModel: ChooseUsernameViewModel
@BeforeTest
fun setUp() {
MockKAnnotations.init(this)
accountAvailability = AccountAvailability(userRepository, domainRepository)
accountAvailability = AccountAvailability(userRepository, domainRepository, getPrimaryUser)
}
@Test

View File

@ -50,6 +50,7 @@ import me.proton.core.network.domain.ResponseCodes
import me.proton.core.network.domain.client.ClientId
import me.proton.core.network.domain.client.ClientIdProvider
import me.proton.core.network.domain.client.CookieSessionId
import me.proton.core.network.domain.session.SessionProvider
import me.proton.core.observability.domain.ObservabilityManager
import me.proton.core.observability.domain.metrics.SignupAccountCreationTotal
import me.proton.core.payment.domain.entity.Currency
@ -123,6 +124,9 @@ class SignupViewModelTest : ArchTest by ArchTest(), CoroutinesTest by Coroutines
@MockK(relaxed = true)
private lateinit var userRepository: UserRepository
@MockK(relaxed = true)
private lateinit var sessionProvider: SessionProvider
@MockK(relaxed = true)
private lateinit var srpCrypto: SrpCrypto
@ -188,6 +192,7 @@ class SignupViewModelTest : ArchTest by ArchTest(), CoroutinesTest by Coroutines
PerformCreateUser(
authRepository,
userRepository,
sessionProvider,
srpCrypto,
keyStoreCrypto,
challengeManager,
@ -200,6 +205,7 @@ class SignupViewModelTest : ArchTest by ArchTest(), CoroutinesTest by Coroutines
PerformCreateExternalEmailUser(
authRepository,
userRepository,
sessionProvider,
srpCrypto,
keyStoreCrypto,
challengeManager,

View File

@ -988,7 +988,7 @@ public final class me/proton/core/user/data/repository/UserRepositoryImpl : me/p
public fun <init> (Lme/proton/core/network/data/ApiProvider;Landroid/content/Context;Lme/proton/core/domain/entity/Product;Lme/proton/core/auth/domain/usecase/ValidateServerProof;Lme/proton/core/util/kotlin/CoroutineScopeProvider;Lme/proton/core/user/domain/repository/UserLocalDataSource;Lme/proton/core/user/domain/repository/UserRemoteDataSource;)V
public fun addOnPassphraseChangedListener (Lme/proton/core/user/domain/repository/PassphraseRepository$OnPassphraseChangedListener;)V
public fun addUser (Lme/proton/core/user/domain/entity/User;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public fun checkExternalEmailAvailable (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public fun checkExternalEmailAvailable (Lme/proton/core/domain/entity/UserId;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public fun checkUsernameAvailable (Lme/proton/core/domain/entity/UserId;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public fun clearPassphrase (Lme/proton/core/domain/entity/UserId;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public fun createExternalEmailUser (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lme/proton/core/user/domain/entity/CreateUserType;Lme/proton/core/crypto/common/srp/Auth;Ljava/util/List;Lme/proton/core/domain/entity/UserId;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;

View File

@ -622,7 +622,7 @@ class UserRepositoryImplTests {
coEvery { userApi.externalEmailAvailable(any()) } returns GenericResponse(ResponseCodes.OK)
// WHEN
userRepository.checkExternalEmailAvailable("user@email.test")
userRepository.checkExternalEmailAvailable(null, "user@email.test")
// THEN
val result = assertSingleResult("checkExternalEmailAvailable")

View File

@ -43,7 +43,6 @@ import me.proton.core.domain.entity.UserId
import me.proton.core.key.data.api.request.AuthRequest
import me.proton.core.network.data.ApiProvider
import me.proton.core.network.data.protonApi.isSuccess
import me.proton.core.network.domain.session.SessionId
import me.proton.core.user.data.api.UserApi
import me.proton.core.user.data.api.request.CreateExternalUserRequest
import me.proton.core.user.data.api.request.CreateUserRequest
@ -225,8 +224,11 @@ class UserRepositoryImpl @Inject constructor(
}.throwIfError()
}
override suspend fun checkExternalEmailAvailable(email: String) = result("checkExternalEmailAvailable") {
provider.get<UserApi>().invoke {
override suspend fun checkExternalEmailAvailable(
sessionUserId: SessionUserId?,
email: String
) = result("checkExternalEmailAvailable") {
provider.get<UserApi>(sessionUserId).invoke {
externalEmailAvailable(email)
}.throwIfError()
}

View File

@ -541,7 +541,7 @@ public abstract interface class me/proton/core/user/domain/repository/UserRemote
public abstract interface class me/proton/core/user/domain/repository/UserRepository : me/proton/core/user/domain/repository/PassphraseRepository {
public abstract fun addUser (Lme/proton/core/user/domain/entity/User;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public abstract fun checkExternalEmailAvailable (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public abstract fun checkExternalEmailAvailable (Lme/proton/core/domain/entity/UserId;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public abstract fun checkUsernameAvailable (Lme/proton/core/domain/entity/UserId;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public abstract fun createExternalEmailUser (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lme/proton/core/user/domain/entity/CreateUserType;Lme/proton/core/crypto/common/srp/Auth;Ljava/util/List;Lme/proton/core/domain/entity/UserId;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public abstract fun createUser (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lme/proton/core/user/domain/entity/CreateUserType;Lme/proton/core/crypto/common/srp/Auth;Ljava/util/List;Lme/proton/core/domain/entity/UserId;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;

View File

@ -172,5 +172,8 @@ interface UserRepository : PassphraseRepository {
*
* @throws ApiException if corresponding external email is not available.
*/
suspend fun checkExternalEmailAvailable(email: String)
suspend fun checkExternalEmailAvailable(
sessionUserId: SessionUserId?,
email: String
)
}