commit 962d30c72ffc85c1df79270d6ac5b25f0336d2d2 Author: Mike Perry mikeperry-git@fscked.org Date: Sat Jun 25 10:37:22 2011 -0700
Allow TorCtl.connect() to specify alternate Connection classes.
Need to move it for that... --- TorCtl.py | 156 +++++++++++++++++++++++++++++++------------------------------ 1 files changed, 80 insertions(+), 76 deletions(-)
diff --git a/TorCtl.py b/TorCtl.py index ac49574..a110679 100755 --- a/TorCtl.py +++ b/TorCtl.py @@ -96,82 +96,6 @@ AUTH_TYPE = Enum2(
INCORRECT_PASSWORD_MSG = "Provided passphrase was incorrect"
-def connect(controlAddr="127.0.0.1", controlPort=9051, passphrase=None): - """ - Convenience function for quickly getting a TorCtl connection. This is very - handy for debugging or CLI setup, handling setup and prompting for a password - if necessary (if either none is provided as input or it fails). If any issues - arise this prints a description of the problem and returns None. - - Arguments: - controlAddr - ip address belonging to the controller - controlPort - port belonging to the controller - passphrase - authentication passphrase (if defined this is used rather - than prompting the user) - """ - - conn = None - try: - conn, authType, authValue = preauth_connect(controlAddr, controlPort) - - if authType == AUTH_TYPE.PASSWORD: - # password authentication, promting for the password if it wasn't provided - if passphrase: authValue = passphrase - else: - try: authValue = getpass.getpass() - except KeyboardInterrupt: return None - - conn.authenticate(authValue) - return conn - except Exception, exc: - if conn: conn.close() - - if passphrase and str(exc) == "Unable to authenticate: password incorrect": - # provide a warning that the provided password didn't work, then try - # again prompting for the user to enter it - print INCORRECT_PASSWORD_MSG - return connect(controlAddr, controlPort) - else: - print exc - return None - -def preauth_connect(controlAddr="127.0.0.1", controlPort=9051): - """ - Provides an uninitiated torctl connection components for the control port, - returning a tuple of the form... - (torctl connection, authType, authValue) - - The authValue corresponds to the cookie path if using an authentication - cookie, otherwise this is the empty string. This raises an IOError in case - of failure. - - Arguments: - controlAddr - ip address belonging to the controller - controlPort - port belonging to the controller - """ - - conn = None - try: - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.connect((controlAddr, controlPort)) - conn = Connection(s) - authType, authValue = conn.get_auth_type(), "" - - if authType == AUTH_TYPE.COOKIE: - authValue = conn.get_auth_cookie_path() - - return (conn, authType, authValue) - except socket.error, exc: - if conn: conn.close() - - if "Connection refused" in exc.args: - # most common case - tor control port isn't available - raise IOError("Connection refused. Is the ControlPort enabled?") - - raise IOError("Failed to establish socket: %s" % exc) - except Exception, exc: - if conn: conn.close() - raise IOError(exc)
class TorCtlError(Exception): "Generic error raised by TorControl code." @@ -1903,3 +1827,83 @@ def parseHostAndPort(h):
return host, port
+def connect(controlAddr="127.0.0.1", controlPort=9051, passphrase=None, + ConnClass=Connection): + """ + Convenience function for quickly getting a TorCtl connection. This is very + handy for debugging or CLI setup, handling setup and prompting for a password + if necessary (if either none is provided as input or it fails). If any issues + arise this prints a description of the problem and returns None. + + Arguments: + controlAddr - ip address belonging to the controller + controlPort - port belonging to the controller + passphrase - authentication passphrase (if defined this is used rather + than prompting the user) + """ + + conn = None + try: + conn, authType, authValue = preauth_connect(controlAddr, controlPort, + ConnClass) + + if authType == AUTH_TYPE.PASSWORD: + # password authentication, promting for the password if it wasn't provided + if passphrase: authValue = passphrase + else: + try: authValue = getpass.getpass() + except KeyboardInterrupt: return None + + conn.authenticate(authValue) + return conn + except Exception, exc: + if conn: conn.close() + + if passphrase and str(exc) == "Unable to authenticate: password incorrect": + # provide a warning that the provided password didn't work, then try + # again prompting for the user to enter it + print INCORRECT_PASSWORD_MSG + return connect(controlAddr, controlPort) + else: + print exc + return None + +def preauth_connect(controlAddr="127.0.0.1", controlPort=9051, + ConnClass=Connection): + """ + Provides an uninitiated torctl connection components for the control port, + returning a tuple of the form... + (torctl connection, authType, authValue) + + The authValue corresponds to the cookie path if using an authentication + cookie, otherwise this is the empty string. This raises an IOError in case + of failure. + + Arguments: + controlAddr - ip address belonging to the controller + controlPort - port belonging to the controller + """ + + conn = None + try: + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.connect((controlAddr, controlPort)) + conn = ConnClass(s) + authType, authValue = conn.get_auth_type(), "" + + if authType == AUTH_TYPE.COOKIE: + authValue = conn.get_auth_cookie_path() + + return (conn, authType, authValue) + except socket.error, exc: + if conn: conn.close() + + if "Connection refused" in exc.args: + # most common case - tor control port isn't available + raise IOError("Connection refused. Is the ControlPort enabled?") + + raise IOError("Failed to establish socket: %s" % exc) + except Exception, exc: + if conn: conn.close() + raise IOError(exc) +
tor-commits@lists.torproject.org