From 9f060be3fd6db2bb0bd9945fcd7b2d8a061a2499 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Sun, 16 Dec 2018 15:49:57 +0800 Subject: [PATCH] Fix #502 * Check if port is valid before setting it * Validate user input * Change proxyPort to int --- .../main/java/org/jackhuang/hmcl/setting/Config.java | 8 ++++---- .../java/org/jackhuang/hmcl/setting/ProxyManager.java | 10 +++++++--- .../main/java/org/jackhuang/hmcl/ui/SettingsPage.java | 6 +++++- .../java/org/jackhuang/hmcl/game/LaunchOptions.java | 6 +++--- .../org/jackhuang/hmcl/launch/DefaultLauncher.java | 4 ++-- 5 files changed, 21 insertions(+), 13 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java index e431c0301..c37a1f396 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java @@ -102,7 +102,7 @@ public final class Config implements Cloneable, Observable { private StringProperty proxyHost = new SimpleStringProperty(); @SerializedName("proxyPort") - private StringProperty proxyPort = new SimpleStringProperty(); + private IntegerProperty proxyPort = new SimpleIntegerProperty(); @SerializedName("proxyUserName") private StringProperty proxyUser = new SimpleStringProperty(); @@ -293,15 +293,15 @@ public final class Config implements Cloneable, Observable { return proxyHost; } - public String getProxyPort() { + public int getProxyPort() { return proxyPort.get(); } - public void setProxyPort(String proxyPort) { + public void setProxyPort(int proxyPort) { this.proxyPort.set(proxyPort); } - public StringProperty proxyPortProperty() { + public IntegerProperty proxyPortProperty() { return proxyPort; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java index 971168b34..0ba6d4229 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ProxyManager.java @@ -20,7 +20,6 @@ package org.jackhuang.hmcl.setting; import javafx.beans.binding.Bindings; import javafx.beans.binding.ObjectBinding; import javafx.beans.value.ObservableObjectValue; -import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.StringUtils; import java.net.Authenticator; @@ -30,6 +29,7 @@ import java.net.Proxy; import java.net.Proxy.Type; import static org.jackhuang.hmcl.setting.ConfigHolder.config; +import static org.jackhuang.hmcl.util.Logging.LOG; public final class ProxyManager { private ProxyManager() { @@ -49,10 +49,14 @@ public final class ProxyManager { proxyProperty = Bindings.createObjectBinding( () -> { String host = config().getProxyHost(); - Integer port = Lang.toIntOrNull(config().getProxyPort()); - if (!config().hasProxy() || StringUtils.isBlank(host) || port == null || config().getProxyType() == Proxy.Type.DIRECT) { + int port = config().getProxyPort(); + if (!config().hasProxy() || StringUtils.isBlank(host) || config().getProxyType() == Proxy.Type.DIRECT) { return Proxy.NO_PROXY; } else { + if (port < 0 || port > 0xFFFF) { + LOG.warning("Illegal proxy port: " + port); + return Proxy.NO_PROXY; + } return new Proxy(config().getProxyType(), new InetSocketAddress(host, port)); } }, diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java index bd75c9cf7..c6c32c656 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java @@ -96,7 +96,11 @@ public final class SettingsPage extends SettingsView implements DecoratorPage { // ==== Proxy ==== txtProxyHost.textProperty().bindBidirectional(config().proxyHostProperty()); - txtProxyPort.textProperty().bindBidirectional(config().proxyPortProperty()); + txtProxyPort.textProperty().bindBidirectional(config().proxyPortProperty(), + SafeStringConverter.fromInteger() + .restrict(it -> it >= 0 && it <= 0xFFFF) + .fallbackTo(0) + .asPredicate(Validator.addTo(txtProxyPort))); txtProxyUsername.textProperty().bindBidirectional(config().proxyUserProperty()); txtProxyPassword.textProperty().bindBidirectional(config().proxyPassProperty()); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java index 976fc34f1..fd02165ad 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java @@ -43,7 +43,7 @@ public class LaunchOptions implements Serializable { private String serverIp; private String wrapper; private String proxyHost; - private String proxyPort; + private int proxyPort; private String proxyUser; private String proxyPass; private boolean noGeneratedJVMArgs; @@ -160,7 +160,7 @@ public class LaunchOptions implements Serializable { /** * the port of the proxy address. */ - public String getProxyPort() { + public int getProxyPort() { return proxyPort; } @@ -275,7 +275,7 @@ public class LaunchOptions implements Serializable { return this; } - public Builder setProxyPort(String proxyPort) { + public Builder setProxyPort(int proxyPort) { options.proxyPort = proxyPort; return this; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java index f58eddbf4..bcd405a5b 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java @@ -162,11 +162,11 @@ public class DefaultLauncher extends Launcher { if (options.isFullscreen()) res.add("--fullscreen"); - if (StringUtils.isNotBlank(options.getProxyHost()) && StringUtils.isNotBlank(options.getProxyPort())) { + if (StringUtils.isNotBlank(options.getProxyHost())) { res.add("--proxyHost"); res.add(options.getProxyHost()); res.add("--proxyPort"); - res.add(options.getProxyPort()); + res.add(String.valueOf(options.getProxyPort())); if (StringUtils.isNotBlank(options.getProxyUser()) && StringUtils.isNotBlank(options.getProxyPass())) { res.add("--proxyUser"); res.add(options.getProxyUser());