diff options
author | Iván Ávalos <avalos@disroot.org> | 2024-05-14 11:14:03 -0600 |
---|---|---|
committer | Iván Ávalos <avalos@disroot.org> | 2024-05-14 11:14:19 -0600 |
commit | 046e0557f989664549fbd7f48d82838c1edc31bf (patch) | |
tree | dc3e450c476d20cb33056929ac0413f5d9a7e3bf | |
parent | 2824bbef631aae87fd8533168635c4489505b23a (diff) | |
download | taler-android-046e0557f989664549fbd7f48d82838c1edc31bf.tar.gz taler-android-046e0557f989664549fbd7f48d82838c1edc31bf.tar.bz2 taler-android-046e0557f989664549fbd7f48d82838c1edc31bf.zip |
[wallet] prevent negative fee overflow by performing subtraction check
bug 0008830
15 files changed, 128 insertions, 100 deletions
diff --git a/wallet/src/main/java/net/taler/wallet/deposit/MakeBitcoinDepositComposable.kt b/wallet/src/main/java/net/taler/wallet/deposit/MakeBitcoinDepositComposable.kt index 3fa0d98..ec869f9 100644 --- a/wallet/src/main/java/net/taler/wallet/deposit/MakeBitcoinDepositComposable.kt +++ b/wallet/src/main/java/net/taler/wallet/deposit/MakeBitcoinDepositComposable.kt @@ -104,12 +104,14 @@ fun MakeBitcoinDepositComposable( ) { val totalAmount = state.totalDepositCost ?: amount val effectiveAmount = state.effectiveDepositAmount ?: Amount.zero(amount.currency) - val fee = totalAmount - effectiveAmount - TransactionAmountComposable( - label = stringResource(id = R.string.withdraw_fees), - amount = fee, - amountType = AmountType.Negative, - ) + if (totalAmount > effectiveAmount) { + val fee = totalAmount - effectiveAmount + TransactionAmountComposable( + label = stringResource(id = R.string.withdraw_fees), + amount = fee, + amountType = AmountType.Negative, + ) + } TransactionAmountComposable( label = stringResource(id = R.string.send_amount), amount = totalAmount, diff --git a/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt b/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt index 9333ce1..27d10e6 100644 --- a/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt +++ b/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt @@ -134,13 +134,15 @@ fun MakeDepositComposable( ) { val totalAmount = state.totalDepositCost ?: amount val effectiveAmount = state.effectiveDepositAmount ?: Amount.zero(amount.currency) - val fee = totalAmount - effectiveAmount + if (totalAmount > effectiveAmount) { + val fee = totalAmount - effectiveAmount - TransactionAmountComposable( - label = stringResource(R.string.withdraw_fees), - amount = fee.withSpec(amount.spec), - amountType = if (fee.isZero()) Positive else Negative, - ) + TransactionAmountComposable( + label = stringResource(R.string.withdraw_fees), + amount = fee.withSpec(amount.spec), + amountType = if (fee.isZero()) Positive else Negative, + ) + } TransactionAmountComposable( label = stringResource(R.string.send_amount), diff --git a/wallet/src/main/java/net/taler/wallet/deposit/TransactionDepositComposable.kt b/wallet/src/main/java/net/taler/wallet/deposit/TransactionDepositComposable.kt index 817dfac..2c2973a 100644 --- a/wallet/src/main/java/net/taler/wallet/deposit/TransactionDepositComposable.kt +++ b/wallet/src/main/java/net/taler/wallet/deposit/TransactionDepositComposable.kt @@ -77,13 +77,15 @@ fun TransactionDepositComposable( amountType = AmountType.Neutral, ) - val fee = t.amountEffective - t.amountRaw - if (!fee.isZero()) { - TransactionAmountComposable( - label = stringResource(id = R.string.withdraw_fees), - amount = fee.withSpec(spec), - amountType = AmountType.Negative, - ) + if (t.amountEffective > t.amountRaw) { + val fee = t.amountEffective - t.amountRaw + if (!fee.isZero()) { + TransactionAmountComposable( + label = stringResource(id = R.string.withdraw_fees), + amount = fee.withSpec(spec), + amountType = AmountType.Negative, + ) + } } TransactionAmountComposable( diff --git a/wallet/src/main/java/net/taler/wallet/payment/TransactionPaymentComposable.kt b/wallet/src/main/java/net/taler/wallet/payment/TransactionPaymentComposable.kt index 0f6d661..25021f0 100644 --- a/wallet/src/main/java/net/taler/wallet/payment/TransactionPaymentComposable.kt +++ b/wallet/src/main/java/net/taler/wallet/payment/TransactionPaymentComposable.kt @@ -82,13 +82,15 @@ fun TransactionPaymentComposable( amountType = AmountType.Neutral, ) - val fee = t.amountEffective - t.amountRaw - if (!fee.isZero()) { - TransactionAmountComposable( - label = stringResource(id = R.string.withdraw_fees), - amount = fee.withSpec(spec), - amountType = AmountType.Negative, - ) + if (t.amountEffective > t.amountRaw) { + val fee = t.amountEffective - t.amountRaw + if (!fee.isZero()) { + TransactionAmountComposable( + label = stringResource(id = R.string.withdraw_fees), + amount = fee.withSpec(spec), + amountType = AmountType.Negative, + ) + } } TransactionAmountComposable( diff --git a/wallet/src/main/java/net/taler/wallet/peer/IncomingComposable.kt b/wallet/src/main/java/net/taler/wallet/peer/IncomingComposable.kt index 1ce0175..ce01a9b 100644 --- a/wallet/src/main/java/net/taler/wallet/peer/IncomingComposable.kt +++ b/wallet/src/main/java/net/taler/wallet/peer/IncomingComposable.kt @@ -145,22 +145,26 @@ fun ColumnScope.PeerPullTermsComposable( ) } // this gets used for credit and debit, so fee calculation differs - val fee = if (data.isCredit) { + val fee = if (data.isCredit && terms.amountRaw > terms.amountEffective) { terms.amountRaw - terms.amountEffective - } else { + } else if (terms.amountEffective > terms.amountRaw) { terms.amountEffective - terms.amountRaw + } else null + + if (fee != null) { + val feeStr = if (data.isCredit) { + stringResource(R.string.amount_negative, fee) + } else { + stringResource(R.string.amount_positive, fee) + } + if (!fee.isZero()) Text( + modifier = Modifier.align(End), + text = feeStr, + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.error, + ) } - val feeStr = if (data.isCredit) { - stringResource(R.string.amount_negative, fee) - } else { - stringResource(R.string.amount_positive, fee) - } - if (!fee.isZero()) Text( - modifier = Modifier.align(End), - text = feeStr, - style = MaterialTheme.typography.bodyLarge, - color = MaterialTheme.colorScheme.error, - ) + if (terms is IncomingAccepting) { CircularProgressIndicator( modifier = Modifier diff --git a/wallet/src/main/java/net/taler/wallet/peer/OutgoingPullComposable.kt b/wallet/src/main/java/net/taler/wallet/peer/OutgoingPullComposable.kt index 90b520e..8e87104 100644 --- a/wallet/src/main/java/net/taler/wallet/peer/OutgoingPullComposable.kt +++ b/wallet/src/main/java/net/taler/wallet/peer/OutgoingPullComposable.kt @@ -148,7 +148,7 @@ fun OutgoingPullIntroComposable( amountType = AmountType.Positive, ) - if (state is OutgoingChecked) { + if (state is OutgoingChecked && state.amountRaw > state.amountEffective) { val fee = state.amountRaw - state.amountEffective if (!fee.isZero()) TransactionAmountComposable( label = stringResource(id = R.string.withdraw_fees), diff --git a/wallet/src/main/java/net/taler/wallet/peer/OutgoingPushComposable.kt b/wallet/src/main/java/net/taler/wallet/peer/OutgoingPushComposable.kt index d39fdc8..7eba733 100644 --- a/wallet/src/main/java/net/taler/wallet/peer/OutgoingPushComposable.kt +++ b/wallet/src/main/java/net/taler/wallet/peer/OutgoingPushComposable.kt @@ -89,7 +89,7 @@ fun OutgoingPushIntroComposable( style = MaterialTheme.typography.titleLarge, ) - if (state is OutgoingChecked) { + if (state is OutgoingChecked && state.amountEffective > state.amountRaw) { val fee = state.amountEffective - state.amountRaw Text( modifier = Modifier.padding(vertical = 16.dp), diff --git a/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPullCredit.kt b/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPullCredit.kt index 3b15b6f..5cd139d 100644 --- a/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPullCredit.kt +++ b/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPullCredit.kt @@ -54,13 +54,15 @@ fun ColumnScope.TransactionPeerPullCreditComposable(t: TransactionPeerPullCredit amountType = AmountType.Neutral, ) - val fee = t.amountRaw - t.amountEffective - if (!fee.isZero()) { - TransactionAmountComposable( - label = stringResource(id = R.string.withdraw_fees), - amount = fee.withSpec(spec), - amountType = AmountType.Negative, - ) + if (t.amountRaw > t.amountEffective) { + val fee = t.amountRaw - t.amountEffective + if (!fee.isZero()) { + TransactionAmountComposable( + label = stringResource(id = R.string.withdraw_fees), + amount = fee.withSpec(spec), + amountType = AmountType.Negative, + ) + } } TransactionAmountComposable( diff --git a/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPullDebit.kt b/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPullDebit.kt index dadff4a..8e03409 100644 --- a/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPullDebit.kt +++ b/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPullDebit.kt @@ -46,13 +46,15 @@ fun TransactionPeerPullDebitComposable(t: TransactionPeerPullDebit, spec: Curren amountType = AmountType.Neutral, ) - val fee = t.amountEffective - t.amountRaw - if (!fee.isZero()) { - TransactionAmountComposable( - label = stringResource(id = R.string.withdraw_fees), - amount = fee.withSpec(spec), - amountType = AmountType.Negative, - ) + if (t.amountEffective > t.amountRaw) { + val fee = t.amountEffective - t.amountRaw + if (!fee.isZero()) { + TransactionAmountComposable( + label = stringResource(id = R.string.withdraw_fees), + amount = fee.withSpec(spec), + amountType = AmountType.Negative, + ) + } } TransactionAmountComposable( diff --git a/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPushCredit.kt b/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPushCredit.kt index dbf0fb9..45b9d1f 100644 --- a/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPushCredit.kt +++ b/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPushCredit.kt @@ -46,13 +46,15 @@ fun TransactionPeerPushCreditComposable(t: TransactionPeerPushCredit, spec: Curr amountType = AmountType.Neutral, ) - val fee = t.amountRaw - t.amountEffective - if (!fee.isZero()) { - TransactionAmountComposable( - label = stringResource(id = R.string.withdraw_fees), - amount = fee.withSpec(spec), - amountType = AmountType.Negative, - ) + if (t.amountRaw > t.amountEffective) { + val fee = t.amountRaw - t.amountEffective + if (!fee.isZero()) { + TransactionAmountComposable( + label = stringResource(id = R.string.withdraw_fees), + amount = fee.withSpec(spec), + amountType = AmountType.Negative, + ) + } } TransactionAmountComposable( diff --git a/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPushDebit.kt b/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPushDebit.kt index e592c3e..fa9bd1d 100644 --- a/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPushDebit.kt +++ b/wallet/src/main/java/net/taler/wallet/peer/TransactionPeerPushDebit.kt @@ -65,13 +65,15 @@ fun ColumnScope.TransactionPeerPushDebitComposable(t: TransactionPeerPushDebit, amountType = AmountType.Neutral, ) - val fee = t.amountEffective - t.amountRaw - if (!fee.isZero()) { - TransactionAmountComposable( - label = stringResource(id = R.string.withdraw_fees), - amount = fee.withSpec(spec), - amountType = AmountType.Negative, - ) + if (t.amountEffective > t.amountRaw) { + val fee = t.amountEffective - t.amountRaw + if (!fee.isZero()) { + TransactionAmountComposable( + label = stringResource(id = R.string.withdraw_fees), + amount = fee.withSpec(spec), + amountType = AmountType.Negative, + ) + } } TransactionAmountComposable( diff --git a/wallet/src/main/java/net/taler/wallet/refund/TransactionRefundComposable.kt b/wallet/src/main/java/net/taler/wallet/refund/TransactionRefundComposable.kt index 637b41a..1570014 100644 --- a/wallet/src/main/java/net/taler/wallet/refund/TransactionRefundComposable.kt +++ b/wallet/src/main/java/net/taler/wallet/refund/TransactionRefundComposable.kt @@ -81,13 +81,15 @@ fun TransactionRefundComposable( amount = t.amountRaw.withSpec(spec), amountType = AmountType.Neutral, ) - val fee = t.amountRaw - t.amountEffective - if (!fee.isZero()) { - TransactionAmountComposable( - label = stringResource(id = R.string.withdraw_fees), - amount = fee.withSpec(spec), - amountType = AmountType.Negative, - ) + if (t.amountRaw > t.amountEffective) { + val fee = t.amountRaw - t.amountEffective + if (!fee.isZero()) { + TransactionAmountComposable( + label = stringResource(id = R.string.withdraw_fees), + amount = fee.withSpec(spec), + amountType = AmountType.Negative, + ) + } } TransactionInfoComposable( label = stringResource(id = R.string.transaction_order), diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawFragment.kt b/wallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawFragment.kt index 56f56f7..bab88fa 100644 --- a/wallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawFragment.kt @@ -175,11 +175,13 @@ class PromptWithdrawFragment : Fragment() { ui.chosenAmountView.text = amountRaw.toString() ui.chosenAmountView.fadeIn() - val fee = amountRaw - amountEffective - if (!fee.isZero()) { - ui.feeLabel.fadeIn() - ui.feeView.text = getString(R.string.amount_negative, fee.toString()) - ui.feeView.fadeIn() + if (amountRaw > amountEffective) { + val fee = amountRaw - amountEffective + if (!fee.isZero()) { + ui.feeLabel.fadeIn() + ui.feeView.text = getString(R.string.amount_negative, fee.toString()) + ui.feeView.fadeIn() + } } ui.exchangeIntroView.fadeIn() diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/TransactionWithdrawalComposable.kt b/wallet/src/main/java/net/taler/wallet/withdraw/TransactionWithdrawalComposable.kt index 6f88614..110c471 100644 --- a/wallet/src/main/java/net/taler/wallet/withdraw/TransactionWithdrawalComposable.kt +++ b/wallet/src/main/java/net/taler/wallet/withdraw/TransactionWithdrawalComposable.kt @@ -89,13 +89,15 @@ fun TransactionWithdrawalComposable( ) } - val fee = t.amountRaw - t.amountEffective - if (!fee.isZero()) { - TransactionAmountComposable( - label = stringResource(id = R.string.withdraw_fees), - amount = fee.withSpec(spec), - amountType = AmountType.Negative, - ) + if (t.amountRaw > t.amountEffective) { + val fee = t.amountRaw - t.amountEffective + if (!fee.isZero()) { + TransactionAmountComposable( + label = stringResource(id = R.string.withdraw_fees), + amount = fee.withSpec(spec), + amountType = AmountType.Negative, + ) + } } TransactionAmountComposable( diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/manual/ScreenTransfer.kt b/wallet/src/main/java/net/taler/wallet/withdraw/manual/ScreenTransfer.kt index 027bc57..04aa7b5 100644 --- a/wallet/src/main/java/net/taler/wallet/withdraw/manual/ScreenTransfer.kt +++ b/wallet/src/main/java/net/taler/wallet/withdraw/manual/ScreenTransfer.kt @@ -206,19 +206,21 @@ fun WithdrawalAmountTransfer( ) } - val fee = amountRaw - amountEffective - if (!fee.isZero()) { - TransactionAmountComposable( - label = stringResource(id = R.string.withdraw_fees), - amount = fee, - amountType = AmountType.Negative, - ) + if (amountRaw > amountEffective) { + val fee = amountRaw - amountEffective + if (!fee.isZero()) { + TransactionAmountComposable( + label = stringResource(id = R.string.withdraw_fees), + amount = fee, + amountType = AmountType.Negative, + ) - TransactionAmountComposable( - label = stringResource(id = R.string.withdraw_total), - amount = amountEffective, - amountType = AmountType.Positive, - ) + TransactionAmountComposable( + label = stringResource(id = R.string.withdraw_total), + amount = amountEffective, + amountType = AmountType.Positive, + ) + } } } } |