This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new cdedaf3fc69 Fix encrypted private keys in async SFTP hook (#70858)
cdedaf3fc69 is described below
commit cdedaf3fc695420a373080bc60b4415b4fe22dd7
Author: Minh Vu <[email protected]>
AuthorDate: Sat Aug 1 03:46:19 2026 +0200
Fix encrypted private keys in async SFTP hook (#70858)
The documented connection extra was ignored, causing authentication
failures when encrypted private keys were used through asynchronous SFTP
connections.
---
providers/sftp/src/airflow/providers/sftp/hooks/sftp.py | 6 ++++--
providers/sftp/tests/unit/sftp/hooks/test_sftp.py | 5 +++--
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/providers/sftp/src/airflow/providers/sftp/hooks/sftp.py
b/providers/sftp/src/airflow/providers/sftp/hooks/sftp.py
index cbb4254c8a3..4044b39bb0f 100644
--- a/providers/sftp/src/airflow/providers/sftp/hooks/sftp.py
+++ b/providers/sftp/src/airflow/providers/sftp/hooks/sftp.py
@@ -786,8 +786,10 @@ class SFTPHookAsync(BaseHook):
self.key_file = extra_options["key_file"]
if "known_hosts" in extra_options and self.known_hosts !=
self.default_known_hosts:
self.known_hosts = extra_options["known_hosts"]
- if ("passphrase" or "private_key_passphrase") in extra_options:
- self.passphrase = extra_options["passphrase"]
+ if "passphrase" in extra_options or "private_key_passphrase" in
extra_options:
+ self.passphrase = extra_options.get("passphrase") or
extra_options.get(
+ "private_key_passphrase", ""
+ )
if "private_key" in extra_options:
self.private_key = extra_options["private_key"]
diff --git a/providers/sftp/tests/unit/sftp/hooks/test_sftp.py
b/providers/sftp/tests/unit/sftp/hooks/test_sftp.py
index bd4c2f05252..db6d8292299 100644
--- a/providers/sftp/tests/unit/sftp/hooks/test_sftp.py
+++ b/providers/sftp/tests/unit/sftp/hooks/test_sftp.py
@@ -774,13 +774,13 @@ class MockAirflowConnectionWithPrivate:
{
"private_key": "~/keys/my_key",
"known_hosts": "unused",
- "passphrase": "mypassphrase"
+ "private_key_passphrase": "mypassphrase"
}
"""
self.extra_dejson = {
"private_key": "~/keys/my_key",
"known_hosts": None,
- "passphrase": "mypassphrase",
+ "private_key_passphrase": "mypassphrase",
}
@@ -945,6 +945,7 @@ class TestSFTPHookAsync:
hook = SFTPHookAsync()
await hook._get_conn()
+ mock_import_private_key.assert_called_once_with("~/keys/my_key",
"mypassphrase")
expected_connection_details = {
"host": "localhost",
"port": 22,