[tor-commits] [stem/master] Adding a BaseController is_authenticated() method
atagar at torproject.org
atagar at torproject.org
Wed Jan 16 17:30:07 UTC 2013
commit 32092205f1be4ccc01ac2cd4bd78a63fd732ae45
Author: Damian Johnson <atagar at torproject.org>
Date: Wed Jan 16 07:38:29 2013 -0800
Adding a BaseController is_authenticated() method
I've been running into some situations where I need to know if the controller
is not only connected, but authenticated (since that determines if it's...
well, usable).
A use case where this could get confused is...
* User gets a ControlSocket instance.
* Manually authenticates via the send() and recv() methods.
* Makes a new Controller object from this control socket.
Unfortunately this is *exactly* what our test runner did, so tweaking it so
that it hits our post_authentication method (I'm surprised that it hadn't
bitten us before).
---
stem/control.py | 23 +++++++++++++++++++++--
test/runner.py | 9 +++++++--
2 files changed, 28 insertions(+), 4 deletions(-)
diff --git a/stem/control.py b/stem/control.py
index 5649b59..35d9701 100644
--- a/stem/control.py
+++ b/stem/control.py
@@ -62,6 +62,7 @@ providing its own for interacting at a higher level.
BaseController - Base controller class asynchronous message handling
|- msg - communicates with the tor process
|- is_alive - reports if our connection to tor is open or closed
+ |- is_authenticated - checks if we're authenticated to tor
|- connect - connects or reconnects to tor
|- close - shuts down our connection to the tor process
|- get_socket - provides the socket used for control communication
@@ -253,6 +254,7 @@ class BaseController(object):
self._socket._close = self._close
self._last_heartbeat = 0.0 # timestamp for when we last heard from tor
+ self._is_authenticated = False
if self._socket.is_alive():
self._launch_threads()
@@ -346,6 +348,19 @@ class BaseController(object):
return self._socket.is_alive()
+ def is_authenticated(self):
+ """
+ Checks if our socket is both connected and authenticated.
+
+ :returns: **bool** that's **True** if our socket is authenticated to tor
+ and **False** otherwise
+ """
+
+ if self.is_alive():
+ return self._is_authenticated
+
+ return False
+
def connect(self):
"""
Reconnects our control socket. This is a pass-through for our socket's
@@ -456,6 +471,7 @@ class BaseController(object):
self._launch_threads()
self._notify_status_listeners(State.INIT)
self._socket_connect()
+ self._is_authenticated = False
def _close(self):
# Our is_alive() state is now false. Our reader thread should already be
@@ -463,6 +479,7 @@ class BaseController(object):
# too so it can end.
self._event_notice.set()
+ self._is_authenticated = False
# joins on our threads if it's safe to do so
@@ -476,7 +493,7 @@ class BaseController(object):
def _post_authentication(self):
# actions to be taken after we have a newly authenticated connection
- pass
+ self._is_authenticated = True
def _notify_status_listeners(self, state):
"""
@@ -1928,6 +1945,8 @@ class Controller(BaseController):
return response.entries
def _post_authentication(self):
+ super(Controller, self)._post_authentication()
+
# try to re-attach event listeners to the new instance
try:
@@ -1950,7 +1969,7 @@ class Controller(BaseController):
try:
self.reset_conf("__OwningControllerProcess")
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)
+ log.warn("We were unable to reset tor's __OwningControllerProcess configuration. It will continue to periodically check if our pid exists. (%s)" % exc)
else:
log.warn("We were unable assert ownership of tor through TAKEOWNERSHIP, despite being configured to be the owning process through __OwningControllerProcess. (%s)" % response)
diff --git a/test/runner.py b/test/runner.py
index 8009e37..799e0d5 100644
--- a/test/runner.py
+++ b/test/runner.py
@@ -546,8 +546,13 @@ class Runner(object):
:raises: :class: `test.runner.TorInaccessable` if tor can't be connected to
"""
- control_socket = self.get_tor_socket(authenticate)
- return stem.control.Controller(control_socket)
+ control_socket = self.get_tor_socket(False)
+ controller = stem.control.Controller(control_socket)
+
+ if authenticate:
+ controller.authenticate(password = CONTROL_PASSWORD, chroot_path = self.get_chroot())
+
+ return controller
def get_tor_version(self):
"""
More information about the tor-commits
mailing list