From cb79f61e31afdad22ba387b7ee5c59880099a2e5 Mon Sep 17 00:00:00 2001 From: Amogh Desai Date: Mon, 4 Aug 2025 11:54:37 +0530 Subject: [PATCH 1/3] Add compatibility for paramiko versions without DSSKey --- .../ssh/src/airflow/providers/ssh/hooks/ssh.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/providers/ssh/src/airflow/providers/ssh/hooks/ssh.py b/providers/ssh/src/airflow/providers/ssh/hooks/ssh.py index 43fca90dce57b..79b7abc982c79 100644 --- a/providers/ssh/src/airflow/providers/ssh/hooks/ssh.py +++ b/providers/ssh/src/airflow/providers/ssh/hooks/ssh.py @@ -74,20 +74,25 @@ class SSHHook(BaseHook): """ # List of classes to try loading private keys as, ordered (roughly) by most common to least common - _pkey_loaders: Sequence[type[paramiko.PKey]] = ( + _pkey_loader_list = [ paramiko.RSAKey, paramiko.ECDSAKey, paramiko.Ed25519Key, - paramiko.DSSKey, - ) + ] _host_key_mappings = { "rsa": paramiko.RSAKey, - "dss": paramiko.DSSKey, "ecdsa": paramiko.ECDSAKey, "ed25519": paramiko.Ed25519Key, } + # Add DSSKey if available in paramiko + if hasattr(paramiko, "DSSKey"): + _pkey_loader_list.append(paramiko.DSSKey) + _host_key_mappings["dss"] = paramiko.DSSKey + + _pkey_loaders: Sequence[type[paramiko.PKey]] = tuple(_pkey_loader_list) + conn_name_attr = "ssh_conn_id" default_conn_name = "ssh_default" conn_type = "ssh" From 67da9308bf5d9e7edf14569d79601a75facaf74a Mon Sep 17 00:00:00 2001 From: Amogh Desai Date: Mon, 4 Aug 2025 12:07:04 +0530 Subject: [PATCH 2/3] Limit paramiko to < 4.0.0 till we remove DSS support --- providers/sftp/pyproject.toml | 2 +- providers/ssh/pyproject.toml | 2 +- .../ssh/src/airflow/providers/ssh/hooks/ssh.py | 13 ++++--------- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/providers/sftp/pyproject.toml b/providers/sftp/pyproject.toml index 1d91cba6be2ef..ac3aa5ad9ca90 100644 --- a/providers/sftp/pyproject.toml +++ b/providers/sftp/pyproject.toml @@ -59,7 +59,7 @@ requires-python = ">=3.10" dependencies = [ "apache-airflow>=2.10.0", "apache-airflow-providers-ssh>=4.0.0", - "paramiko>=2.9.0", + "paramiko>=2.9.0,<4.0.0", "asyncssh>=2.12.0", ] diff --git a/providers/ssh/pyproject.toml b/providers/ssh/pyproject.toml index c176db0fc22d1..8f1ed12b5add7 100644 --- a/providers/ssh/pyproject.toml +++ b/providers/ssh/pyproject.toml @@ -58,7 +58,7 @@ requires-python = ">=3.10" # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build`` dependencies = [ "apache-airflow>=2.10.0", - "paramiko>=2.9.0", + "paramiko>=2.9.0,<4.0.0", "sshtunnel>=0.3.2", ] diff --git a/providers/ssh/src/airflow/providers/ssh/hooks/ssh.py b/providers/ssh/src/airflow/providers/ssh/hooks/ssh.py index 79b7abc982c79..43fca90dce57b 100644 --- a/providers/ssh/src/airflow/providers/ssh/hooks/ssh.py +++ b/providers/ssh/src/airflow/providers/ssh/hooks/ssh.py @@ -74,25 +74,20 @@ class SSHHook(BaseHook): """ # List of classes to try loading private keys as, ordered (roughly) by most common to least common - _pkey_loader_list = [ + _pkey_loaders: Sequence[type[paramiko.PKey]] = ( paramiko.RSAKey, paramiko.ECDSAKey, paramiko.Ed25519Key, - ] + paramiko.DSSKey, + ) _host_key_mappings = { "rsa": paramiko.RSAKey, + "dss": paramiko.DSSKey, "ecdsa": paramiko.ECDSAKey, "ed25519": paramiko.Ed25519Key, } - # Add DSSKey if available in paramiko - if hasattr(paramiko, "DSSKey"): - _pkey_loader_list.append(paramiko.DSSKey) - _host_key_mappings["dss"] = paramiko.DSSKey - - _pkey_loaders: Sequence[type[paramiko.PKey]] = tuple(_pkey_loader_list) - conn_name_attr = "ssh_conn_id" default_conn_name = "ssh_default" conn_type = "ssh" From 16b4b64d4e6b234dc5e2c2732d7f98a08fb0bc2c Mon Sep 17 00:00:00 2001 From: Amogh Desai Date: Mon, 4 Aug 2025 12:22:03 +0530 Subject: [PATCH 3/3] adding todo --- providers/sftp/pyproject.toml | 1 + providers/ssh/pyproject.toml | 1 + 2 files changed, 2 insertions(+) diff --git a/providers/sftp/pyproject.toml b/providers/sftp/pyproject.toml index ac3aa5ad9ca90..348f2be1c533a 100644 --- a/providers/sftp/pyproject.toml +++ b/providers/sftp/pyproject.toml @@ -59,6 +59,7 @@ requires-python = ">=3.10" dependencies = [ "apache-airflow>=2.10.0", "apache-airflow-providers-ssh>=4.0.0", + # TODO: Bump to >= 4.0.0 once https://github.com/apache/airflow/issues/54079 is handled "paramiko>=2.9.0,<4.0.0", "asyncssh>=2.12.0", ] diff --git a/providers/ssh/pyproject.toml b/providers/ssh/pyproject.toml index 8f1ed12b5add7..76ae77d3d8e8d 100644 --- a/providers/ssh/pyproject.toml +++ b/providers/ssh/pyproject.toml @@ -58,6 +58,7 @@ requires-python = ">=3.10" # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build`` dependencies = [ "apache-airflow>=2.10.0", + # TODO: Bump to >= 4.0.0 once https://github.com/apache/airflow/issues/54079 is handled "paramiko>=2.9.0,<4.0.0", "sshtunnel>=0.3.2", ]