diff --git a/src/main/java/ctbrec/HttpClient.java b/src/main/java/ctbrec/HttpClient.java index f032e83f..8225636d 100644 --- a/src/main/java/ctbrec/HttpClient.java +++ b/src/main/java/ctbrec/HttpClient.java @@ -7,6 +7,7 @@ import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import ctbrec.Settings.ProxyType; import ctbrec.ui.CookieJarImpl; import ctbrec.ui.HtmlParser; import ctbrec.ui.Launcher; @@ -29,6 +30,7 @@ public class HttpClient { private String token; private HttpClient() { + loadProxySettings(); client = new OkHttpClient.Builder() .cookieJar(cookieJar) .connectTimeout(Config.getInstance().getSettings().httpTimeout, TimeUnit.SECONDS) @@ -38,6 +40,44 @@ public class HttpClient { .build(); } + private void loadProxySettings() { + ProxyType proxyType = Config.getInstance().getSettings().proxyType; + switch (proxyType) { + case HTTP: + System.setProperty("http.proxyHost", Config.getInstance().getSettings().proxyHost); + System.setProperty("http.proxyPort", Config.getInstance().getSettings().proxyPort); + System.setProperty("https.proxyHost", Config.getInstance().getSettings().proxyHost); + System.setProperty("https.proxyPort", Config.getInstance().getSettings().proxyPort); + break; + case SOCKS4: + System.setProperty("socksProxyVersion", "4"); + System.setProperty("socksProxyHost", Config.getInstance().getSettings().proxyHost); + System.setProperty("socksProxyPort", Config.getInstance().getSettings().proxyPort); + break; + case SOCKS5: + System.setProperty("socksProxyVersion", "5"); + System.setProperty("socksProxyHost", Config.getInstance().getSettings().proxyHost); + System.setProperty("socksProxyPort", Config.getInstance().getSettings().proxyPort); + if(Config.getInstance().getSettings().proxyUser != null && !Config.getInstance().getSettings().proxyUser.isEmpty()) { + System.setProperty("java.net.socks.username", Config.getInstance().getSettings().proxyUser); + System.setProperty("java.net.socks.password", Config.getInstance().getSettings().proxyPassword); + } + break; + case DIRECT: + default: + System.clearProperty("http.proxyHost"); + System.clearProperty("http.proxyPort"); + System.clearProperty("https.proxyHost"); + System.clearProperty("https.proxyPort"); + System.clearProperty("socksProxyVersion"); + System.clearProperty("socksProxyHost"); + System.clearProperty("socksProxyPort"); + System.clearProperty("java.net.socks.username"); + System.clearProperty("java.net.socks.password"); + break; + } + } + public static HttpClient getInstance() { return instance; } @@ -113,6 +153,10 @@ public class HttpClient { return loggedIn; } + public void reconfigure() { + instance = new HttpClient(); + } + public String getToken() throws IOException { if(token == null) { login(); diff --git a/src/main/java/ctbrec/Settings.java b/src/main/java/ctbrec/Settings.java index 80927af7..fb6771eb 100644 --- a/src/main/java/ctbrec/Settings.java +++ b/src/main/java/ctbrec/Settings.java @@ -5,6 +5,14 @@ import java.util.ArrayList; import java.util.List; public class Settings { + + public enum ProxyType { + DIRECT, + HTTP, + SOCKS4, + SOCKS5 + } + public boolean singlePlayer = true; public boolean localRecording = true; public int httpPort = 8080; @@ -24,4 +32,9 @@ public class Settings { public boolean chooseStreamQuality = false; public boolean recordFollowed = false; public byte[] key = null; + public ProxyType proxyType = ProxyType.DIRECT; + public String proxyHost; + public String proxyPort; + public String proxyUser; + public String proxyPassword; } diff --git a/src/main/java/ctbrec/ui/Launcher.java b/src/main/java/ctbrec/ui/Launcher.java index 7d7e8c56..093f97ff 100644 --- a/src/main/java/ctbrec/ui/Launcher.java +++ b/src/main/java/ctbrec/ui/Launcher.java @@ -33,6 +33,7 @@ public class Launcher extends Application { private Recorder recorder; private HttpClient client; private static HostServices hostServices; + private SettingsTab settingsTab; @Override public void start(Stage primaryStage) throws Exception { @@ -97,7 +98,8 @@ public class Launcher extends Application { root.getTabs().add(modelsTab); RecordingsTab recordingsTab = new RecordingsTab("Recordings", recorder, config); root.getTabs().add(recordingsTab); - root.getTabs().add(new SettingsTab()); + settingsTab = new SettingsTab(); + root.getTabs().add(settingsTab); root.getTabs().add(new DonateTabFx()); primaryStage.setScene(new Scene(root, 1340, 800)); @@ -112,6 +114,7 @@ public class Launcher extends Application { new Thread() { @Override public void run() { + settingsTab.saveConfig(); recorder.shutdown(); client.shutdown(); try { diff --git a/src/main/java/ctbrec/ui/ProxySettingsPane.java b/src/main/java/ctbrec/ui/ProxySettingsPane.java new file mode 100644 index 00000000..177e9cc5 --- /dev/null +++ b/src/main/java/ctbrec/ui/ProxySettingsPane.java @@ -0,0 +1,113 @@ +package ctbrec.ui; + +import java.util.ArrayList; +import java.util.List; + +import com.sun.javafx.collections.ObservableListWrapper; + +import ctbrec.Config; +import ctbrec.Settings.ProxyType; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.scene.control.ComboBox; +import javafx.scene.control.Label; +import javafx.scene.control.PasswordField; +import javafx.scene.control.TextField; +import javafx.scene.control.TitledPane; +import javafx.scene.layout.GridPane; + +public class ProxySettingsPane extends TitledPane implements EventHandler { + + private ComboBox proxyType; + private TextField proxyHost = new TextField(); + private TextField proxyPort = new TextField(); + private TextField proxyUser = new TextField(); + private PasswordField proxyPassword = new PasswordField(); + + public ProxySettingsPane() { + createGui(); + loadConfig(); + } + + private void createGui() { + setText("Proxy"); + setCollapsible(false); + GridPane layout = SettingsTab.createGridLayout(); + setContent(layout); + + Label l = new Label("Type"); + layout.add(l, 0, 0); + List proxyTypes = new ArrayList<>(); + proxyTypes.add(ProxyType.DIRECT); + proxyTypes.add(ProxyType.HTTP); + proxyTypes.add(ProxyType.SOCKS4); + proxyTypes.add(ProxyType.SOCKS5); + proxyType = new ComboBox<>(new ObservableListWrapper<>(proxyTypes)); + proxyType.setOnAction(this); + layout.add(proxyType, 1, 0); + + l = new Label("Host"); + layout.add(l, 0, 1); + layout.add(proxyHost, 1, 1); + + l = new Label("Port"); + layout.add(l, 0, 2); + layout.add(proxyPort, 1, 2); + + l = new Label("Username"); + layout.add(l, 0, 3); + layout.add(proxyUser, 1, 3); + + l = new Label("Password"); + layout.add(l, 0, 4); + layout.add(proxyPassword, 1, 4); + } + + private void loadConfig() { + proxyType.valueProperty().set(Config.getInstance().getSettings().proxyType); + proxyHost.setText(Config.getInstance().getSettings().proxyHost); + proxyPort.setText(Config.getInstance().getSettings().proxyPort); + proxyUser.setText(Config.getInstance().getSettings().proxyUser); + proxyPassword.setText(Config.getInstance().getSettings().proxyPassword); + setComponentDisableState(); + } + + void saveConfig() { + System.out.println("Saving proxy settings"); + Config.getInstance().getSettings().proxyType = proxyType.getValue(); + Config.getInstance().getSettings().proxyHost = proxyHost.getText(); + Config.getInstance().getSettings().proxyPort = proxyPort.getText(); + Config.getInstance().getSettings().proxyUser = proxyUser.getText(); + Config.getInstance().getSettings().proxyPassword = proxyPassword.getText(); + } + + @Override + public void handle(ActionEvent event) { + setComponentDisableState(); + SettingsTab.showRestartRequired(); + } + + private void setComponentDisableState() { + switch (proxyType.getValue()) { + case DIRECT: + proxyHost.setDisable(true); + proxyPort.setDisable(true); + proxyUser.setDisable(true); + proxyPassword.setDisable(true); + break; + case HTTP: + case SOCKS4: + proxyHost.setDisable(false); + proxyPort.setDisable(false); + proxyUser.setDisable(true); + proxyPassword.setDisable(true); + break; + case SOCKS5: + proxyHost.setDisable(false); + proxyPort.setDisable(false); + proxyUser.setDisable(false); + proxyPassword.setDisable(false); + break; + } + } +} diff --git a/src/main/java/ctbrec/ui/SettingsTab.java b/src/main/java/ctbrec/ui/SettingsTab.java index 33fe282c..074449b2 100644 --- a/src/main/java/ctbrec/ui/SettingsTab.java +++ b/src/main/java/ctbrec/ui/SettingsTab.java @@ -12,6 +12,7 @@ import ctbrec.Hmac; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.geometry.Insets; +import javafx.geometry.VPos; import javafx.scene.Node; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; @@ -37,7 +38,7 @@ import javafx.scene.paint.Color; import javafx.stage.DirectoryChooser; import javafx.stage.FileChooser;; -public class SettingsTab extends Tab { +public class SettingsTab extends Tab implements TabSelectionListener { private static final transient Logger LOG = LoggerFactory.getLogger(SettingsTab.class); @@ -60,6 +61,7 @@ public class SettingsTab extends Tab { private RadioButton recordLocal; private RadioButton recordRemote; private ToggleGroup recordLocation; + private ProxySettingsPane proxySettingsPane; private TitledPane ctb; private TitledPane mergePane; @@ -112,6 +114,13 @@ public class SettingsTab extends Tab { locations.setCollapsible(false); mainLayout.add(locations, 0, 0); + proxySettingsPane = new ProxySettingsPane(); + mainLayout.add(proxySettingsPane, 1, 0); + GridPane.setRowSpan(proxySettingsPane, 2); + GridPane.setFillWidth(proxySettingsPane, true); + GridPane.setHgrow(proxySettingsPane, Priority.ALWAYS); + GridPane.setValignment(proxySettingsPane, VPos.TOP); + layout = createGridLayout(); layout.add(new Label("Chaturbate User"), 0, 0); username = new TextField(Config.getInstance().getSettings().username); @@ -299,7 +308,7 @@ public class SettingsTab extends Tab { setRecordingMode(recordLocal.isSelected()); } - private void showRestartRequired() { + static void showRestartRequired() { Alert restart = new AutosizeAlert(AlertType.INFORMATION); restart.setTitle("Restart required"); restart.setHeaderText("Restart required"); @@ -307,7 +316,7 @@ public class SettingsTab extends Tab { restart.show(); } - private GridPane createGridLayout() { + static GridPane createGridLayout() { GridPane layout = new GridPane(); layout.setPadding(new Insets(10)); layout.setHgap(5); @@ -502,4 +511,17 @@ public class SettingsTab extends Tab { } } } + + @Override + public void selected() { + } + + @Override + public void deselected() { + saveConfig(); + } + + public void saveConfig() { + proxySettingsPane.saveConfig(); + } }