From 59b0b51f248feb0e25cac238f329c31c7b3eb4b0 Mon Sep 17 00:00:00 2001 From: ThomasV Date: Mon, 27 Mar 2017 18:59:48 +0200 Subject: [PATCH] add proxy settings to kivy GUI --- gui/kivy/uix/dialogs/settings.py | 38 +++++++++++++++++++- gui/kivy/uix/ui_screens/proxy.kv | 60 ++++++++++++++++++++++++++++++++ gui/qt/network_dialog.py | 8 ----- lib/network.py | 9 ++++- 4 files changed, 105 insertions(+), 10 deletions(-) create mode 100644 gui/kivy/uix/ui_screens/proxy.kv diff --git a/gui/kivy/uix/dialogs/settings.py b/gui/kivy/uix/dialogs/settings.py index e2cffb8d8..289aab6ce 100644 --- a/gui/kivy/uix/dialogs/settings.py +++ b/gui/kivy/uix/dialogs/settings.py @@ -96,6 +96,12 @@ Builder.load_string(''' description: _("Network status and server selection.") action: partial(root.network_dialog, self) CardSeparator + SettingsItem: + status: root.proxy_status() + title: _('Proxy') + ': ' + self.status + description: _("Proxy configuration.") + action: partial(root.proxy_dialog, self) + CardSeparator SettingsItem: status: 'ON' if bool(app.plugins.get('labels')) else 'OFF' title: _('Labels Sync') + ': ' + self.status @@ -137,6 +143,7 @@ class SettingsDialog(Factory.Popup): self._fee_dialog = None self._rbf_dialog = None self._network_dialog = None + self._proxy_dialog = None self._language_dialog = None self._unit_dialog = None self._coinselect_dialog = None @@ -195,10 +202,39 @@ class SettingsDialog(Factory.Popup): if value: self.app.network.blockchain.set_checkpoint(height, value) item.status = self.checkpoint_status() - self._checkpoint_dialog = CheckpointDialog(self.app.network, callback) self._checkpoint_dialog.open() + def proxy_status(self): + server, port, protocol, proxy, auto_connect = self.app.network.get_parameters() + return proxy.get('host') +':' + proxy.get('port') if proxy else _('None') + + def proxy_dialog(self, item, dt): + if self._proxy_dialog is None: + server, port, protocol, proxy, auto_connect = self.app.network.get_parameters() + def callback(popup): + if popup.ids.mode.text != 'None': + proxy = { + 'mode':popup.ids.mode.text, + 'host':popup.ids.host.text, + 'port':popup.ids.port.text, + 'user':popup.ids.user.text, + 'password':popup.ids.password.text + } + else: + proxy = None + self.app.network.set_parameters(server, port, protocol, proxy, auto_connect) + item.status = self.proxy_status() + popup = Builder.load_file('gui/kivy/uix/ui_screens/proxy.kv') + popup.ids.mode.text = proxy.get('mode') if proxy else 'None' + popup.ids.host.text = proxy.get('host') if proxy else '' + popup.ids.port.text = proxy.get('port') if proxy else '' + popup.ids.user.text = proxy.get('user') if proxy else '' + popup.ids.password.text = proxy.get('password') if proxy else '' + popup.on_dismiss = lambda: callback(popup) + self._proxy_dialog = popup + self._proxy_dialog.open() + def network_dialog(self, item, dt): if self._network_dialog is None: server, port, protocol, proxy, auto_connect = self.app.network.get_parameters() diff --git a/gui/kivy/uix/ui_screens/proxy.kv b/gui/kivy/uix/ui_screens/proxy.kv new file mode 100644 index 000000000..81badc68d --- /dev/null +++ b/gui/kivy/uix/ui_screens/proxy.kv @@ -0,0 +1,60 @@ +Popup: + id: nd + title: _('Proxy') + BoxLayout: + orientation: 'vertical' + padding: '10dp' + spacing: '10dp' + GridLayout: + cols: 2 + Label: + text: _('Proxy mode') + Spinner: + id: mode + height: '48dp' + size_hint_y: None + text: '' + values: ['None', 'socks4', 'socks5', 'http'] + Label: + text: _('Host') + TextInput: + id: host + height: '48dp' + size_hint_y: None + text: '' + disabled: mode.text == 'None' + Label: + text: _('Port') + TextInput: + id: port + height: '48dp' + size_hint_y: None + text: '' + disabled: mode.text == 'None' + Label: + text: _('Username') + TextInput: + id: user + height: '48dp' + size_hint_y: None + text: '' + disabled: mode.text == 'None' + Label: + text: _('Password') + TextInput: + id: password + height: '48dp' + size_hint_y: None + text: '' + disabled: mode.text == 'None' + Widget: + size_hint: 1, 0.1 + BoxLayout: + Widget: + size_hint: 0.5, None + Button: + size_hint: 0.5, None + height: '48dp' + text: _('OK') + on_release: + nd.dismiss() diff --git a/gui/qt/network_dialog.py b/gui/qt/network_dialog.py index 683f090be..c0b7d6b03 100644 --- a/gui/qt/network_dialog.py +++ b/gui/qt/network_dialog.py @@ -318,12 +318,6 @@ class NetworkChoiceLayout(object): host = str(self.server_host.text()) port = str(self.server_port.text()) protocol = 's' if self.ssl_cb.isChecked() else 't' - # sanitize - try: - deserialize_server(serialize_server(host, port, protocol)) - except: - return - if self.proxy_mode.currentText() != 'NONE': proxy = { 'mode':str(self.proxy_mode.currentText()).lower(), 'host':str(self.proxy_host.text()), @@ -332,9 +326,7 @@ class NetworkChoiceLayout(object): 'password':str(self.proxy_password.text())} else: proxy = None - auto_connect = self.autoconnect_cb.isChecked() - self.network.set_parameters(host, port, protocol, proxy, auto_connect) self.network.blockchain.set_checkpoint(self.checkpoint_height, self.checkpoint_value) diff --git a/lib/network.py b/lib/network.py index a0750b223..876dacd4e 100644 --- a/lib/network.py +++ b/lib/network.py @@ -461,13 +461,20 @@ class Network(util.DaemonThread): def set_parameters(self, host, port, protocol, proxy, auto_connect): proxy_str = serialize_proxy(proxy) server = serialize_server(host, port, protocol) + # sanitize parameters + try: + deserialize_server(serialize_server(host, port, protocol)) + if proxy: + proxy_modes.index(proxy["mode"]) + 1 + int(proxy['port']) + except: + return self.config.set_key('auto_connect', auto_connect, False) self.config.set_key("proxy", proxy_str, False) self.config.set_key("server", server, True) # abort if changes were not allowed by config if self.config.get('server') != server or self.config.get('proxy') != proxy_str: return - self.auto_connect = auto_connect if self.proxy != proxy or self.protocol != protocol: # Restart the network defaulting to the given server