git: 6f7516452ecf - main - security/py-ssh: Remove obsoleted port

From: Po-Chuan Hsieh <sunpoet_at_FreeBSD.org>
Date: Sat, 30 Apr 2022 16:02:46 UTC
The branch main has been updated by sunpoet:

URL: https://cgit.FreeBSD.org/ports/commit/?id=6f7516452ecf34b5e3da0ccaae3e72de93c98379

commit 6f7516452ecf34b5e3da0ccaae3e72de93c98379
Author:     Po-Chuan Hsieh <sunpoet@FreeBSD.org>
AuthorDate: 2022-04-30 15:57:14 +0000
Commit:     Po-Chuan Hsieh <sunpoet@FreeBSD.org>
CommitDate: 2022-04-30 15:57:14 +0000

    security/py-ssh: Remove obsoleted port
    
    Use security/py-paramiko instead.
    This library originated as a fork of the Paramiko library, and has now been merged back into it.
    
    Approved by:    lwhsu (maintainer)
---
 MOVED                                |   1 +
 security/Makefile                    |   1 -
 security/py-ssh/Makefile             |  20 -
 security/py-ssh/distinfo             |   2 -
 security/py-ssh/files/patch-2to3     | 941 -----------------------------------
 security/py-ssh/files/patch-setup.py |  10 -
 security/py-ssh/pkg-descr            |   6 -
 7 files changed, 1 insertion(+), 980 deletions(-)

diff --git a/MOVED b/MOVED
index 5061a7b1cc6c..17a4eaec9e81 100644
--- a/MOVED
+++ b/MOVED
@@ -17139,3 +17139,4 @@ math/py-gmpy2-devel|math/py-gmpy2|2022-04-22|No more need for the -devel port, p
 net/google-cloud-sdk-app-engine-go||2022-04-27|Obsolete, not supported by the current GCP SDK
 www/py-dj32-django-modelcluster|www/py-django-modelcluster|2022-04-30|Remove obsoleted port. Use www/py-django-modelcluster instead
 www/rubygem-rack-proxy06|www/rubygem-rack-proxy|2022-04-30|Remove obsoleted port. Use www/rubygem-rack-proxy instead
+security/py-ssh|security/py-paramiko|2022-04-30|Remove obsoleted port. Use security/py-paramiko instead
diff --git a/security/Makefile b/security/Makefile
index 4d179e1f055b..66f61f6149ac 100644
--- a/security/Makefile
+++ b/security/Makefile
@@ -973,7 +973,6 @@
     SUBDIR += py-signedjson
     SUBDIR += py-social-auth-core
     SUBDIR += py-spake2
-    SUBDIR += py-ssh
     SUBDIR += py-ssh-audit
     SUBDIR += py-sshpubkeys
     SUBDIR += py-stem
