diff --git a/NEWS b/NEWS index ef85eff..07ab799 100644 --- a/NEWS +++ b/NEWS @@ -12,28 +12,20 @@ Issues noted as "Fabric #NN" can be found at https://github.com/fabric/fabric/. Releases ======== -v1.11.0 (DD MM YYYY) --------------------- +v1.10.3 (20th Sep 2013) +----------------------- -* #98: On Windows, when interacting with the PuTTY PAgeant, Paramiko now - creates the shared memory map with explicit Security Attributes of the user, - which is the same technique employed by the canonical PuTTY library to avoid - permissions issues when Paramiko is running under a different UAC context - than the PuTTY Ageant process. Thanks to Jason R. Coombs for the patch. -* #100: Remove use of PyWin32 in `win_pageant` module. Module was already - dependent on ctypes for constructing appropriate structures and had ctypes - implementations of all functionality. Thanks to Jason R. Coombs for the - patch. -* #87: Ensure updates to `known_hosts` files account for any updates to said - files after Paramiko initially read them. (Includes related fix to guard - against duplicate entries during subsequent `known_hosts` loads.) Thanks to - `@sunweaver` for the contribution. +* #162: Clean up HMAC module import to avoid deadlocks in certain uses of + SSHClient. Thanks to Gernot Hillier for the catch & suggested + fix. +* #36: Fix the port-forwarding demo to avoid file descriptor errors. Thanks to + Jonathan Halcrow for catch & patch. -v1.10.2 (DD MM 2013) --------------------- +v1.10.2 (26th Jul 2013) +----------------------- -* #153, #67: Warn on parse failure when reading known_hosts - file. Thanks to `@glasserc` for patch. +* #153, #67: Warn on parse failure when reading known_hosts file. Thanks to + `@glasserc` for patch. * #146: Indentation fixes for readability. Thanks to Abhinav Upadhyay for catch & patch. diff --git a/demos/forward.py b/demos/forward.py index 4e10785..2a4c424 100644 --- a/demos/forward.py +++ b/demos/forward.py @@ -78,9 +78,11 @@ class Handler (SocketServer.BaseRequestHandler): if len(data) == 0: break self.request.send(data) + + peername = self.request.getpeername() chan.close() self.request.close() - verbose('Tunnel closed from %r' % (self.request.getpeername(),)) + verbose('Tunnel closed from %r' % (peername,)) def forward_tunnel(local_port, remote_host, remote_port, transport): diff --git a/paramiko/__init__.py b/paramiko/__init__.py index 099314e..6094c40 100644 --- a/paramiko/__init__.py +++ b/paramiko/__init__.py @@ -55,7 +55,7 @@ if sys.version_info < (2, 5): __author__ = "Jeff Forcier " -__version__ = "1.10.1" +__version__ = "1.10.2" __license__ = "GNU Lesser General Public License (LGPL)" diff --git a/paramiko/packet.py b/paramiko/packet.py index 38a6d4b..be502e9 100644 --- a/paramiko/packet.py +++ b/paramiko/packet.py @@ -33,17 +33,13 @@ from paramiko.ssh_exception import SSHException, ProxyCommandFailure from paramiko.message import Message -got_r_hmac = False try: - import r_hmac - got_r_hmac = True + from r_hmac import HMAC except ImportError: - pass + from Crypto.Hash.HMAC import HMAC + def compute_hmac(key, message, digest_class): - if got_r_hmac: - return r_hmac.HMAC(key, message, digest_class).digest() - from Crypto.Hash import HMAC - return HMAC.HMAC(key, message, digest_class).digest() + return HMAC(key, message, digest_class).digest() class NeedRekeyException (Exception):