commit 59b0b51f248feb0e25cac238f329c31c7b3eb4b0
parent 2fcdd458b3af68b46fd9e7b2f42921c924b9ba9a
Author: ThomasV <thomasv@electrum.org>
Date: Mon, 27 Mar 2017 18:59:48 +0200
add proxy settings to kivy GUI
Diffstat:
4 files changed, 105 insertions(+), 10 deletions(-)
diff --git a/gui/kivy/uix/dialogs/settings.py b/gui/kivy/uix/dialogs/settings.py
@@ -97,6 +97,12 @@ Builder.load_string('''
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
description: _("Save and synchronize your labels.")
@@ -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
@@ -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
@@ -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
@@ -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