diff --git a/security/py-ssh/Makefile b/security/py-ssh/Makefile
deleted file mode 100644
index e0af68b92494..000000000000
--- a/security/py-ssh/Makefile
+++ /dev/null
@@ -1,20 +0,0 @@
-# Created by: Li-Wen Hsu <lwhsu@FreeBSD.org>
-
-PORTNAME=	ssh
-PORTVERSION=	1.8.0
-PORTREVISION=	1
-CATEGORIES=	security python
-MASTER_SITES=	CHEESESHOP
-PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}
-
-MAINTAINER=	lwhsu@FreeBSD.org
-COMMENT=	Python SSH2 protocol library
-
-RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}pycrypto>=2.1:security/py-pycrypto@${PY_FLAVOR}
-
-USES=		python:3.6+
-USE_PYTHON=	distutils autoplist
-
-NO_ARCH=	yes
-
-.include <bsd.port.mk>
diff --git a/security/py-ssh/distinfo b/security/py-ssh/distinfo
deleted file mode 100644
index 93f673c63174..000000000000
--- a/security/py-ssh/distinfo
+++ /dev/null
@@ -1,2 +0,0 @@
-SHA256 (ssh-1.8.0.tar.gz) = b0aca1faf8a12e6aae24ab9cfae90d061a8741b680c8afad21da6ff8b8ae28d7
-SIZE (ssh-1.8.0.tar.gz) = 795832
diff --git a/security/py-ssh/files/patch-2to3 b/security/py-ssh/files/patch-2to3
deleted file mode 100644
index d3db3ca9d53f..000000000000
--- a/security/py-ssh/files/patch-2to3
+++ /dev/null
@@ -1,941 +0,0 @@
---- ssh/auth_handler.py.orig	2012-04-19 22:17:28 UTC
-+++ ssh/auth_handler.py
-@@ -198,7 +198,7 @@ class AuthHandler (object):
-             if self.auth_method == 'password':
-                 m.add_boolean(False)
-                 password = self.password
--                if isinstance(password, unicode):
-+                if isinstance(password, str):
-                     password = password.encode('UTF-8')
-                 m.add_string(password)
-             elif self.auth_method == 'publickey':
-@@ -308,7 +308,7 @@ class AuthHandler (object):
-             keyblob = m.get_string()
-             try:
-                 key = self.transport._key_info[keytype](Message(keyblob))
--            except SSHException, e:
-+            except SSHException as e:
-                 self.transport._log(INFO, 'Auth rejected: public key: %s' % str(e))
-                 key = None
-             except:
---- ssh/channel.py.orig	2012-05-05 04:45:50 UTC
-+++ ssh/channel.py
-@@ -607,7 +607,7 @@ class Channel (object):
-         """
-         try:
-             out = self.in_buffer.read(nbytes, self.timeout)
--        except PipeTimeout, e:
-+        except PipeTimeout as e:
-             raise socket.timeout()
- 
-         ack = self._check_add_window(len(out))
-@@ -657,7 +657,7 @@ class Channel (object):
-         """
-         try:
-             out = self.in_stderr_buffer.read(nbytes, self.timeout)
--        except PipeTimeout, e:
-+        except PipeTimeout as e:
-             raise socket.timeout()
-             
-         ack = self._check_add_window(len(out))
---- ssh/client.py.orig	2012-09-10 18:40:40 UTC
-+++ ssh/client.py
-@@ -189,8 +189,8 @@ class SSHClient (object):
-         """
-         f = open(filename, 'w')
-         f.write('# SSH host keys collected by ssh\n')
--        for hostname, keys in self._host_keys.iteritems():
--            for keytype, key in keys.iteritems():
-+        for hostname, keys in self._host_keys.items():
-+            for keytype, key in keys.items():
-                 f.write('%s %s %s\n' % (hostname, keytype, key.get_base64()))
-         f.close()
- 
-@@ -326,7 +326,7 @@ class SSHClient (object):
- 
-         if key_filename is None:
-             key_filenames = []
--        elif isinstance(key_filename, (str, unicode)):
-+        elif isinstance(key_filename, str):
-             key_filenames = [ key_filename ]
-         else:
-             key_filenames = key_filename
-@@ -434,7 +434,7 @@ class SSHClient (object):
-                 two_factor = (allowed_types == ['password'])
-                 if not two_factor:
-                     return
--            except SSHException, e:
-+            except SSHException as e:
-                 saved_exception = e
- 
-         if not two_factor:
-@@ -448,7 +448,7 @@ class SSHClient (object):
-                         if not two_factor:
-                             return
-                         break
--                    except SSHException, e:
-+                    except SSHException as e:
-                         saved_exception = e
- 
-         if not two_factor and allow_agent:
-@@ -464,7 +464,7 @@ class SSHClient (object):
-                     if not two_factor:
-                         return
-                     break
--                except SSHException, e:
-+                except SSHException as e:
-                     saved_exception = e
- 
-         if not two_factor:
-@@ -496,16 +496,16 @@ class SSHClient (object):
-                     if not two_factor:
-                         return
-                     break
--                except SSHException, e:
-+                except SSHException as e:
-                     saved_exception = e
--                except IOError, e:
-+                except IOError as e:
-                     saved_exception = e
- 
-         if password is not None:
-             try:
-                 self._transport.auth_password(username, password)
-                 return
--            except SSHException, e:
-+            except SSHException as e:
-                 saved_exception = e
-         elif two_factor:
-             raise SSHException('Two-factor authentication requires a password')
---- ssh/dsskey.py.orig	2012-04-19 22:17:28 UTC
-+++ ssh/dsskey.py
-@@ -93,7 +93,7 @@ class DSSKey (PKey):
- 
-     def sign_ssh_data(self, rng, data):
-         digest = SHA.new(data).digest()
--        dss = DSA.construct((long(self.y), long(self.g), long(self.p), long(self.q), long(self.x)))
-+        dss = DSA.construct((int(self.y), int(self.g), int(self.p), int(self.q), int(self.x)))
-         # generate a suitable k
-         qsize = len(util.deflate_long(self.q, 0))
-         while True:
-@@ -128,7 +128,7 @@ class DSSKey (PKey):
-         sigS = util.inflate_long(sig[20:], 1)
-         sigM = util.inflate_long(SHA.new(data).digest(), 1)
- 
--        dss = DSA.construct((long(self.y), long(self.g), long(self.p), long(self.q)))
-+        dss = DSA.construct((int(self.y), int(self.g), int(self.p), int(self.q)))
-         return dss.verify(sigM, (sigR, sigS))
- 
-     def _encode_key(self):
-@@ -184,7 +184,7 @@ class DSSKey (PKey):
-         # DSAPrivateKey = { version = 0, p, q, g, y, x }
-         try:
-             keylist = BER(data).decode()
--        except BERException, x:
-+        except BERException as x:
-             raise SSHException('Unable to parse key file: ' + str(x))
-         if (type(keylist) is not list) or (len(keylist) < 6) or (keylist[0] != 0):
-             raise SSHException('not a valid DSA private key file (bad ber encoding)')
---- ssh/hostkeys.py.orig	2012-07-15 23:45:13 UTC
-+++ ssh/hostkeys.py
-@@ -79,7 +79,7 @@ class HostKeyEntry:
-                 key = DSSKey(data=base64.decodestring(key))
-             else:
-                 return None
--        except binascii.Error, e:
-+        except binascii.Error as e:
-             raise InvalidHostKey(line, e)
- 
-         return cls(names, key)
-@@ -277,7 +277,7 @@ class HostKeys (UserDict.DictMixin):
-         if len(entry) == 0:
-             self._entries.append(HostKeyEntry([hostname], None))
-             return
--        for key_type in entry.keys():
-+        for key_type in list(entry.keys()):
-             found = False
-             for e in self._entries:
-                 if (hostname in e.hostnames) and (e.key.get_name() == key_type):
-@@ -298,7 +298,7 @@ class HostKeys (UserDict.DictMixin):
- 
-     def values(self):
-         ret = []
--        for k in self.keys():
-+        for k in list(self.keys()):
-             ret.append(self.lookup(k))
-         return ret
- 
---- ssh/kex_group1.py.orig	2012-04-19 22:17:28 UTC
-+++ ssh/kex_group1.py
-@@ -29,10 +29,10 @@ from ssh.message import Message
- from ssh.ssh_exception import SSHException
- 
- 
--_MSG_KEXDH_INIT, _MSG_KEXDH_REPLY = range(30, 32)
-+_MSG_KEXDH_INIT, _MSG_KEXDH_REPLY = list(range(30, 32))
- 
- # draft-ietf-secsh-transport-09.txt, page 17
--P = 0xFFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFFL
-+P = 0xFFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF
- G = 2
- 
- 
-@@ -42,9 +42,9 @@ class KexGroup1(object):
- 
-     def __init__(self, transport):
-         self.transport = transport
--        self.x = 0L
--        self.e = 0L
--        self.f = 0L
-+        self.x = 0
-+        self.e = 0
-+        self.f = 0
- 
-     def start_kex(self):
-         self._generate_x()
---- ssh/message.py.orig	2012-04-19 22:17:28 UTC
-+++ ssh/message.py
-@@ -21,7 +21,7 @@ Implementation of an SSH2 "message".
- """
- 
- import struct
--import cStringIO
-+import io
- 
- from ssh import util
- 
-@@ -46,9 +46,9 @@ class Message (object):
-         @type content: string
-         """
-         if content != None:
--            self.packet = cStringIO.StringIO(content)
-+            self.packet = io.StringIO(content)
-         else:
--            self.packet = cStringIO.StringIO()
-+            self.packet = io.StringIO()
- 
-     def __str__(self):
-         """
-@@ -275,8 +275,8 @@ class Message (object):
-             return self.add_string(i)
-         elif type(i) is int:
-             return self.add_int(i)
--        elif type(i) is long:
--            if i > 0xffffffffL:
-+        elif type(i) is int:
-+            if i > 0xffffffff:
-                 return self.add_mpint(i)
-             else:
-                 return self.add_int(i)
---- ssh/packet.py.orig	2012-09-10 18:40:40 UTC
-+++ ssh/packet.py
-@@ -93,8 +93,8 @@ class Packetizer (object):
-         self.__mac_key_in = ''
-         self.__compress_engine_out = None
-         self.__compress_engine_in = None
--        self.__sequence_number_out = 0L
--        self.__sequence_number_in = 0L
-+        self.__sequence_number_out = 0
-+        self.__sequence_number_in = 0
- 
-         # lock around outbound writes (packet computation)
-         self.__write_lock = threading.RLock()
-@@ -217,7 +217,7 @@ class Packetizer (object):
-                 n -= len(x)
-             except socket.timeout:
-                 got_timeout = True
--            except socket.error, e:
-+            except socket.error as e:
-                 # on Linux, sometimes instead of socket.timeout, we get
-                 # EAGAIN.  this is a bug in recent (> 2.6.9) kernels but
-                 # we need to work around it.
-@@ -246,7 +246,7 @@ class Packetizer (object):
-                 n = self.__socket.send(out)
-             except socket.timeout:
-                 retry_write = True
--            except socket.error, e:
-+            except socket.error as e:
-                 if (type(e.args) is tuple) and (len(e.args) > 0) and (e.args[0] == errno.EAGAIN):
-                     retry_write = True
-                 elif (type(e.args) is tuple) and (len(e.args) > 0) and (e.args[0] == errno.EINTR):
-@@ -311,7 +311,7 @@ class Packetizer (object):
-             if self.__block_engine_out != None:
-                 payload = struct.pack('>I', self.__sequence_number_out) + packet
-                 out += compute_hmac(self.__mac_key_out, payload, self.__mac_engine_out)[:self.__mac_size_out]
--            self.__sequence_number_out = (self.__sequence_number_out + 1) & 0xffffffffL
-+            self.__sequence_number_out = (self.__sequence_number_out + 1) & 0xffffffff
-             self.write_all(out)
- 
-             self.__sent_bytes += len(out)
-@@ -371,7 +371,7 @@ class Packetizer (object):
- 
-         msg = Message(payload[1:])
-         msg.seqno = self.__sequence_number_in
--        self.__sequence_number_in = (self.__sequence_number_in + 1) & 0xffffffffL
-+        self.__sequence_number_in = (self.__sequence_number_in + 1) & 0xffffffff
- 
-         # check for rekey
-         raw_packet_size = packet_size + self.__mac_size_in + 4
-@@ -469,7 +469,7 @@ class Packetizer (object):
-                 break
-             except socket.timeout:
-                 pass
--            except EnvironmentError, e:
-+            except EnvironmentError as e:
-                 if ((type(e.args) is tuple) and (len(e.args) > 0) and
-                     (e.args[0] == errno.EINTR)):
-                     pass
---- ssh/pkey.py.orig	2012-04-19 22:17:28 UTC
-+++ ssh/pkey.py
-@@ -304,7 +304,7 @@ class PKey (object):
-         # if we trudged to the end of the file, just try to cope.
-         try:
-             data = base64.decodestring(''.join(lines[start:end]))
--        except base64.binascii.Error, e:
-+        except base64.binascii.Error as e:
-             raise SSHException('base64 decoding error: ' + str(e))
-         if 'proc-type' not in headers:
-             # unencryped: done
-@@ -346,9 +346,9 @@ class PKey (object):
- 
-         @raise IOError: if there was an error writing the file.
-         """
--        f = open(filename, 'w', 0600)
-+        f = open(filename, 'w', 0o600)
-         # grrr... the mode doesn't always take hold
--        os.chmod(filename, 0600)
-+        os.chmod(filename, 0o600)
-         self._write_private_key(tag, f, data, password)
-         f.close()
- 
-@@ -356,7 +356,7 @@ class PKey (object):
-         f.write('-----BEGIN %s PRIVATE KEY-----\n' % tag)
-         if password is not None:
-             # since we only support one cipher here, use it
--            cipher_name = self._CIPHER_TABLE.keys()[0]
-+            cipher_name = list(self._CIPHER_TABLE.keys())[0]
-             cipher = self._CIPHER_TABLE[cipher_name]['cipher']
-             keysize = self._CIPHER_TABLE[cipher_name]['keysize']
-             blocksize = self._CIPHER_TABLE[cipher_name]['blocksize']
---- ssh/server.py.orig	2012-05-06 22:10:09 UTC
-+++ ssh/server.py
-@@ -48,7 +48,7 @@ class InteractiveQuery (object):
-         self.instructions = instructions
-         self.prompts = []
-         for x in prompts:
--            if (type(x) is str) or (type(x) is unicode):
-+            if (type(x) is str) or (type(x) is str):
-                 self.add_prompt(x)
-             else:
-                 self.add_prompt(x[0], x[1])
-@@ -602,7 +602,7 @@ class SubsystemHandler (threading.Thread):
-         try:
-             self.__transport._log(DEBUG, 'Starting handler for subsystem %s' % self.__name)
-             self.start_subsystem(self.__name, self.__transport, self.__channel)
--        except Exception, e:
-+        except Exception as e:
-             self.__transport._log(ERROR, 'Exception in subsystem handler for "%s": %s' %
-                                   (self.__name, str(e)))
-             self.__transport._log(ERROR, util.tb_strings())
---- ssh/sftp_attr.py.orig	2012-04-19 22:17:28 UTC
-+++ ssh/sftp_attr.py
-@@ -44,7 +44,7 @@ class SFTPAttributes (object):
-     FLAG_UIDGID = 2
-     FLAG_PERMISSIONS = 4
-     FLAG_AMTIME = 8
--    FLAG_EXTENDED = 0x80000000L
-+    FLAG_EXTENDED = 0x80000000
- 
-     def __init__(self):
-         """
-@@ -139,11 +139,11 @@ class SFTPAttributes (object):
-             msg.add_int(self.st_mode)
-         if self._flags & self.FLAG_AMTIME:
-             # throw away any fractional seconds
--            msg.add_int(long(self.st_atime))
--            msg.add_int(long(self.st_mtime))
-+            msg.add_int(int(self.st_atime))
-+            msg.add_int(int(self.st_mtime))
-         if self._flags & self.FLAG_EXTENDED:
-             msg.add_int(len(self.attr))
--            for key, val in self.attr.iteritems():
-+            for key, val in self.attr.items():
-                 msg.add_string(key)
-                 msg.add_string(val)
-         return
-@@ -158,7 +158,7 @@ class SFTPAttributes (object):
-             out += 'mode=' + oct(self.st_mode) + ' '
-         if (self.st_atime is not None) and (self.st_mtime is not None):
-             out += 'atime=%d mtime=%d ' % (self.st_atime, self.st_mtime)
--        for k, v in self.attr.iteritems():
-+        for k, v in self.attr.items():
-             out += '"%s"=%r ' % (str(k), v)
-         out += ']'
-         return out
-@@ -194,13 +194,13 @@ class SFTPAttributes (object):
-                 ks = 's'
-             else:
-                 ks = '?'
--            ks += self._rwx((self.st_mode & 0700) >> 6, self.st_mode & stat.S_ISUID)
--            ks += self._rwx((self.st_mode & 070) >> 3, self.st_mode & stat.S_ISGID)
-+            ks += self._rwx((self.st_mode & 0o700) >> 6, self.st_mode & stat.S_ISUID)
-+            ks += self._rwx((self.st_mode & 0o70) >> 3, self.st_mode & stat.S_ISGID)
-             ks += self._rwx(self.st_mode & 7, self.st_mode & stat.S_ISVTX, True)
-         else:
-             ks = '?---------'
-         # compute display date
--        if (self.st_mtime is None) or (self.st_mtime == 0xffffffffL):
-+        if (self.st_mtime is None) or (self.st_mtime == 0xffffffff):
-             # shouldn't really happen
-             datestr = '(unknown date)'
-         else:
---- ssh/sftp_client.py.orig	2012-08-29 17:56:54 UTC
-+++ ssh/sftp_client.py
-@@ -85,7 +85,7 @@ class SFTPClient (BaseSFTP):
-             self.ultra_debug = transport.get_hexdump()
-         try:
-             server_version = self._send_version()
--        except EOFError, x:
-+        except EOFError as x:
-             raise SSHException('EOF during negotiation')
-         self._log(INFO, 'Opened sftp connection (server version %d)' % server_version)
- 
-@@ -178,7 +178,7 @@ class SFTPClient (BaseSFTP):
-         while True:
-             try:
-                 t, msg = self._request(CMD_READDIR, handle)
--            except EOFError, e:
-+            except EOFError as e:
-                 # done with handle
-                 break
-             if t != CMD_NAME:
-@@ -285,7 +285,7 @@ class SFTPClient (BaseSFTP):
-         self._log(DEBUG, 'rename(%r, %r)' % (oldpath, newpath))
-         self._request(CMD_RENAME, oldpath, newpath)
- 
--    def mkdir(self, path, mode=0777):
-+    def mkdir(self, path, mode=0o777):
-         """
-         Create a folder (directory) named C{path} with numeric mode C{mode}.
-         The default mode is 0777 (octal).  On some systems, mode is ignored.
-@@ -369,7 +369,7 @@ class SFTPClient (BaseSFTP):
-         """
-         dest = self._adjust_cwd(dest)
-         self._log(DEBUG, 'symlink(%r, %r)' % (source, dest))
--        if type(source) is unicode:
-+        if type(source) is str:
-             source = source.encode('utf-8')
-         self._request(CMD_SYMLINK, source, dest)
- 
-@@ -643,7 +643,7 @@ class SFTPClient (BaseSFTP):
-             for item in arg:
-                 if isinstance(item, int):
-                     msg.add_int(item)
--                elif isinstance(item, long):
-+                elif isinstance(item, int):
-                     msg.add_int64(item)
-                 elif isinstance(item, str):
-                     msg.add_string(item)
-@@ -663,7 +663,7 @@ class SFTPClient (BaseSFTP):
-         while True:
-             try:
-                 t, data = self._read_packet()
--            except EOFError, e:
-+            except EOFError as e:
-                 raise SSHException('Server connection dropped: %s' % (str(e),))
-             msg = Message(data)
-             num = msg.get_int()
-@@ -689,7 +689,7 @@ class SFTPClient (BaseSFTP):
-         return (None, None)
- 
-     def _finish_responses(self, fileobj):
--        while fileobj in self._expecting.values():
-+        while fileobj in list(self._expecting.values()):
-             self._read_response()
-             fileobj._check_exception()
- 
-@@ -716,7 +716,7 @@ class SFTPClient (BaseSFTP):
-         Return an adjusted path if we're emulating a "current working
-         directory" for the server.
-         """
--        if type(path) is unicode:
-+        if type(path) is str:
-             path = path.encode('utf-8')
-         if self._cwd is None:
-             return path
---- ssh/sftp_file.py.orig	2012-08-29 17:56:54 UTC
-+++ ssh/sftp_file.py
-@@ -53,12 +53,12 @@ class SFTPFile (BufferedFile):
-         self._saved_exception = None
- 
-     def __del__(self):
--        self._close(async=True)
-+        self._close(asynchronous=True)
-     
-     def close(self):
--        self._close(async=False)
-+        self._close(asynchronous=False)
-         
--    def _close(self, async=False):
-+    def _close(self, asynchronous=False):
-         # We allow double-close without signaling an error, because real
-         # Python file objects do.  However, we must protect against actually
-         # sending multiple CMD_CLOSE packets, because after we close our
-@@ -73,7 +73,7 @@ class SFTPFile (BufferedFile):
-             self.sftp._finish_responses(self)
-         BufferedFile.close(self)
-         try:
--            if async:
-+            if asynchronous:
-                 # GC'd file handle could be called from an arbitrary thread -- don't wait for a response
-                 self.sftp._async_request(type(None), CMD_CLOSE, self.handle)
-             else:
-@@ -107,7 +107,7 @@ class SFTPFile (BufferedFile):
-         return None.  this guarantees nothing about the number of bytes
-         collected in the prefetch buffer so far.
-         """
--        k = [i for i in self._prefetch_data.keys() if i <= offset]
-+        k = [i for i in list(self._prefetch_data.keys()) if i <= offset]
-         if len(k) == 0:
-             return None
-         index = max(k)
-@@ -152,7 +152,7 @@ class SFTPFile (BufferedFile):
-             data = self._read_prefetch(size)
-             if data is not None:
-                 return data
--        t, msg = self.sftp._request(CMD_READ, self.handle, long(self._realpos), int(size))
-+        t, msg = self.sftp._request(CMD_READ, self.handle, int(self._realpos), int(size))
-         if t != CMD_DATA:
-             raise SFTPError('Expected data')
-         return msg.get_string()
-@@ -160,7 +160,7 @@ class SFTPFile (BufferedFile):
-     def _write(self, data):
-         # may write less than requested if it would exceed max packet size
-         chunk = min(len(data), self.MAX_REQUEST_SIZE)
--        req = self.sftp._async_request(type(None), CMD_WRITE, self.handle, long(self._realpos), str(data[:chunk]))
-+        req = self.sftp._async_request(type(None), CMD_WRITE, self.handle, int(self._realpos), str(data[:chunk]))
-         if not self.pipelined or self.sftp.sock.recv_ready():
-             t, msg = self.sftp._read_response(req)
-             if t != CMD_STATUS:
-@@ -340,7 +340,7 @@ class SFTPFile (BufferedFile):
-         @since: 1.4
-         """
-         t, msg = self.sftp._request(CMD_EXTENDED, 'check-file', self.handle,
--                                    hash_algorithm, long(offset), long(length), block_size)
-+                                    hash_algorithm, int(offset), int(length), block_size)
-         ext = msg.get_string()
-         alg = msg.get_string()
-         data = msg.get_remainder()
-@@ -450,14 +450,14 @@ class SFTPFile (BufferedFile):
-         # do these read requests in a temporary thread because there may be
-         # a lot of them, so it may block.
-         for offset, length in chunks:
--            self.sftp._async_request(self, CMD_READ, self.handle, long(offset), int(length))
-+            self.sftp._async_request(self, CMD_READ, self.handle, int(offset), int(length))
- 
-     def _async_response(self, t, msg):
-         if t == CMD_STATUS:
-             # save exception and re-raise it on next file operation
-             try:
-                 self.sftp._convert_status(msg)
--            except Exception, x:
-+            except Exception as x:
-                 self._saved_exception = x
-             return
-         if t != CMD_DATA:
---- ssh/sftp_handle.py.orig	2012-04-19 22:17:28 UTC
-+++ ssh/sftp_handle.py
-@@ -100,7 +100,7 @@ class SFTPHandle (object):
-                 readfile.seek(offset)
-                 self.__tell = offset
-             data = readfile.read(length)
--        except IOError, e:
-+        except IOError as e:
-             self.__tell = None
-             return SFTPServer.convert_errno(e.errno)
-         self.__tell += len(data)
-@@ -139,7 +139,7 @@ class SFTPHandle (object):
-                     self.__tell = offset
-             writefile.write(data)
-             writefile.flush()
--        except IOError, e:
-+        except IOError as e:
-             self.__tell = None
-             return SFTPServer.convert_errno(e.errno)
-         if self.__tell is not None:
---- ssh/sftp_server.py.orig	2012-04-19 22:17:28 UTC
-+++ ssh/sftp_server.py
-@@ -92,7 +92,7 @@ class SFTPServer (BaseSFTP, SubsystemHandler):
-             except EOFError:
-                 self._log(DEBUG, 'EOF -- end of session')
-                 return
--            except Exception, e:
-+            except Exception as e:
-                 self._log(DEBUG, 'Exception on channel: ' + str(e))
-                 self._log(DEBUG, util.tb_strings())
-                 return
-@@ -100,7 +100,7 @@ class SFTPServer (BaseSFTP, SubsystemHandler):
-             request_number = msg.get_int()
-             try:
-                 self._process(t, request_number, msg)
--            except Exception, e:
-+            except Exception as e:
-                 self._log(DEBUG, 'Exception in server processing: ' + str(e))
-                 self._log(DEBUG, util.tb_strings())
-                 # send some kind of failure message, at least
-@@ -113,9 +113,9 @@ class SFTPServer (BaseSFTP, SubsystemHandler):
-         self.server.session_ended()
-         super(SFTPServer, self).finish_subsystem()
-         # close any file handles that were left open (so we can return them to the OS quickly)
--        for f in self.file_table.itervalues():
-+        for f in self.file_table.values():
-             f.close()
--        for f in self.folder_table.itervalues():
-+        for f in self.folder_table.values():
-             f.close()
-         self.file_table = {}
-         self.folder_table = {}
-@@ -179,7 +179,7 @@ class SFTPServer (BaseSFTP, SubsystemHandler):
-         for item in arg:
-             if type(item) is int:
-                 msg.add_int(item)
--            elif type(item) is long:
-+            elif type(item) is int:
-                 msg.add_int64(item)
-             elif type(item) is str:
-                 msg.add_string(item)
---- ssh/transport.py.orig	2012-09-13 23:42:52 UTC
-+++ ssh/transport.py
-@@ -110,8 +110,8 @@ class SecurityOptions (object):
-             x = tuple(x)
-         if type(x) is not tuple:
-             raise TypeError('expected tuple or list')
--        possible = getattr(self._transport, orig).keys()
--        forbidden = filter(lambda n: n not in possible, x)
-+        possible = list(getattr(self._transport, orig).keys())
-+        forbidden = [n for n in x if n not in possible]
-         if len(forbidden) > 0:
-             raise ValueError('unknown cipher')
-         setattr(self._transport, name, x)
-@@ -175,7 +175,7 @@ class ChannelMap (object):
-     def values(self):
-         self._lock.acquire()
-         try:
--            return self._map.values()
-+            return list(self._map.values())
-         finally:
-             self._lock.release()
- 
-@@ -273,7 +273,7 @@ class Transport (threading.Thread):
-         @param sock: a socket or socket-like object to create the session over.
-         @type sock: socket
-         """
--        if isinstance(sock, (str, unicode)):
-+        if isinstance(sock, str):
-             # convert "host:port" into (host, port)
-             hl = sock.split(':', 1)
-             if len(hl) == 1:
-@@ -291,7 +291,7 @@ class Transport (threading.Thread):
-                     sock = socket.socket(af, socket.SOCK_STREAM)
-                     try:
-                         retry_on_signal(lambda: sock.connect((hostname, port)))
--                    except socket.error, e:
-+                    except socket.error as e:
-                         reason = str(e)
-                     else:
-                         break
-@@ -373,7 +373,7 @@ class Transport (threading.Thread):
- 
-         @rtype: str
-         """
--        out = '<ssh.Transport at %s' % hex(long(id(self)) & 0xffffffffL)
-+        out = '<ssh.Transport at %s' % hex(int(id(self)) & 0xffffffff)
-         if not self.active:
-             out += ' (unconnected)'
-         else:
-@@ -616,7 +616,7 @@ class Transport (threading.Thread):
-         self.active = False
-         self.packetizer.close()
-         self.join()
--        for chan in self._channels.values():
-+        for chan in list(self._channels.values()):
-             chan._unlink()
- 
-     def get_remote_server_key(self):
-@@ -690,7 +690,7 @@ class Transport (threading.Thread):
-         """
-         return self.open_channel('auth-agent@openssh.com')
- 
--    def open_forwarded_tcpip_channel(self, (src_addr, src_port), (dest_addr, dest_port)):
-+    def open_forwarded_tcpip_channel(self, xxx_todo_changeme3, xxx_todo_changeme4):
-         """
-         Request a new channel back to the client, of type C{"forwarded-tcpip"}.
-         This is used after a client has requested port forwarding, for sending
-@@ -701,6 +701,8 @@ class Transport (threading.Thread):
-         @param dest_addr: local (server) connected address
-         @param dest_port: local (server) connected port
-         """
-+        (src_addr, src_port) = xxx_todo_changeme3
-+        (dest_addr, dest_port) = xxx_todo_changeme4
-         return self.open_channel('forwarded-tcpip', (dest_addr, dest_port), (src_addr, src_port))
- 
-     def open_channel(self, kind, dest_addr=None, src_addr=None):
-@@ -810,7 +812,9 @@ class Transport (threading.Thread):
-         if port == 0:
-             port = response.get_int()
-         if handler is None:
--            def default_handler(channel, (src_addr, src_port), (dest_addr, dest_port)):
-+            def default_handler(channel, xxx_todo_changeme, xxx_todo_changeme1):
-+                (src_addr, src_port) = xxx_todo_changeme
-+                (dest_addr, dest_port) = xxx_todo_changeme1
-                 self._queue_incoming_channel(channel)
-             handler = default_handler
-         self._tcp_handler = handler
-@@ -1180,7 +1184,7 @@ class Transport (threading.Thread):
-             return []
-         try:
-             return self.auth_handler.wait_for_response(my_event)
--        except BadAuthenticationType, x:
-+        except BadAuthenticationType as x:
-             # if password auth isn't allowed, but keyboard-interactive *is*, try to fudge it
-             if not fallback or ('keyboard-interactive' not in x.allowed_types):
-                 raise
-@@ -1196,7 +1200,7 @@ class Transport (threading.Thread):
-                         return []
-                     return [ password ]
-                 return self.auth_interactive(username, handler)
--            except SSHException, ignored:
-+            except SSHException as ignored:
-                 # attempt failed; just raise the original exception
-                 raise x
-         return None
-@@ -1510,7 +1514,8 @@ class Transport (threading.Thread):
-         # only called if a channel has turned on x11 forwarding
-         if handler is None:
-             # by default, use the same mechanism as accept()
--            def default_handler(channel, (src_addr, src_port)):
-+            def default_handler(channel, xxx_todo_changeme2):
-+                (src_addr, src_port) = xxx_todo_changeme2
-                 self._queue_incoming_channel(channel)
-             self._x11_handler = default_handler
-         else:
-@@ -1541,9 +1546,9 @@ class Transport (threading.Thread):
-         # active=True occurs before the thread is launched, to avoid a race
-         _active_threads.append(self)
-         if self.server_mode:
--            self._log(DEBUG, 'starting thread (server mode): %s' % hex(long(id(self)) & 0xffffffffL))
-+            self._log(DEBUG, 'starting thread (server mode): %s' % hex(int(id(self)) & 0xffffffff))
-         else:
--            self._log(DEBUG, 'starting thread (client mode): %s' % hex(long(id(self)) & 0xffffffffL))
-+            self._log(DEBUG, 'starting thread (client mode): %s' % hex(int(id(self)) & 0xffffffff))
-         try:
-             try:
-                 self.packetizer.write_all(self.local_version + '\r\n')
-@@ -1597,27 +1602,27 @@ class Transport (threading.Thread):
-                         msg.add_byte(chr(MSG_UNIMPLEMENTED))
-                         msg.add_int(m.seqno)
-                         self._send_message(msg)
--            except SSHException, e:
-+            except SSHException as e:
-                 self._log(ERROR, 'Exception: ' + str(e))
-                 self._log(ERROR, util.tb_strings())
-                 self.saved_exception = e
--            except EOFError, e:
-+            except EOFError as e:
-                 self._log(DEBUG, 'EOF in transport thread')
-                 #self._log(DEBUG, util.tb_strings())
-                 self.saved_exception = e
--            except socket.error, e:
-+            except socket.error as e:
-                 if type(e.args) is tuple:
-                     emsg = '%s (%d)' % (e.args[1], e.args[0])
-                 else:
-                     emsg = e.args
-                 self._log(ERROR, 'Socket exception: ' + emsg)
-                 self.saved_exception = e
--            except Exception, e:
-+            except Exception as e:
-                 self._log(ERROR, 'Unknown exception: ' + str(e))
-                 self._log(ERROR, util.tb_strings())
-                 self.saved_exception = e
-             _active_threads.remove(self)
--            for chan in self._channels.values():
-+            for chan in list(self._channels.values()):
-                 chan._unlink()
-             if self.active:
-                 self.active = False
-@@ -1626,7 +1631,7 @@ class Transport (threading.Thread):
-                     self.completion_event.set()
-                 if self.auth_handler is not None:
-                     self.auth_handler.abort()
--                for event in self.channel_events.values():
-+                for event in list(self.channel_events.values()):
-                     event.set()
-                 try:
-                     self.lock.acquire()
-@@ -1670,7 +1675,7 @@ class Transport (threading.Thread):
-                 timeout = 2
-             try:
-                 buf = self.packetizer.readline(timeout)
--            except Exception, x:
-+            except Exception as x:
-                 raise SSHException('Error reading SSH protocol banner' + str(x))
-             if buf[:4] == 'SSH-':
-                 break
-@@ -1712,8 +1717,8 @@ class Transport (threading.Thread):
-                 pkex = list(self.get_security_options().kex)
-                 pkex.remove('diffie-hellman-group-exchange-sha1')
-                 self.get_security_options().kex = pkex
--            available_server_keys = filter(self.server_key_dict.keys().__contains__,
--                                           self._preferred_keys)
-+            available_server_keys = list(filter(list(self.server_key_dict.keys()).__contains__,
-+                                           self._preferred_keys))
-         else:
-             available_server_keys = self._preferred_keys
- 
-@@ -1765,19 +1770,19 @@ class Transport (threading.Thread):
-         # as a server, we pick the first item in the client's list that we support.
-         # as a client, we pick the first item in our list that the server supports.
-         if self.server_mode:
--            agreed_kex = filter(self._preferred_kex.__contains__, kex_algo_list)
-+            agreed_kex = list(filter(self._preferred_kex.__contains__, kex_algo_list))
-         else:
--            agreed_kex = filter(kex_algo_list.__contains__, self._preferred_kex)
-+            agreed_kex = list(filter(kex_algo_list.__contains__, self._preferred_kex))
-         if len(agreed_kex) == 0:
-             raise SSHException('Incompatible ssh peer (no acceptable kex algorithm)')
-         self.kex_engine = self._kex_info[agreed_kex[0]](self)
- 
-         if self.server_mode:
--            available_server_keys = filter(self.server_key_dict.keys().__contains__,
--                                           self._preferred_keys)
--            agreed_keys = filter(available_server_keys.__contains__, server_key_algo_list)
-+            available_server_keys = list(filter(list(self.server_key_dict.keys()).__contains__,
-+                                           self._preferred_keys))
-+            agreed_keys = list(filter(available_server_keys.__contains__, server_key_algo_list))
-         else:
--            agreed_keys = filter(server_key_algo_list.__contains__, self._preferred_keys)
-+            agreed_keys = list(filter(server_key_algo_list.__contains__, self._preferred_keys))
-         if len(agreed_keys) == 0:
-             raise SSHException('Incompatible ssh peer (no acceptable host key)')
-         self.host_key_type = agreed_keys[0]
-@@ -1785,15 +1790,15 @@ class Transport (threading.Thread):
-             raise SSHException('Incompatible ssh peer (can\'t match requested host key type)')
- 
-         if self.server_mode:
--            agreed_local_ciphers = filter(self._preferred_ciphers.__contains__,
--                                           server_encrypt_algo_list)
--            agreed_remote_ciphers = filter(self._preferred_ciphers.__contains__,
--                                          client_encrypt_algo_list)
-+            agreed_local_ciphers = list(filter(self._preferred_ciphers.__contains__,
-+                                           server_encrypt_algo_list))
-+            agreed_remote_ciphers = list(filter(self._preferred_ciphers.__contains__,
-+                                          client_encrypt_algo_list))
-         else:
--            agreed_local_ciphers = filter(client_encrypt_algo_list.__contains__,
--                                          self._preferred_ciphers)
--            agreed_remote_ciphers = filter(server_encrypt_algo_list.__contains__,
--                                           self._preferred_ciphers)
-+            agreed_local_ciphers = list(filter(client_encrypt_algo_list.__contains__,
-+                                          self._preferred_ciphers))
-+            agreed_remote_ciphers = list(filter(server_encrypt_algo_list.__contains__,
-+                                           self._preferred_ciphers))
-         if (len(agreed_local_ciphers) == 0) or (len(agreed_remote_ciphers) == 0):
-             raise SSHException('Incompatible ssh server (no acceptable ciphers)')
-         self.local_cipher = agreed_local_ciphers[0]
-@@ -1801,22 +1806,22 @@ class Transport (threading.Thread):
-         self._log(DEBUG, 'Ciphers agreed: local=%s, remote=%s' % (self.local_cipher, self.remote_cipher))
- 
-         if self.server_mode:
--            agreed_remote_macs = filter(self._preferred_macs.__contains__, client_mac_algo_list)
--            agreed_local_macs = filter(self._preferred_macs.__contains__, server_mac_algo_list)
-+            agreed_remote_macs = list(filter(self._preferred_macs.__contains__, client_mac_algo_list))
-+            agreed_local_macs = list(filter(self._preferred_macs.__contains__, server_mac_algo_list))
-         else:
--            agreed_local_macs = filter(client_mac_algo_list.__contains__, self._preferred_macs)
--            agreed_remote_macs = filter(server_mac_algo_list.__contains__, self._preferred_macs)
-+            agreed_local_macs = list(filter(client_mac_algo_list.__contains__, self._preferred_macs))
-+            agreed_remote_macs = list(filter(server_mac_algo_list.__contains__, self._preferred_macs))
-         if (len(agreed_local_macs) == 0) or (len(agreed_remote_macs) == 0):
-             raise SSHException('Incompatible ssh server (no acceptable macs)')
-         self.local_mac = agreed_local_macs[0]
-         self.remote_mac = agreed_remote_macs[0]
- 
-         if self.server_mode:
--            agreed_remote_compression = filter(self._preferred_compression.__contains__, client_compress_algo_list)
--            agreed_local_compression = filter(self._preferred_compression.__contains__, server_compress_algo_list)
-+            agreed_remote_compression = list(filter(self._preferred_compression.__contains__, client_compress_algo_list))
-+            agreed_local_compression = list(filter(self._preferred_compression.__contains__, server_compress_algo_list))
-         else:
--            agreed_local_compression = filter(client_compress_algo_list.__contains__, self._preferred_compression)
--            agreed_remote_compression = filter(server_compress_algo_list.__contains__, self._preferred_compression)
-+            agreed_local_compression = list(filter(client_compress_algo_list.__contains__, self._preferred_compression))
-+            agreed_remote_compression = list(filter(server_compress_algo_list.__contains__, self._preferred_compression))
-         if (len(agreed_local_compression) == 0) or (len(agreed_remote_compression) == 0):
-             raise SSHException('Incompatible ssh server (no acceptable compression) %r %r %r' % (agreed_local_compression, agreed_remote_compression, self._preferred_compression))
-         self.local_compression = agreed_local_compression[0]
---- ssh/util.py.orig	2012-09-10 18:40:40 UTC
-+++ ssh/util.py
-@@ -20,8 +20,8 @@
- Useful functions used by the rest of ssh.
- """
- 
--from __future__ import generators
- 
-+
- import array
- from binascii import hexlify, unhexlify
- import errno
-@@ -48,7 +48,7 @@ if sys.version_info < (2,3):
- 
- def inflate_long(s, always_positive=False):
-     "turns a normalized byte string into a long-int (adapted from Crypto.Util.number)"
--    out = 0L
-+    out = 0
-     negative = 0
-     if not always_positive and (len(s) > 0) and (ord(s[0]) >= 0x80):
-         negative = 1
-@@ -60,16 +60,16 @@ def inflate_long(s, always_positive=False):
-     for i in range(0, len(s), 4):
-         out = (out << 32) + struct.unpack('>I', s[i:i+4])[0]
*** 69 LINES SKIPPED ***