From 375322df11f59d56483960c7e816f21260eac46f Mon Sep 17 00:00:00 2001 From: kanagaraj Date: Sun, 26 Jan 2025 15:04:03 +0530 Subject: [PATCH] Implement fetching consumer_secret from Salesforce connection (#45954) This PR introduces a new feature that allows users to retrieve the consumer_secret directly from the Connections service. --------- Co-authored-by: k0d04mr --- .../connections/salesforce.rst | 5 +++++ .../src/airflow/providers/salesforce/hooks/salesforce.py | 4 ++++ providers/tests/salesforce/hooks/test_salesforce.py | 9 +++++++++ 3 files changed, 18 insertions(+) diff --git a/docs/apache-airflow-providers-salesforce/connections/salesforce.rst b/docs/apache-airflow-providers-salesforce/connections/salesforce.rst index b1959e69f21d31..5c5bb5e47c59a0 100644 --- a/docs/apache-airflow-providers-salesforce/connections/salesforce.rst +++ b/docs/apache-airflow-providers-salesforce/connections/salesforce.rst @@ -48,6 +48,11 @@ Consumer Key (optional) Use for OAuth 2.0 JWT authentication. +Consumer Secret (optional) + the consumer secret generated for the user. + + Use for OAuth 2.0 JWT authentication. + Private Key (optional) The private key to use for signing the JWT. Provide this or a Private Key File Path (both are not necessary). diff --git a/providers/src/airflow/providers/salesforce/hooks/salesforce.py b/providers/src/airflow/providers/salesforce/hooks/salesforce.py index ca54f01f5f05af..d7105acdf41f49 100644 --- a/providers/src/airflow/providers/salesforce/hooks/salesforce.py +++ b/providers/src/airflow/providers/salesforce/hooks/salesforce.py @@ -105,6 +105,9 @@ def get_connection_form_widgets(cls) -> dict[str, Any]: "security_token": PasswordField(lazy_gettext("Security Token"), widget=BS3PasswordFieldWidget()), "domain": StringField(lazy_gettext("Domain"), widget=BS3TextFieldWidget()), "consumer_key": StringField(lazy_gettext("Consumer Key"), widget=BS3TextFieldWidget()), + "consumer_secret": PasswordField( + lazy_gettext("Consumer Secret"), widget=BS3PasswordFieldWidget() + ), "private_key_file_path": PasswordField( lazy_gettext("Private Key File Path"), widget=BS3PasswordFieldWidget() ), @@ -151,6 +154,7 @@ def conn(self) -> api.Salesforce: session=self.session, client_id=self._get_field(extras, "client_id") or None, consumer_key=self._get_field(extras, "consumer_key") or None, + consumer_secret=self._get_field(extras, "consumer_secret") or None, privatekey_file=self._get_field(extras, "private_key_file_path") or None, privatekey=self._get_field(extras, "private_key") or None, ) diff --git a/providers/tests/salesforce/hooks/test_salesforce.py b/providers/tests/salesforce/hooks/test_salesforce.py index 0c1d9ede4c6f0a..b962d4aef24470 100644 --- a/providers/tests/salesforce/hooks/test_salesforce.py +++ b/providers/tests/salesforce/hooks/test_salesforce.py @@ -94,6 +94,7 @@ def test_get_conn_password_auth(self, mock_salesforce): session=None, client_id=extras["client_id"], consumer_key=None, + consumer_secret=None, privatekey_file=None, privatekey=None, ) @@ -146,6 +147,7 @@ def test_get_conn_direct_session_access(self, mock_salesforce): session=self.salesforce_hook.session, client_id=extras["client_id"], consumer_key=None, + consumer_secret=None, privatekey_file=None, privatekey=None, ) @@ -169,6 +171,7 @@ def test_get_conn_jwt_auth(self, mock_salesforce): { "client_id": "my_client3", "consumer_key": "consumer_key", + "consumer_secret": "consumer_secret", "domain": "login", "private_key": "private_key", "version": "34.0" @@ -195,6 +198,7 @@ def test_get_conn_jwt_auth(self, mock_salesforce): session=None, client_id=extras["client_id"], consumer_key=extras["consumer_key"], + consumer_secret=extras["consumer_secret"], privatekey_file=None, privatekey=extras["private_key"], ) @@ -240,6 +244,7 @@ def test_get_conn_ip_filtering_auth(self, mock_salesforce): session=None, client_id=None, consumer_key=None, + consumer_secret=None, privatekey_file=None, privatekey=None, ) @@ -261,6 +266,7 @@ def test_get_conn_default_to_none(self, mock_salesforce): { "client_id": "", "consumer_key": "", + "consumer_secret": "", "domain": "", "instance": "", "instance_url": "", @@ -291,6 +297,7 @@ def test_get_conn_default_to_none(self, mock_salesforce): session=None, client_id=None, consumer_key=None, + consumer_secret=None, privatekey_file=None, privatekey=None, ) @@ -480,6 +487,7 @@ def test_backcompat_prefix_works(self, mock_client, uri): mock_client.assert_called_with( client_id=None, consumer_key=None, + consumer_secret=None, domain="domain", instance=None, instance_url=None, @@ -509,6 +517,7 @@ def test_backcompat_prefix_both_prefers_short(self, mock_client): mock_client.assert_called_with( client_id=None, consumer_key=None, + consumer_secret=None, domain=None, instance=None, instance_url=None,