From b94fce4df9319553e1014f1f7b7fd0a823bba495 Mon Sep 17 00:00:00 2001 From: Dorian Pula Date: Thu, 24 Oct 2013 01:07:04 -0400 Subject: [PATCH] [Python 3]: Added workaround for unified integer and long types in Python 3. --- .gitignore | 1 + paramiko/kex_group1.py | 11 +++++++---- paramiko/message.py | 2 +- paramiko/packet.py | 12 ++++++++---- paramiko/sftp_attr.py | 8 ++++++-- paramiko/transport.py | 12 +++++++++--- paramiko/util.py | 15 +++++++++------ tests/test_kex.py | 12 ++++++++---- tests/test_message.py | 20 ++++++++++++-------- tests/test_transport.py | 6 +++++- 10 files changed, 66 insertions(+), 33 deletions(-) diff --git a/.gitignore b/.gitignore index 4b57895..3d537cd 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ dist/ paramiko.egg-info/ test.log docs/ +.idea/ \ No newline at end of file diff --git a/paramiko/kex_group1.py b/paramiko/kex_group1.py index 1386cf3..20b89b5 100644 --- a/paramiko/kex_group1.py +++ b/paramiko/kex_group1.py @@ -28,11 +28,14 @@ from paramiko import util from paramiko.message import Message from paramiko.ssh_exception import SSHException +import six +if six.PY3: + long = lambda x: int(x) _MSG_KEXDH_INIT, _MSG_KEXDH_REPLY = range(30, 32) # draft-ietf-secsh-transport-09.txt, page 17 -P = 0xFFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFFL +P = long(0xFFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF) G = 2 @@ -42,9 +45,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() diff --git a/paramiko/message.py b/paramiko/message.py index 47acc34..fb9e565 100644 --- a/paramiko/message.py +++ b/paramiko/message.py @@ -277,7 +277,7 @@ class Message (object): elif type(i) is int: return self.add_int(i) elif type(i) is long: - if i > 0xffffffffL: + if i > long(0xffffffff): return self.add_mpint(i) else: return self.add_int(i) diff --git a/paramiko/packet.py b/paramiko/packet.py index ad92733..df443bb 100644 --- a/paramiko/packet.py +++ b/paramiko/packet.py @@ -27,6 +27,10 @@ import struct import threading import time +import six +if six.PY3: + long = lambda x: int(x) + from paramiko.common import * from paramiko import util from paramiko.ssh_exception import SSHException, ProxyCommandFailure @@ -94,8 +98,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() @@ -315,7 +319,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) & long(0xffffffff) self.write_all(out) self.__sent_bytes += len(out) @@ -375,7 +379,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) & long(0xffffffff) # check for rekey raw_packet_size = packet_size + self.__mac_size_in + 4 diff --git a/paramiko/sftp_attr.py b/paramiko/sftp_attr.py index 59a823b..d99de8b 100644 --- a/paramiko/sftp_attr.py +++ b/paramiko/sftp_attr.py @@ -16,6 +16,10 @@ # along with Paramiko; if not, write to the Free Software Foundation, Inc., # 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +import six +if six.PY3: + long = lambda x: int(x) + import stat import time from paramiko.common import * @@ -44,7 +48,7 @@ class SFTPAttributes (object): FLAG_UIDGID = 2 FLAG_PERMISSIONS = 4 FLAG_AMTIME = 8 - FLAG_EXTENDED = 0x80000000L + FLAG_EXTENDED = long(0x80000000) def __init__(self): """ @@ -200,7 +204,7 @@ class SFTPAttributes (object): 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 == long(0xffffffff)): # shouldn't really happen datestr = '(unknown date)' else: diff --git a/paramiko/transport.py b/paramiko/transport.py index e37d931..ca35d53 100644 --- a/paramiko/transport.py +++ b/paramiko/transport.py @@ -25,10 +25,15 @@ import socket import string import struct import sys + import threading import time import weakref +import six +if six.PY3: + long = lambda x: int(x) + import paramiko from paramiko import util from paramiko.auth_handler import AuthHandler @@ -374,7 +379,8 @@ class Transport (threading.Thread): @rtype: str """ - out = ' 0) and (ord(s[0]) >= 0x80): negative = 1 @@ -60,7 +63,7 @@ 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] if negative: - out -= (1L << (8 * len(s))) + out -= (long(1) << (8 * len(s))) return out def deflate_long(n, add_sign_padding=True): @@ -69,7 +72,7 @@ def deflate_long(n, add_sign_padding=True): s = '' n = long(n) while (n != 0) and (n != -1): - s = struct.pack('>I', n & 0xffffffffL) + s + s = struct.pack('>I', n & long(0xffffffff)) + s n = n >> 32 # strip off leading zeros, FFs for i in enumerate(s): @@ -282,7 +285,7 @@ def retry_on_signal(function): class Counter (object): """Stateful counter for CTR mode crypto""" - def __init__(self, nbits, initial_value=1L, overflow=0L): + def __init__(self, nbits, initial_value=long(1), overflow=0): self.blocksize = nbits / 8 self.overflow = overflow # start with value - 1 so we don't have to store intermediate values when counting @@ -306,6 +309,6 @@ class Counter (object): self.value = array.array('c', '\x00' * (self.blocksize - len(x)) + x) return self.value.tostring() - def new(cls, nbits, initial_value=1L, overflow=0L): + def new(cls, nbits, initial_value=long(1), overflow=0): return cls(nbits, initial_value=initial_value, overflow=overflow) new = classmethod(new) diff --git a/tests/test_kex.py b/tests/test_kex.py index f6e6996..16700d8 100644 --- a/tests/test_kex.py +++ b/tests/test_kex.py @@ -27,6 +27,10 @@ from paramiko.kex_group1 import KexGroup1 from paramiko.kex_gex import KexGex from paramiko import Message +import six +if six.PY3: + long = lambda x: int(x) + class FakeRng (object): def read(self, n): @@ -41,7 +45,7 @@ class FakeKey (object): class FakeModulusPack (object): - P = 0xFFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFFL + P = long(0xFFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF) G = 2 def get_modulus(self, min, ask, max): return self.G, self.P @@ -75,7 +79,7 @@ class FakeTransport (object): class KexTest (unittest.TestCase): - K = 14730343317708716439807310032871972459448364195094179797249681733965528989482751523943515690110179031004049109375612685505881911274101441415545039654102474376472240501616988799699744135291070488314748284283496055223852115360852283821334858541043710301057312858051901453919067023103730011648890038847384890504L + K = long(14730343317708716439807310032871972459448364195094179797249681733965528989482751523943515690110179031004049109375612685505881911274101441415545039654102474376472240501616988799699744135291070488314748284283496055223852115360852283821334858541043710301057312858051901453919067023103730011648890038847384890504) def setUp(self): pass @@ -204,7 +208,7 @@ class KexTest (unittest.TestCase): msg.add_mpint(12345) msg.rewind() kex.parse_next(paramiko.kex_gex._MSG_KEXDH_GEX_INIT, msg) - K = 67592995013596137876033460028393339951879041140378510871612128162185209509220726296697886624612526735888348020498716482757677848959420073720160491114319163078862905400020959196386947926388406687288901564192071077389283980347784184487280885335302632305026248574716290537036069329724382811853044654824945750581L + K = long(67592995013596137876033460028393339951879041140378510871612128162185209509220726296697886624612526735888348020498716482757677848959420073720160491114319163078862905400020959196386947926388406687288901564192071077389283980347784184487280885335302632305026248574716290537036069329724382811853044654824945750581) H = 'CE754197C21BF3452863B4F44D0B3951F12516EF' x = '210000000866616B652D6B6579000000807E2DDB1743F3487D6545F04F1C8476092FB912B013626AB5BCEB764257D88BBA64243B9F348DF7B41B8C814A995E00299913503456983FFB9178D3CD79EB6D55522418A8ABF65375872E55938AB99A84A0B5FC8A1ECC66A7C3766E7E0F80B7CE2C9225FC2DD683F4764244B72963BBB383F529DCF0C5D17740B8A2ADBE9208D40000000866616B652D736967' self.assertEquals(K, transport._K) @@ -231,7 +235,7 @@ class KexTest (unittest.TestCase): msg.add_mpint(12345) msg.rewind() kex.parse_next(paramiko.kex_gex._MSG_KEXDH_GEX_INIT, msg) - K = 67592995013596137876033460028393339951879041140378510871612128162185209509220726296697886624612526735888348020498716482757677848959420073720160491114319163078862905400020959196386947926388406687288901564192071077389283980347784184487280885335302632305026248574716290537036069329724382811853044654824945750581L + K = long(67592995013596137876033460028393339951879041140378510871612128162185209509220726296697886624612526735888348020498716482757677848959420073720160491114319163078862905400020959196386947926388406687288901564192071077389283980347784184487280885335302632305026248574716290537036069329724382811853044654824945750581) H = 'B41A06B2E59043CEFC1AE16EC31F1E2D12EC455B' x = '210000000866616B652D6B6579000000807E2DDB1743F3487D6545F04F1C8476092FB912B013626AB5BCEB764257D88BBA64243B9F348DF7B41B8C814A995E00299913503456983FFB9178D3CD79EB6D55522418A8ABF65375872E55938AB99A84A0B5FC8A1ECC66A7C3766E7E0F80B7CE2C9225FC2DD683F4764244B72963BBB383F529DCF0C5D17740B8A2ADBE9208D40000000866616B652D736967' self.assertEquals(K, transport._K) diff --git a/tests/test_message.py b/tests/test_message.py index 7bfd44d..10e6af1 100644 --- a/tests/test_message.py +++ b/tests/test_message.py @@ -20,6 +20,10 @@ Some unit tests for ssh protocol message blocks. """ +import six +if six.PY3: + long = lambda x: int(x) + import unittest from paramiko.message import Message @@ -50,10 +54,10 @@ class MessageTest (unittest.TestCase): msg = Message() msg.add_int64(5) - msg.add_int64(0xf5e4d3c2b109L) + msg.add_int64(long(0xf5e4d3c2b109)) msg.add_mpint(17) - msg.add_mpint(0xf5e4d3c2b109L) - msg.add_mpint(-0x65e4d3c2b109L) + msg.add_mpint(long(0xf5e4d3c2b109)) + msg.add_mpint(long(-0x65e4d3c2b109)) self.assertEquals(str(msg), self.__c) def test_2_decode(self): @@ -73,15 +77,15 @@ class MessageTest (unittest.TestCase): msg = Message(self.__c) self.assertEquals(msg.get_int64(), 5) - self.assertEquals(msg.get_int64(), 0xf5e4d3c2b109L) + self.assertEquals(msg.get_int64(), long(0xf5e4d3c2b109)) self.assertEquals(msg.get_mpint(), 17) - self.assertEquals(msg.get_mpint(), 0xf5e4d3c2b109L) - self.assertEquals(msg.get_mpint(), -0x65e4d3c2b109L) + self.assertEquals(msg.get_mpint(), long(0xf5e4d3c2b109)) + self.assertEquals(msg.get_mpint(), long(-0x65e4d3c2b109)) def test_3_add(self): msg = Message() msg.add(5) - msg.add(0x1122334455L) + msg.add(long(0x1122334455)) msg.add(True) msg.add('cat') msg.add(['a', 'b']) @@ -90,7 +94,7 @@ class MessageTest (unittest.TestCase): def test_4_misc(self): msg = Message(self.__d) self.assertEquals(msg.get_int(), 5) - self.assertEquals(msg.get_mpint(), 0x1122334455L) + self.assertEquals(msg.get_mpint(), long(0x1122334455)) self.assertEquals(msg.get_so_far(), self.__d[:13]) self.assertEquals(msg.get_remainder(), self.__d[13:]) msg.rewind() diff --git a/tests/test_transport.py b/tests/test_transport.py index d3d1c98..171ff3a 100644 --- a/tests/test_transport.py +++ b/tests/test_transport.py @@ -29,6 +29,10 @@ import threading import unittest import random +import six +if six.PY3: + long = lambda x: int(x) + from paramiko import Transport, SecurityOptions, ServerInterface, RSAKey, DSSKey, \ SSHException, BadAuthenticationType, InteractiveQuery, ChannelException from paramiko import AUTH_FAILED, AUTH_PARTIALLY_SUCCESSFUL, AUTH_SUCCESSFUL @@ -158,7 +162,7 @@ class TransportTest(ParamikoTest): pass def test_2_compute_key(self): - self.tc.K = 123281095979686581523377256114209720774539068973101330872763622971399429481072519713536292772709507296759612401802191955568143056534122385270077606457721553469730659233569339356140085284052436697480759510519672848743794433460113118986816826624865291116513647975790797391795651716378444844877749505443714557929L + self.tc.K = long(123281095979686581523377256114209720774539068973101330872763622971399429481072519713536292772709507296759612401802191955568143056534122385270077606457721553469730659233569339356140085284052436697480759510519672848743794433460113118986816826624865291116513647975790797391795651716378444844877749505443714557929) self.tc.H = unhexlify('0C8307CDE6856FF30BA93684EB0F04C2520E9ED3') self.tc.session_id = self.tc.H key = self.tc._compute_key('C', 32)