diff --git a/deluge/core/core.py b/deluge/core/core.py index 198410e318..867e3b0532 100644 --- a/deluge/core/core.py +++ b/deluge/core/core.py @@ -817,6 +817,11 @@ def set_config(self, config: Dict[str, Any]): continue self.config[key] = config[key] + @export + def is_valid_interface(self, interface: str) -> bool: + """Returns True is valid interface""" + return deluge.common.is_interface(interface) + @export def get_listen_port(self) -> int: """Returns the active listen port""" diff --git a/deluge/tests/test_client.py b/deluge/tests/test_client.py index 5a67279077..70ab4bdbb2 100644 --- a/deluge/tests/test_client.py +++ b/deluge/tests/test_client.py @@ -8,7 +8,7 @@ from twisted.internet import defer from deluge import error -from deluge.common import AUTH_LEVEL_NORMAL, get_localhost_auth +from deluge.common import AUTH_LEVEL_NORMAL, get_localhost_auth, get_version from deluge.core.authmanager import AUTH_LEVEL_ADMIN from deluge.ui.client import Client, DaemonSSLProxy, client @@ -170,3 +170,23 @@ def on_failure(failure): d.addCallbacks(self.fail, on_failure) return d + + @pytest_twisted.inlineCallbacks + def test_connection_version(self): + username, password = get_localhost_auth() + yield client.connect( + 'localhost', self.listen_port, username=username, password=password + ) + + assert client.connection_version() == get_version() + + @pytest_twisted.inlineCallbacks + def test_daemon_version_above(self): + username, password = get_localhost_auth() + yield client.connect( + 'localhost', self.listen_port, username=username, password=password + ) + + assert client.is_daemon_version_equal_or_greater(get_version()) + assert not client.is_daemon_version_equal_or_greater(f'{get_version()}1') + assert client.is_daemon_version_equal_or_greater('0.1.0') diff --git a/deluge/ui/client.py b/deluge/ui/client.py index 6b657d5ca5..86e106d38a 100644 --- a/deluge/ui/client.py +++ b/deluge/ui/client.py @@ -15,7 +15,7 @@ from twisted.internet.protocol import ClientFactory from deluge import error -from deluge.common import get_localhost_auth, get_version +from deluge.common import VersionSplit, get_localhost_auth, get_version from deluge.decorators import deprecated from deluge.transfer import DelugeTransferProtocol @@ -227,6 +227,7 @@ def clientConnectionLost(self, connector, reason): # NOQA: N802 self.daemon.host = None self.daemon.port = None self.daemon.username = None + self.daemon.daemon_info = None self.daemon.connected = False if ( @@ -260,6 +261,7 @@ def __init__(self, event_handlers=None): self.host = None self.port = None self.username = None + self.daemon_info = None self.authentication_level = 0 self.connected = False @@ -741,6 +743,25 @@ def connection_info(self): return None + def connection_version(self): + """ + Get the connected daemon version + + Returns: + str: the daemon version + """ + if self.connected(): + return self._daemon_proxy.daemon_info + + return '' + + def is_daemon_version_equal_or_greater(self, version_check): + if VersionSplit(version_check) and self.connected(): + daemon_version = self.connection_version() + return VersionSplit(daemon_version) >= VersionSplit(version_check) + + return False + def register_event_handler(self, event, handler): """ Registers a handler that will be called when an event is received from the daemon. diff --git a/deluge/ui/console/modes/preferences/preference_panes.py b/deluge/ui/console/modes/preferences/preference_panes.py index b47bc4b079..afcb76945c 100644 --- a/deluge/ui/console/modes/preferences/preference_panes.py +++ b/deluge/ui/console/modes/preferences/preference_panes.py @@ -8,7 +8,6 @@ import logging -from deluge.common import is_interface from deluge.decorators import overrides from deluge.i18n import get_languages from deluge.ui.client import client @@ -91,11 +90,19 @@ def add_config_values(self, conf_dict): ) elif ipt.name == 'listen_interface': listen_interface = ipt.get_value().strip() - if is_interface(listen_interface) or not listen_interface: + if ( + client.is_daemon_version_equal_or_greater('2.1.1') + and client.core.is_valid_interface(listen_interface) + or not listen_interface + ): conf_dict['listen_interface'] = listen_interface elif ipt.name == 'outgoing_interface': outgoing_interface = ipt.get_value().strip() - if is_interface(outgoing_interface) or not outgoing_interface: + if ( + client.is_daemon_version_equal_or_greater('2.1.1') + and client.core.is_valid_interface(outgoing_interface) + or not outgoing_interface + ): conf_dict['outgoing_interface'] = outgoing_interface elif ipt.name.startswith('proxy_'): if ipt.name == 'proxy_type': diff --git a/deluge/ui/gtk3/preferences.py b/deluge/ui/gtk3/preferences.py index 3463b70c06..9857599616 100644 --- a/deluge/ui/gtk3/preferences.py +++ b/deluge/ui/gtk3/preferences.py @@ -676,15 +676,21 @@ def set_config(self, hide=False): 'chk_random_outgoing_ports' ).get_active() incoming_address = self.builder.get_object('entry_interface').get_text().strip() - if deluge.common.is_interface(incoming_address) or not incoming_address: + if ( + client.is_daemon_version_equal_or_greater('2.1.1') + and client.core.is_valid_interface(incoming_address) + or not incoming_address + ): new_core_config['listen_interface'] = incoming_address outgoing_address = ( self.builder.get_object('entry_outgoing_interface').get_text().strip() ) - if deluge.common.is_interface(outgoing_address) or not outgoing_address: - new_core_config['outgoing_interface'] = ( - self.builder.get_object('entry_outgoing_interface').get_text().strip() - ) + if ( + client.is_daemon_version_equal_or_greater('2.1.1') + and client.core.is_valid_interface(outgoing_address) + or not outgoing_address + ): + new_core_config['outgoing_interface'] = outgoing_address new_core_config['peer_tos'] = self.builder.get_object( 'entry_peer_tos' ).get_text() diff --git a/deluge/ui/web/js/deluge-all/preferences/NetworkPage.js b/deluge/ui/web/js/deluge-all/preferences/NetworkPage.js index 5ba98e7e26..1249196121 100644 --- a/deluge/ui/web/js/deluge-all/preferences/NetworkPage.js +++ b/deluge/ui/web/js/deluge-all/preferences/NetworkPage.js @@ -35,7 +35,7 @@ Deluge.preferences.Network = Ext.extend(Ext.form.FormPanel, { fieldset = this.add({ xtype: 'fieldset', border: false, - title: _('Incoming Address'), + title: _('Incoming Interface'), style: 'margin-bottom: 5px; padding-bottom: 0px;', autoHeight: true, labelWidth: 1,