commit 66a9b77e165dfe47e3b32a84080b59f47cc85dc1 Author: Damian Johnson atagar@torproject.org Date: Tue Oct 31 10:01:35 2017 -0700
Recognize additional representations of 'localhost' in get_ports()
Tim and Sebastian pointed out that we're still not doing correct localhost detection...
https://trac.torproject.org/projects/tor/ticket/24085 --- stem/control.py | 14 +++++++++++++- test/unit/control/controller.py | 10 +++++++++- 2 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/stem/control.py b/stem/control.py index 19619190..7c67cd0d 100644 --- a/stem/control.py +++ b/stem/control.py @@ -1323,7 +1323,19 @@ class Controller(BaseController): and no default was provided """
- return [port for (addr, port) in self.get_listeners(listener_type) if addr in ('127.0.0.1', '0.0.0.0')] + def is_localhost(address): + if stem.util.connection.is_valid_ipv4_address(address): + return address == '0.0.0.0' or address.startswith('127.') + elif stem.util.connection.is_valid_ipv6_address(address): + return stem.util.connection.expand_ipv6_address(address) in ( + '0000:0000:0000:0000:0000:0000:0000:0000', + '0000:0000:0000:0000:0000:0000:0000:0001', + ) + else: + log.info("Request for %s ports got an address that's neither IPv4 or IPv6: %s" % (listener_type, address)) + return False + + return [port for (addr, port) in self.get_listeners(listener_type) if is_localhost(addr)]
@with_default() def get_listeners(self, listener_type, default = UNDEFINED): diff --git a/test/unit/control/controller.py b/test/unit/control/controller.py index a9a7e73d..929adcfc 100644 --- a/test/unit/control/controller.py +++ b/test/unit/control/controller.py @@ -227,7 +227,7 @@ class TestControl(unittest.TestCase): self.assertEqual([], self.controller.get_ports(Listener.CONTROL)) self.controller.clear_cache()
- # Exercise via the GETINFO option. + # exercise via the GETINFO option
get_info_mock.side_effect = None get_info_mock.return_value = '"127.0.0.1:1112" "127.0.0.1:1114"' @@ -240,6 +240,14 @@ class TestControl(unittest.TestCase): self.assertEqual([1112, 1114], self.controller.get_ports(Listener.CONTROL)) self.controller.clear_cache()
+ # with all localhost addresses, including a couple that aren't + + get_info_mock.side_effect = None + get_info_mock.return_value = '"27.4.4.1:1113" "127.0.0.5:1114" "0.0.0.0:1115" "[::]:1116" "[::1]:1117" "[10::]:1118"' + + self.assertEqual([1114, 1115, 1116, 1117], self.controller.get_ports(Listener.OR)) + self.controller.clear_cache() + # IPv6 address
get_info_mock.return_value = '"0.0.0.0:9001" "[fe80:0000:0000:0000:0202:b3ff:fe1e:8329]:9001"'
tor-commits@lists.torproject.org