commit 120907822f06fd476f2c47b7135e816cd730b1c7 Author: Damian Johnson atagar@torproject.org Date: Sat Dec 8 23:41:21 2012 -0800
Only using TAKEOWNERSHIP if we're on the local system
We were using TAKEOWNERSHIP if our pid matched tor's __OwningControllerProcess. However, doing this doesn't make sense if we're connecting remotely. Caught by Robert on...
https://trac.torproject.org/7666 --- stem/control.py | 4 ++-- stem/socket.py | 16 ++++++++++++++++ test/integ/process.py | 2 +- 3 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/stem/control.py b/stem/control.py index be589d9..8d9784e 100644 --- a/stem/control.py +++ b/stem/control.py @@ -1511,7 +1511,7 @@ class Controller(BaseController):
owning_pid = self.get_conf("__OwningControllerProcess", None)
- if owning_pid == str(os.getpid()): + if owning_pid == str(os.getpid()) and self.get_socket().is_localhost(): response = self.msg("TAKEOWNERSHIP") stem.response.convert("SINGLELINE", response)
@@ -1524,7 +1524,7 @@ class Controller(BaseController): except stem.ControllerError, exc: log.warn("We were unable to reset tor's __OwningControllerProcess configuration. It will continue to periodically check if our pid exists. (%s)" % response) else: - log.warn("We were unable assert ownership of tor through TAKEOWNERSHIP, despite being configured to be the owning process thrugh __OwningControllerProcess. (%s)" % response) + log.warn("We were unable assert ownership of tor through TAKEOWNERSHIP, despite being configured to be the owning process through __OwningControllerProcess. (%s)" % response)
def _handle_event(self, event_message): stem.response.convert("EVENT", event_message, arrived_at = time.time()) diff --git a/stem/socket.py b/stem/socket.py index 4cbfb3e..adfc83e 100644 --- a/stem/socket.py +++ b/stem/socket.py @@ -18,6 +18,7 @@ as instances of the :class:`~stem.response.ControlMessage` class. |- send - sends a message to the socket |- recv - receives a ControlMessage from the socket |- is_alive - reports if the socket is known to be closed + |- is_localhost - returns if the socket is for the local system or not |- connect - connects a new socket |- close - shuts down the socket +- __enter__ / __exit__ - manages socket connection @@ -145,6 +146,15 @@ class ControlSocket(object):
return self._is_alive
+ def is_localhost(self): + """ + Returns if the connection is for the local system or not. + + :returns: **bool** that's **True** if the connection is for the local host and **False** otherwise + """ + + return False + def connect(self): """ Connects to a new socket, closing our previous one if we're already @@ -300,6 +310,9 @@ class ControlPort(ControlSocket):
return self._control_port
+ def is_localhost(self): + return self._control_addr == "127.0.0.1" + def _make_socket(self): try: control_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) @@ -339,6 +352,9 @@ class ControlSocketFile(ControlSocket):
return self._socket_path
+ def is_localhost(self): + return True + def _make_socket(self): try: control_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) diff --git a/test/integ/process.py b/test/integ/process.py index ee21d5a..5811e37 100644 --- a/test/integ/process.py +++ b/test/integ/process.py @@ -113,7 +113,7 @@ class TestProcess(unittest.TestCase): # needing to a _get_pid() helper but after much head scratching I haven't # been able to mock os.getpid() or posix.getpid().
- sleep_process = subprocess.Popen(['sleep', '10']) + sleep_process = subprocess.Popen(['sleep', '60']) mocking.mock(stem.process._get_pid, mocking.return_value(str(sleep_process.pid)))
tor_process = stem.process.launch_tor_with_config(