Skip to content

Commit

Permalink
update mobile connect request buffering and requests verification logic
Browse files Browse the repository at this point in the history
  • Loading branch information
jakub-rdx committed Jun 26, 2024
1 parent d5536e9 commit e0aa548
Show file tree
Hide file tree
Showing 15 changed files with 114 additions and 123 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.babylon.wallet.android.data.repository

import com.babylon.wallet.android.domain.model.IncomingMessage
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class BufferedMobileConnectRequestRepository @Inject constructor() {

private var bufferedRequest: IncomingMessage.IncomingRequest? = null

fun setBufferedRequest(request: IncomingMessage.IncomingRequest) {
bufferedRequest = request
}

fun getBufferedRequest(): IncomingMessage.IncomingRequest? {
return bufferedRequest?.also { bufferedRequest = null }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import com.radixdlt.sargon.AccountAddress
import com.radixdlt.sargon.DappWalletInteractionErrorType
import com.radixdlt.sargon.extensions.init
import rdx.works.core.domain.DApp
import rdx.works.core.sargon.currentGateway
import rdx.works.core.then
import rdx.works.profile.domain.GetProfileUseCase
import javax.inject.Inject
Expand All @@ -24,14 +25,21 @@ class VerifyDAppUseCase @Inject constructor(
) {

suspend operator fun invoke(request: IncomingRequest): Result<Boolean> {
val networkId = getProfileUseCase().currentGateway.network.id
if (networkId != request.metadata.networkId) {
respondToIncomingRequestUseCase.respondWithFailure(
request = request,
error = DappWalletInteractionErrorType.INVALID_REQUEST
)
return Result.failure(RadixWalletException.DappRequestException.WrongNetwork(networkId, request.metadata.networkId))
}
val dAppDefinitionAddress = runCatching { AccountAddress.init(request.metadata.dAppDefinitionAddress) }.getOrElse {
respondToIncomingRequestUseCase.respondWithFailure(
request = request,
error = DappWalletInteractionErrorType.INVALID_REQUEST
)
return Result.failure(RadixWalletException.DappRequestException.InvalidRequest)
}

val developerMode = getProfileUseCase().appPreferences.security.isDeveloperModeEnabled
return if (developerMode) {
Result.success(true)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package com.babylon.wallet.android.domain.usecases.deeplink

import com.babylon.wallet.android.data.dapp.IncomingRequestRepository
import com.babylon.wallet.android.data.dapp.model.toDomainModel
import com.babylon.wallet.android.data.repository.BufferedDeepLinkRepository
import com.babylon.wallet.android.data.repository.BufferedMobileConnectRequestRepository
import com.babylon.wallet.android.domain.model.IncomingMessage
import com.radixdlt.sargon.RadixConnectMobile
import rdx.works.profile.domain.GetProfileUseCase
Expand All @@ -11,9 +10,8 @@ import javax.inject.Inject

class ProcessDeepLinkUseCase @Inject constructor(
private val radixConnectMobile: RadixConnectMobile,
private val incomingRequestRepository: IncomingRequestRepository,
private val getProfileUseCase: GetProfileUseCase,
private val bufferedDeepLinkRepository: BufferedDeepLinkRepository
private val bufferedMobileConnectRequestRepository: BufferedMobileConnectRequestRepository
) {

suspend operator fun invoke(deepLink: String): Result<DeepLinkProcessingResult> {
Expand All @@ -26,20 +24,18 @@ class ProcessDeepLinkUseCase @Inject constructor(
originVerificationUrl = if (sessionRequest.originRequiresValidation) sessionRequest.origin else null
)
).getOrThrow()
if (profileInitialized) {
incomingRequestRepository.addMobileConnectRequest(request)
DeepLinkProcessingResult.PROCESSED
} else {
bufferedDeepLinkRepository.setBufferedRequest(request)
DeepLinkProcessingResult.BUFFERED
if (!profileInitialized) {
bufferedMobileConnectRequestRepository.setBufferedRequest(request)
return Result.success(DeepLinkProcessingResult.Buffered)
}
DeepLinkProcessingResult.Processed(request)
}.onFailure {
Timber.d("Failed to parse deep link: $deepLink. Error: ${it.message}")
}
}
}

enum class DeepLinkProcessingResult {
PROCESSED,
BUFFERED
sealed interface DeepLinkProcessingResult {
data object Buffered : DeepLinkProcessingResult
data class Processed(val request: IncomingMessage.IncomingRequest) : DeepLinkProcessingResult
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.dialog
import com.babylon.wallet.android.presentation.navigation.markAsHighPriority

fun NavController.deriveAccounts() {
navigate("derive_accounts_bottom_sheet")
Expand All @@ -13,6 +14,7 @@ fun NavController.deriveAccounts() {
fun NavGraphBuilder.deriveAccounts(
onDismiss: () -> Unit
) {
markAsHighPriority("derive_accounts_bottom_sheet")
dialog(
route = "derive_accounts_bottom_sheet",
dialogProperties = DialogProperties(usePlatformDefaultWidth = false)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.dialog
import com.babylon.wallet.android.presentation.navigation.markAsHighPriority

fun NavController.derivePublicKey() {
navigate("derive_public_key_bottom_sheet")
Expand All @@ -13,6 +14,7 @@ fun NavController.derivePublicKey() {
fun NavGraphBuilder.derivePublicKey(
onDismiss: () -> Unit
) {
markAsHighPriority("derive_public_key_bottom_sheet")
dialog(
route = "derive_public_key_bottom_sheet",
dialogProperties = DialogProperties(usePlatformDefaultWidth = false)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ import rdx.works.core.sargon.updateDAppAuthorizedPersonaSharedAccounts
import rdx.works.profile.data.repository.DAppConnectionRepository
import rdx.works.profile.domain.GetProfileUseCase
import rdx.works.profile.domain.ProfileException
import rdx.works.profile.domain.gateway.GetCurrentGatewayUseCase
import javax.inject.Inject

@HiltViewModel
Expand All @@ -74,7 +73,6 @@ class DAppAuthorizedLoginViewModel @Inject constructor(
private val respondToIncomingRequestUseCase: RespondToIncomingRequestUseCase,
private val dAppConnectionRepository: DAppConnectionRepository,
private val getProfileUseCase: GetProfileUseCase,
private val getCurrentGatewayUseCase: GetCurrentGatewayUseCase,
private val stateRepository: StateRepository,
private val incomingRequestRepository: IncomingRequestRepository,
private val buildAuthorizedDappResponseUseCase: BuildAuthorizedDappResponseUseCase
Expand Down Expand Up @@ -110,16 +108,6 @@ class DAppAuthorizedLoginViewModel @Inject constructor(
} else {
request = requestToHandle
}
val currentNetworkId = getCurrentGatewayUseCase().network.id
if (currentNetworkId != request.requestMetadata.networkId) {
handleRequestError(
RadixWalletException.DappRequestException.WrongNetwork(
currentNetworkId,
request.requestMetadata.networkId
)
)
return@launch
}
val dAppDefinitionAddress = runCatching { AccountAddress.init(request.requestMetadata.dAppDefinitionAddress) }.getOrNull()
if (!request.isValidRequest() || dAppDefinitionAddress == null) {
handleRequestError(RadixWalletException.DappRequestException.InvalidRequest)
Expand Down Expand Up @@ -701,7 +689,7 @@ class DAppAuthorizedLoginViewModel @Inject constructor(
mutex.withLock {
editedDapp?.let { dAppConnectionRepository.updateOrCreateAuthorizedDApp(it) }
}
incomingRequestRepository.requestHandled(request.interactionId.toString())
incomingRequestRepository.requestHandled(request.interactionId)
sendEvent(Event.LoginFlowCompleted)
} else {
buildAuthorizedDappResponseUseCase(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ import rdx.works.core.sargon.fields
import rdx.works.core.sargon.toPersonaData
import rdx.works.profile.domain.GetProfileUseCase
import rdx.works.profile.domain.ProfileException
import rdx.works.profile.domain.gateway.GetCurrentGatewayUseCase
import javax.inject.Inject

@HiltViewModel
Expand All @@ -56,7 +55,6 @@ class DAppUnauthorizedLoginViewModel @Inject constructor(
private val respondToIncomingRequestUseCase: RespondToIncomingRequestUseCase,
private val appEventBus: AppEventBus,
private val getProfileUseCase: GetProfileUseCase,
private val getCurrentGatewayUseCase: GetCurrentGatewayUseCase,
private val stateRepository: StateRepository,
private val incomingRequestRepository: IncomingRequestRepository,
private val buildUnauthorizedDappResponseUseCase: BuildUnauthorizedDappResponseUseCase
Expand Down Expand Up @@ -87,16 +85,6 @@ class DAppUnauthorizedLoginViewModel @Inject constructor(
} else {
request = requestToHandle
}
val currentNetworkId = getCurrentGatewayUseCase().network.id
if (currentNetworkId != request.requestMetadata.networkId) {
handleRequestError(
RadixWalletException.DappRequestException.WrongNetwork(
currentNetworkId,
request.requestMetadata.networkId
)
)
return@launch
}
val dAppDefinitionAddress = runCatching { AccountAddress.init(request.metadata.dAppDefinitionAddress) }.getOrNull()
if (!request.isValidRequest() || dAppDefinitionAddress == null) {
handleRequestError(RadixWalletException.DappRequestException.InvalidRequest)
Expand Down Expand Up @@ -271,7 +259,7 @@ class DAppUnauthorizedLoginViewModel @Inject constructor(
if (!request.isInternal) {
appEventBus.sendEvent(
AppEvent.Status.DappInteraction(
requestId = request.interactionId.toString(),
requestId = request.interactionId,
dAppName = state.value.dapp?.name,
isMobileConnect = result is IncomingRequestResponse.SuccessRadixMobileConnect
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import android.net.Uri
import androidx.lifecycle.viewModelScope
import com.babylon.wallet.android.data.dapp.IncomingRequestRepository
import com.babylon.wallet.android.data.dapp.PeerdroidClient
import com.babylon.wallet.android.data.repository.BufferedMobileConnectRequestRepository
import com.babylon.wallet.android.data.repository.p2plink.P2PLinksRepository
import com.babylon.wallet.android.domain.RadixWalletException
import com.babylon.wallet.android.domain.model.IncomingMessage.IncomingRequest
Expand Down Expand Up @@ -71,7 +72,8 @@ class MainViewModel @Inject constructor(
private val checkEntitiesCreatedWithOlympiaUseCase: CheckEntitiesCreatedWithOlympiaUseCase,
private val observeAccountsAndSyncWithConnectorExtensionUseCase: ObserveAccountsAndSyncWithConnectorExtensionUseCase,
private val cloudBackupErrorStream: CloudBackupErrorStream,
private val processDeepLinkUseCase: ProcessDeepLinkUseCase
private val processDeepLinkUseCase: ProcessDeepLinkUseCase,
private val bufferedMobileConnectRequestRepository: BufferedMobileConnectRequestRepository
) : StateViewModel<MainUiState>(), OneOffEventHandler<MainEvent> by OneOffEventHandlerImpl() {

private var verifyingDappRequestJob: Job? = null
Expand Down Expand Up @@ -149,10 +151,20 @@ class MainViewModel @Inject constructor(
}.collect()
}
handleAllIncomingRequests()

viewModelScope.launch {
observeAccountsAndSyncWithConnectorExtensionUseCase()
}
processBufferedDeepLinkRequest()
}

private fun processBufferedDeepLinkRequest() {
viewModelScope.launch {
appEventBus.events.filterIsInstance<AppEvent.ProcessBufferedDeepLinkRequest>().collect {
bufferedMobileConnectRequestRepository.getBufferedRequest()?.let { request ->
verifyIncomingRequest(request)
}
}
}
}

override fun initialState(): MainUiState {
Expand Down Expand Up @@ -249,13 +261,19 @@ class MainViewModel @Inject constructor(
fun handleDeepLink(deepLink: Uri) {
viewModelScope.launch {
processDeepLinkUseCase(deepLink.toString()).onSuccess { result ->
if (result == DeepLinkProcessingResult.BUFFERED) {
_state.update {
it.copy(showMobileConnectWarning = true)
when (result) {
is DeepLinkProcessingResult.Processed -> {
verifyIncomingRequest(result.request)
}

DeepLinkProcessingResult.Buffered -> {
_state.update {
it.copy(showMobileConnectWarning = true)
}
}
}
}.onFailure {
Timber.d(it)
}.onFailure { error ->
Timber.d(error)
}
}
}
Expand All @@ -268,16 +286,22 @@ class MainViewModel @Inject constructor(

private fun verifyIncomingRequest(request: IncomingRequest) {
verifyingDappRequestJob = viewModelScope.launch {
if (request.isMobileConnectRequest) {
incomingRequestRepository.add(request)
} else {
verifyDappUseCase(request).onSuccess { verified ->
if (verified) {
verifyDappUseCase(request).onSuccess { verified ->
if (verified) {
if (request.isMobileConnectRequest) {
incomingRequestRepository.addMobileConnectRequest(request)
} else {
incomingRequestRepository.add(request)
}
}.onFailure {
_state.update { state ->
state.copy(dappRequestFailure = RadixWalletException.DappRequestException.InvalidRequest)
}
}.onFailure { error ->
if (error is RadixWalletException.DappRequestException) {
_state.update {
it.copy(dappRequestFailure = error)
}
} else {
_state.update {
it.copy(dappRequestFailure = RadixWalletException.DappRequestException.InvalidRequest)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import android.annotation.SuppressLint
import androidx.lifecycle.viewModelScope
import com.babylon.wallet.android.NPSSurveyState
import com.babylon.wallet.android.NPSSurveyStateObserver
import com.babylon.wallet.android.data.repository.BufferedDeepLinkRepository
import com.babylon.wallet.android.data.repository.p2plink.P2PLinksRepository
import com.babylon.wallet.android.data.repository.tokenprice.FiatPriceRepository
import com.babylon.wallet.android.di.coroutines.DefaultDispatcher
Expand Down Expand Up @@ -84,7 +83,6 @@ class WalletViewModel @Inject constructor(
private val npsSurveyStateObserver: NPSSurveyStateObserver,
private val p2PLinksRepository: P2PLinksRepository,
private val checkMigrationToNewBackupSystemUseCase: CheckMigrationToNewBackupSystemUseCase,
private val bufferedDeepLinkRepository: BufferedDeepLinkRepository,
@DefaultDispatcher private val defaultDispatcher: CoroutineDispatcher
) : StateViewModel<WalletUiState>(), OneOffEventHandler<WalletEvent> by OneOffEventHandlerImpl() {

Expand Down Expand Up @@ -113,7 +111,6 @@ class WalletViewModel @Inject constructor(
return@launch
}
}
processBufferedDeepLinkRequest()
observePrompts()
observeAccounts()
observeGlobalAppEvents()
Expand All @@ -122,9 +119,9 @@ class WalletViewModel @Inject constructor(
checkForOldBackupSystemToMigrate()
}

private fun processBufferedDeepLinkRequest() {
fun processBufferedDeepLinkRequest() {
viewModelScope.launch {
bufferedDeepLinkRepository.processBufferedRequest()
appEventBus.sendEvent(AppEvent.ProcessBufferedDeepLinkRequest)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ sealed interface AppEvent {

data object SecureFolderWarning : AppEvent
data class DeferRequestHandling(val interactionId: String) : AppEvent
data object ProcessBufferedDeepLinkRequest : AppEvent
sealed interface AccessFactorSources : AppEvent {

data class SelectedLedgerDevice(val ledgerFactorSource: FactorSource.Ledger) : AccessFactorSources
Expand Down
Loading

0 comments on commit e0aa548

Please sign in to comment.