Testing safe-guard against integrated addresses inside of pay-to-many txs. It should fail anyway right now but this is a sanity check.

This commit is contained in:
pokkst 2023-03-11 17:35:43 -06:00
parent 099e3c7281
commit d4e871ede5
No known key found for this signature in database
GPG key ID: 90C2ED85E67A50FF
4 changed files with 47 additions and 18 deletions

View file

@ -137,7 +137,6 @@ public class SendFragment extends Fragment {
}
});
sendMaxButton.setOnClickListener(view1 -> {
addOutputImageView.setVisibility(View.INVISIBLE);
boolean currentValue = mViewModel.sendingMax.getValue() != null ? mViewModel.sendingMax.getValue() : false;
mViewModel.setSendingMax(!currentValue);
});
@ -192,17 +191,19 @@ public class SendFragment extends Fragment {
mViewModel.sendingMax.observe(getViewLifecycleOwner(), sendingMax -> {
if (mViewModel.pendingTransaction.getValue() == null) {
if (sendingMax) {
addOutputImageView.setVisibility(View.GONE);
prepareOutputsForMaxSend();
sendMaxButton.setText(getText(R.string.undo));
} else {
addOutputImageView.setVisibility(View.VISIBLE);
unprepareMaxSend();
sendMaxButton.setText(getText(R.string.send_max));
}
}
});
mViewModel.showAddOutputButton.observe(getViewLifecycleOwner(), show -> {
setAddOutputButtonVisibility(show ? View.VISIBLE : View.INVISIBLE);
});
mViewModel.pendingTransaction.observe(getViewLifecycleOwner(), pendingTx -> {
showConfirmationLayout(pendingTx != null);
@ -322,31 +323,41 @@ public class SendFragment extends Fragment {
}
private void pasteAddress(ConstraintLayout entryView, String clipboard, boolean pastingAmount) {
if(pastingAmount) {
try {
Double.parseDouble(clipboard);
setAmount(entryView, clipboard);
} catch (Exception e) {
Toast.makeText(getActivity(), getString(R.string.send_amount_invalid), Toast.LENGTH_SHORT).show();
return;
}
}
UriData uriData = UriData.parse(clipboard);
if (uriData != null) {
int currentOutputs = getDestCount();
if(currentOutputs > 1 && uriData.hasPaymentId()) {
Toast.makeText(getActivity(), getString(R.string.paymentid_paytomany), Toast.LENGTH_SHORT).show();
return;
} else if(currentOutputs == 1 && uriData.hasPaymentId()) {
mViewModel.setShowAddOutputButton(false);
}
EditText addressField = entryView.findViewById(R.id.address_edittext);
addressField.setText(uriData.getAddress());
if (uriData.hasAmount()) {
sendMaxButton.setEnabled(false);
EditText amountField = entryView.findViewById(R.id.amount_edittext);
amountField.setText(uriData.getAmount());
setAmount(entryView, uriData.getAmount());
}
} else {
if(pastingAmount) {
try {
Double.parseDouble(clipboard);
sendMaxButton.setEnabled(false);
EditText amountField = entryView.findViewById(R.id.amount_edittext);
amountField.setText(clipboard);
} catch (Exception e) {
Toast.makeText(getActivity(), getString(R.string.send_amount_invalid), Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(getActivity(), getString(R.string.send_address_invalid), Toast.LENGTH_SHORT).show();
}
Toast.makeText(getActivity(), getString(R.string.send_address_invalid), Toast.LENGTH_SHORT).show();
}
}
private void setAmount(ConstraintLayout entryView, String amount) {
sendMaxButton.setEnabled(false);
EditText amountField = entryView.findViewById(R.id.amount_edittext);
amountField.setText(amount);
}
private void createTx(List<Pair<String, String>> dests, boolean sendAll, PendingTransaction.Priority feePriority) {
((MoneroApplication)getActivity().getApplication()).getExecutor().execute(() -> {
try {
@ -393,4 +404,8 @@ public class SendFragment extends Fragment {
}
});
}
private void setAddOutputButtonVisibility(int visibility) {
addOutputImageView.setVisibility(visibility);
}
}

View file

@ -9,11 +9,18 @@ import net.mynero.wallet.model.PendingTransaction;
public class SendViewModel extends ViewModel {
private final MutableLiveData<Boolean> _sendingMax = new MutableLiveData<>(false);
public LiveData<Boolean> sendingMax = _sendingMax;
private final MutableLiveData<Boolean> _showAddOutputButton = new MutableLiveData<>(true);
public LiveData<Boolean> showAddOutputButton = _showAddOutputButton;
private final MutableLiveData<PendingTransaction> _pendingTransaction = new MutableLiveData<>(null);
public LiveData<PendingTransaction> pendingTransaction = _pendingTransaction;
public void setSendingMax(boolean value) {
_sendingMax.setValue(value);
setShowAddOutputButton(!value);
}
public void setShowAddOutputButton(boolean value) {
_showAddOutputButton.setValue(value);
}
public void setPendingTransaction(PendingTransaction pendingTx) {

View file

@ -1,6 +1,7 @@
package net.mynero.wallet.util;
import net.mynero.wallet.model.Wallet;
import net.mynero.wallet.model.WalletManager;
import java.util.HashMap;
@ -46,6 +47,10 @@ public class UriData {
return address;
}
public boolean hasPaymentId() {
return !Wallet.getPaymentIdFromAddress(this.address, WalletManager.getInstance().getWallet().nettype()).isEmpty();
}
public String getAmount() {
String txAmount = params.get(Constants.URI_ARG_AMOUNT);
if (txAmount == null) {

View file

@ -125,4 +125,6 @@
<string name="auth">[ auth ]</string>
<string name="to">To</string>
<string name="max_outputs_allowed">Maximum allowed outputs</string>
<string name="paymentid_paytomany">Cannot send to integrated addresses in a pay-to-many transaction</string>
</resources>