You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by po...@apache.org on 2023/07/08 22:32:19 UTC
[airflow] branch main updated: Fix an issue that crashes Airflow Webserver when passed invalid private key path to Snowflake (#32016)
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 c6f151fa8f Fix an issue that crashes Airflow Webserver when passed invalid private key path to Snowflake (#32016)
c6f151fa8f is described below
commit c6f151fa8f569687f3d889bce04bc270f114d208
Author: Bartosz Jankiewicz <bj...@users.noreply.github.com>
AuthorDate: Sun Jul 9 00:32:13 2023 +0200
Fix an issue that crashes Airflow Webserver when passed invalid private key path to Snowflake (#32016)
* Validate private key file path and size in Snowflake hook
* Test update for snowflake hook
* Code review fixes
* Fix import
Co-authored-by: xrmr <17...@users.noreply.github.com>
* Fixes
* Fix error message.
---------
Co-authored-by: Tzu-ping Chung <ur...@gmail.com>
Co-authored-by: xrmr <17...@users.noreply.github.com>
Co-authored-by: bjankiewicz <bj...@google.com>
---
airflow/providers/snowflake/hooks/snowflake.py | 7 ++++++-
tests/providers/snowflake/hooks/test_snowflake.py | 18 ++++++++++++++++++
2 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/airflow/providers/snowflake/hooks/snowflake.py b/airflow/providers/snowflake/hooks/snowflake.py
index 2a202441a7..59199cf8cd 100644
--- a/airflow/providers/snowflake/hooks/snowflake.py
+++ b/airflow/providers/snowflake/hooks/snowflake.py
@@ -248,7 +248,12 @@ class SnowflakeHook(DbApiHook):
"Please remove one."
)
elif private_key_file:
- private_key_pem = Path(private_key_file).read_bytes()
+ private_key_file_path = Path(private_key_file)
+ if not private_key_file_path.is_file() or private_key_file_path.stat().st_size == 0:
+ raise ValueError("The private_key_file path points to an empty or invalid file.")
+ if private_key_file_path.stat().st_size > 4096:
+ raise ValueError("The private_key_file size is too big. Please keep it less than 4 KB.")
+ private_key_pem = Path(private_key_file_path).read_bytes()
elif private_key_content:
private_key_pem = private_key_content.encode()
diff --git a/tests/providers/snowflake/hooks/test_snowflake.py b/tests/providers/snowflake/hooks/test_snowflake.py
index e1105fbb59..6a738952d9 100644
--- a/tests/providers/snowflake/hooks/test_snowflake.py
+++ b/tests/providers/snowflake/hooks/test_snowflake.py
@@ -393,6 +393,24 @@ class TestPytestSnowflakeHook:
), pytest.raises(TypeError, match="Password was given but private key is not encrypted."):
SnowflakeHook(snowflake_conn_id="test_conn")._get_conn_params()
+ def test_get_conn_params_should_fail_on_invalid_key(self):
+ connection_kwargs = {
+ **BASE_CONNECTION_KWARGS,
+ "password": None,
+ "extra": {
+ "database": "db",
+ "account": "airflow",
+ "warehouse": "af_wh",
+ "region": "af_region",
+ "role": "af_role",
+ "private_key_file": "/dev/urandom",
+ },
+ }
+ with mock.patch.dict(
+ "os.environ", AIRFLOW_CONN_TEST_CONN=Connection(**connection_kwargs).get_uri()
+ ), pytest.raises(ValueError, match="The private_key_file path points to an empty or invalid file."):
+ SnowflakeHook(snowflake_conn_id="test_conn").get_conn()
+
def test_should_add_partner_info(self):
with mock.patch.dict(
"os.environ",