commit 64914df7efb40c215f165c93a4078786ece6b0a4
parent 4bbc0a9f207799b95a65b7bd7338112cfd65d420
Author: Iván Ávalos <avalos@disroot.org>
Date: Thu, 10 Apr 2025 16:18:58 +0200
[wallet] prevent confirming already confirmed withdrawal
bug 0009683
Diffstat:
3 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawFragment.kt b/wallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawFragment.kt
@@ -65,6 +65,7 @@ import net.taler.wallet.withdraw.WithdrawStatus.Status.None
import net.taler.wallet.withdraw.WithdrawStatus.Status.Success
import net.taler.wallet.withdraw.WithdrawStatus.Status.TosReviewRequired
import net.taler.wallet.withdraw.WithdrawStatus.Status.Updating
+import net.taler.wallet.withdraw.WithdrawalOperationStatusFlag.*
class PromptWithdrawFragment: Fragment() {
private val model: MainViewModel by activityViewModels()
@@ -138,6 +139,10 @@ class PromptWithdrawFragment: Fragment() {
return@let
}
+ if (s.uriInfo?.status == Confirmed) {
+ return@let
+ }
+
if (defaultCurrency == null) {
LoadingScreen()
return@let
@@ -192,6 +197,14 @@ class PromptWithdrawFragment: Fragment() {
showError(status.error)
}
+ if (status.uriInfo?.status == Confirmed) {
+ Snackbar.make(requireView(), R.string.withdraw_error_already_confirmed, LENGTH_LONG).show()
+ if (!navigating) {
+ navigating = true
+ findNavController().navigate(R.id.action_promptWithdraw_to_nav_main)
+ }
+ }
+
if (status.exchangeBaseUrl == null
&& selectExchangeDialog.dialog?.isShowing != true) {
selectExchange()
@@ -281,6 +294,7 @@ fun WithdrawalShowInfoPreview() {
amount = null,
currency = "KUDOS",
editableAmount = true,
+ status = Pending,
maxAmount = Amount.fromJSONString("KUDOS:10"),
wireFee = Amount.fromJSONString("KUDOS:0.2"),
defaultExchangeBaseUrl = "exchange.head.taler.net",
diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt b/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt
@@ -16,7 +16,6 @@
package net.taler.wallet.withdraw
-import android.net.Uri
import android.util.Log
import androidx.annotation.UiThread
import androidx.lifecycle.MutableLiveData
@@ -42,6 +41,7 @@ import net.taler.wallet.exchanges.ExchangeManager
import net.taler.wallet.exchanges.ExchangeTosStatus
import net.taler.wallet.transactions.WithdrawalExchangeAccountDetails
import net.taler.wallet.withdraw.WithdrawStatus.Status.*
+import androidx.core.net.toUri
sealed class TestWithdrawStatus {
data object None : TestWithdrawStatus()
@@ -121,6 +121,23 @@ sealed class TransferData {
}
@Serializable
+enum class WithdrawalOperationStatusFlag {
+ Unknown,
+
+ @SerialName("pending")
+ Pending,
+
+ @SerialName("selected")
+ Selected,
+
+ @SerialName("aborted")
+ Aborted,
+
+ @SerialName("confirmed")
+ Confirmed,
+}
+
+@Serializable
data class WithdrawalDetailsForUri(
val amount: Amount? = null,
val currency: String,
@@ -129,6 +146,7 @@ data class WithdrawalDetailsForUri(
val wireFee: Amount? = null,
val defaultExchangeBaseUrl: String? = null,
val possibleExchanges: List<ExchangeItem> = emptyList(),
+ val status: WithdrawalOperationStatusFlag,
)
@Serializable
@@ -515,7 +533,7 @@ class WithdrawManager(
transactionId = response.transactionId,
withdrawalTransfers = response.withdrawalAccountsList.mapNotNull {
val details = status.amountInfo ?: error("no amountInfo")
- val uri = Uri.parse(it.paytoUri)
+ val uri = it.paytoUri.toUri()
if ("bitcoin".equals(uri.authority, true)) {
val msg = uri.getQueryParameter("message").orEmpty()
val reg = "\\b([A-Z0-9]{52})\\b".toRegex().find(msg)
diff --git a/wallet/src/main/res/values/strings.xml b/wallet/src/main/res/values/strings.xml
@@ -274,6 +274,7 @@ GNU Taler is immune against many types of fraud, such as phishing of credit card
<string name="withdraw_button_label">Withdraw</string>
<string name="withdraw_button_tos">Review terms</string>
<string name="withdraw_cash_acceptor">The amount to be withdrawn will be determined by the cash acceptor</string>
+ <string name="withdraw_error_already_confirmed">Withdrawal is already confirmed</string>
<string name="withdraw_error_message">Withdrawing is currently not possible. Please try again later!</string>
<string name="withdraw_error_test">Error withdrawing TESTKUDOS</string>
<string name="withdraw_error_title">Withdrawal error</string>