Add input validation for ignored peers and BTC nodes

Ignored peers and BTC nodes input fields will now only accept IPv4 and
V2 onion addresses, with multiple addresses separated using a comma.
This commit is contained in:
Devin Bileck 2019-11-21 01:11:08 -08:00
parent b0113d59a7
commit 5e52dc58a8
No known key found for this signature in database
GPG key ID: 3D04526F77BBE364
5 changed files with 56 additions and 3 deletions

View file

@ -3284,3 +3284,4 @@ validation.phone.insufficientDigits=Not enough digits in {0} for a valid phone n
validation.phone.tooManyDigits=Too many digits in {0} to be a valid phone number
validation.phone.invalidDialingCode=Country dialing code in number {0} is invalid for country {1}. \
The correct dialing code is {2}.
validation.invalidAddressList=Must be comma separated list of valid addresses

View file

@ -27,6 +27,7 @@ import bisq.desktop.components.TitledGroupBg;
import bisq.desktop.main.overlays.popups.Popup;
import bisq.desktop.main.overlays.windows.TorNetworkSettingsWindow;
import bisq.desktop.util.GUIUtil;
import bisq.desktop.util.validation.RegexValidator;
import bisq.core.app.BisqEnvironment;
import bisq.core.btc.nodes.BtcNodes;
@ -239,7 +240,10 @@ public class NetworkSettingsView extends ActivatableView<GridPane, Void> {
onBitcoinPeersToggleSelected(true);
};
btcNodesInputTextFieldListener = (observable, oldValue, newValue) -> preferences.setBitcoinNodes(newValue);
btcNodesInputTextField.setPromptText(Res.get("settings.net.ips"));
RegexValidator regexValidator = GUIUtil.addressRegexValidator();
btcNodesInputTextField.setValidator(regexValidator);
btcNodesInputTextField.setErrorMessage(Res.get("validation.invalidAddressList"));
btcNodesInputTextFieldFocusListener = (observable, oldValue, newValue) -> {
if (oldValue && !newValue)
showShutDownPopup();
@ -311,7 +315,6 @@ public class NetworkSettingsView extends ActivatableView<GridPane, Void> {
p2pPeersTableView.setItems(p2pSortedList);
btcNodesInputTextField.setText(preferences.getBitcoinNodes());
btcNodesInputTextField.setPromptText(Res.get("settings.net.ips"));
btcNodesInputTextField.textProperty().addListener(btcNodesInputTextFieldListener);
btcNodesInputTextField.focusedProperty().addListener(btcNodesInputTextFieldFocusListener);

View file

@ -28,6 +28,7 @@ import bisq.desktop.main.overlays.popups.Popup;
import bisq.desktop.util.GUIUtil;
import bisq.desktop.util.ImageUtil;
import bisq.desktop.util.Layout;
import bisq.desktop.util.validation.RegexValidator;
import bisq.core.app.BisqEnvironment;
import bisq.core.btc.wallet.Restrictions;
@ -324,8 +325,14 @@ public class PreferencesView extends ActivatableViewAndModel<GridPane, Preferenc
// ignoreTraders
ignoreTradersListInputTextField = addInputTextField(root, ++gridRow,
Res.get("setting.preferences.ignorePeers"));
ignoreTradersListListener = (observable, oldValue, newValue) ->
RegexValidator regexValidator = GUIUtil.addressRegexValidator();
ignoreTradersListInputTextField.setValidator(regexValidator);
ignoreTradersListInputTextField.setErrorMessage(Res.get("validation.invalidAddressList"));
ignoreTradersListListener = (observable, oldValue, newValue) -> {
if (regexValidator.validate(newValue).isValid && !newValue.equals(oldValue)) {
preferences.setIgnoreTradersList(Arrays.asList(StringUtils.deleteWhitespace(newValue).split(",")));
}
};
// referralId
/* referralIdInputTextField = addInputTextField(root, ++gridRow, Res.get("setting.preferences.refererId"));

View file

@ -27,6 +27,7 @@ import bisq.desktop.main.MainView;
import bisq.desktop.main.account.AccountView;
import bisq.desktop.main.account.content.fiataccounts.FiatAccountsView;
import bisq.desktop.main.overlays.popups.Popup;
import bisq.desktop.util.validation.RegexValidator;
import bisq.core.account.witness.AccountAgeWitness;
import bisq.core.account.witness.AccountAgeWitnessService;
@ -1107,4 +1108,14 @@ public class GUIUtil {
state.equals(AccountAgeWitnessService.SignState.PEER_SIGNER)) ?
MaterialDesignIcon.APPROVAL : MaterialDesignIcon.ALERT_CIRCLE_OUTLINE;
}
public static RegexValidator addressRegexValidator() {
RegexValidator regexValidator = new RegexValidator();
String portRegexPattern = "(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])";
String onionV2RegexPattern = String.format("[a-zA-Z2-7]{16}\\.onion(?:\\:%1$s)?", portRegexPattern);
String onionV3RegexPattern = String.format("[a-zA-Z2-7]{56}\\.onion(?:\\:%1$s)?", portRegexPattern);
String ipv4RegexPattern = String.format("(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:\\:%1$s)?", portRegexPattern);
regexValidator.setPattern(String.format("^(?:(?:(?:%1$s)|(?:%2$s)),)*(?:(?:%1$s)|(?:%2$s))*$", onionV2RegexPattern, ipv4RegexPattern));
return regexValidator;
}
}

View file

@ -17,6 +17,8 @@
package bisq.desktop.util;
import bisq.desktop.util.validation.RegexValidator;
import bisq.core.locale.GlobalSettings;
import bisq.core.locale.Res;
import bisq.core.locale.TradeCurrency;
@ -44,6 +46,8 @@ import static com.natpryce.makeiteasy.MakeItEasy.with;
import static org.bitcoinj.core.CoinMaker.oneBitcoin;
import static org.bitcoinj.core.CoinMaker.satoshis;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@ -112,6 +116,33 @@ public class GUIUtilTest {
*/
}
@Test
public void testAddressRegexValidator() {
RegexValidator regexValidator = GUIUtil.addressRegexValidator();
assertTrue(regexValidator.validate("").isValid);
assertTrue(regexValidator.validate("abcdefghij234567.onion").isValid);
assertTrue(regexValidator.validate("abcdefghijklmnop.onion,abcdefghijklmnop.onion").isValid);
assertTrue(regexValidator.validate("qrstuvwxyzABCDEF.onion,qrstuvwxyzABCDEF.onion,aaaaaaaaaaaaaaaa.onion").isValid);
assertTrue(regexValidator.validate("GHIJKLMNOPQRSTUV.onion:9999").isValid);
assertTrue(regexValidator.validate("WXYZ234567abcdef.onion,GHIJKLMNOPQRSTUV.onion:9999").isValid);
assertTrue(regexValidator.validate("aaaaaaaaaaaaaaaa.onion:9999,WXYZ234567abcdef.onion:9999,2222222222222222.onion:9999").isValid);
assertTrue(regexValidator.validate("12.34.56.78").isValid);
assertTrue(regexValidator.validate("12.34.56.78:8888").isValid);
assertFalse(regexValidator.validate(" ").isValid);
assertFalse(regexValidator.validate("abcd.onion").isValid);
assertFalse(regexValidator.validate("abcdefghijklmnop,abcdefghijklmnop.onion").isValid);
assertFalse(regexValidator.validate("abcdefghi2345689.onion:9999").isValid);
assertFalse(regexValidator.validate("onion:9999,abcdefghijklmnop.onion:9999").isValid);
assertFalse(regexValidator.validate("abcdefghijklmnop.onion:").isValid);
assertFalse(regexValidator.validate("32zzibxmqi2ybxpqyggwwuwz7a3lbvtzoloti7cxoevyvijexvgsfeid.onion:8333").isValid);
assertFalse(regexValidator.validate("12.34.56.788").isValid);
assertFalse(regexValidator.validate("12.34.56.78:").isValid);
}
@Test
public void percentageOfTradeAmount_higherFeeAsMin() {