Skip to content

Commit 6d309dc

Browse files
committed
Support paramiko 4 changes
RSA key support has been removed as of paramiko 4, so only import it and check if the version number is less than 4.
1 parent 5b741d6 commit 6d309dc

2 files changed

Lines changed: 26 additions & 20 deletions

File tree

libcloud/compute/ssh.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -660,13 +660,15 @@ def _get_pkey_object(self, key, password=None):
660660
"""
661661
key_types = [
662662
(paramiko.RSAKey, "RSA"),
663-
(paramiko.DSSKey, "DSA"),
664663
(paramiko.ECDSAKey, "EC"),
665664
]
666665

667666
paramiko_version = getattr(paramiko, "__version__", "0.0.0")
668667
paramiko_version = tuple(int(c) for c in paramiko_version.split("."))
669668

669+
if paramiko_version < (4, 0, 0):
670+
# DSSKey removed in paramiko 4.0.0
671+
key_types.append((paramiko.DSSKey, "DSA"))
670672
if paramiko_version >= (2, 2, 0):
671673
# Ed25519 is only supported in paramiko >= 2.2.0
672674
key_types.append((paramiko.ed25519key.Ed25519Key, "Ed25519"))

libcloud/test/compute/test_ssh_client.py

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -317,19 +317,21 @@ def test_key_material_valid_pem_keys_invalid_header_auto_conversion(self):
317317
self.assertTrue(isinstance(pkey, paramiko.RSAKey))
318318

319319
# 2. DSA key type with header which is not supported by paramiko
320-
path = os.path.join(
321-
os.path.dirname(__file__),
322-
"fixtures",
323-
"misc",
324-
"test_dsa_non_paramiko_recognized_header.key",
325-
)
326-
327-
with open(path) as fp:
328-
private_key = fp.read()
329-
330-
pkey = client._get_pkey_object(key=private_key)
331-
self.assertTrue(pkey)
332-
self.assertTrue(isinstance(pkey, paramiko.DSSKey))
320+
# ... and only for paramiko < 4
321+
if paramiko_version < (4, 0, 0):
322+
path = os.path.join(
323+
os.path.dirname(__file__),
324+
"fixtures",
325+
"misc",
326+
"test_dsa_non_paramiko_recognized_header.key",
327+
)
328+
329+
with open(path) as fp:
330+
private_key = fp.read()
331+
332+
pkey = client._get_pkey_object(key=private_key)
333+
self.assertTrue(pkey)
334+
self.assertTrue(isinstance(pkey, paramiko.DSSKey))
333335

334336
# 3. ECDSA key type with header which is not supported by paramiko
335337
path = os.path.join(
@@ -361,14 +363,16 @@ def test_key_material_valid_pem_keys(self):
361363
self.assertTrue(isinstance(pkey, paramiko.RSAKey))
362364

363365
# 2. DSA key type with header which is not supported by paramiko
364-
path = os.path.join(os.path.dirname(__file__), "fixtures", "misc", "test_dsa.key")
366+
# ... and only for paramiko < 4
367+
if paramiko_version < (4, 0, 0):
368+
path = os.path.join(os.path.dirname(__file__), "fixtures", "misc", "test_dsa.key")
365369

366-
with open(path) as fp:
367-
private_key = fp.read()
370+
with open(path) as fp:
371+
private_key = fp.read()
368372

369-
pkey = client._get_pkey_object(key=private_key)
370-
self.assertTrue(pkey)
371-
self.assertTrue(isinstance(pkey, paramiko.DSSKey))
373+
pkey = client._get_pkey_object(key=private_key)
374+
self.assertTrue(pkey)
375+
self.assertTrue(isinstance(pkey, paramiko.DSSKey))
372376

373377
# 3. ECDSA key type with header which is not supported by paramiko
374378
path = os.path.join(os.path.dirname(__file__), "fixtures", "misc", "test_ecdsa.key")

0 commit comments

Comments
 (0)