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 cd476acd8f Follow BaseHook connection fields method signature in child 
classes (#36086)
cd476acd8f is described below

commit cd476acd8f1684f613c20dddaa9e988bcfb3ac1c
Author: Andrey Anshin <[email protected]>
AuthorDate: Mon Dec 11 11:03:29 2023 +0400

    Follow BaseHook connection fields method signature in child classes (#36086)
---
 airflow/providers/amazon/aws/hooks/base_aws.py           |  4 ++--
 airflow/providers/amazon/aws/hooks/emr.py                |  4 ++--
 airflow/providers/amazon/aws/hooks/redshift_sql.py       |  4 ++--
 airflow/providers/apache/kafka/hooks/base.py             |  4 ++--
 airflow/providers/apache/spark/hooks/spark_connect.py    |  8 ++++----
 airflow/providers/apache/spark/hooks/spark_submit.py     |  4 ++--
 airflow/providers/apprise/hooks/apprise.py               |  8 ++++----
 airflow/providers/arangodb/hooks/arangodb.py             |  4 ++--
 airflow/providers/asana/hooks/asana.py                   |  8 ++++----
 airflow/providers/cloudant/hooks/cloudant.py             |  4 ++--
 airflow/providers/cncf/kubernetes/hooks/kubernetes.py    |  8 ++++----
 airflow/providers/cohere/hooks/cohere.py                 |  4 ++--
 airflow/providers/datadog/hooks/datadog.py               |  8 ++++----
 airflow/providers/dbt/cloud/hooks/dbt.py                 |  4 ++--
 airflow/providers/docker/hooks/docker.py                 |  4 ++--
 airflow/providers/github/hooks/github.py                 |  4 ++--
 airflow/providers/google/cloud/hooks/compute_ssh.py      |  4 ++--
 airflow/providers/google/common/hooks/base_google.py     |  8 ++++----
 airflow/providers/grpc/hooks/grpc.py                     |  4 ++--
 airflow/providers/hashicorp/hooks/vault.py               |  4 ++--
 airflow/providers/jdbc/hooks/jdbc.py                     |  4 ++--
 airflow/providers/jenkins/hooks/jenkins.py               |  8 ++++----
 airflow/providers/microsoft/azure/hooks/asb.py           |  8 ++++----
 airflow/providers/microsoft/azure/hooks/base_azure.py    |  8 ++++----
 .../microsoft/azure/hooks/container_registry.py          |  4 ++--
 .../providers/microsoft/azure/hooks/container_volume.py  |  8 ++++----
 airflow/providers/microsoft/azure/hooks/cosmos.py        |  8 ++++----
 airflow/providers/microsoft/azure/hooks/data_factory.py  |  8 ++++----
 airflow/providers/microsoft/azure/hooks/data_lake.py     |  8 ++++----
 airflow/providers/microsoft/azure/hooks/fileshare.py     |  8 ++++----
 airflow/providers/microsoft/azure/hooks/synapse.py       | 16 ++++++++--------
 airflow/providers/microsoft/azure/hooks/wasb.py          |  8 ++++----
 airflow/providers/opensearch/hooks/opensearch.py         |  4 ++--
 airflow/providers/pagerduty/hooks/pagerduty.py           |  4 ++--
 airflow/providers/pagerduty/hooks/pagerduty_events.py    |  4 ++--
 airflow/providers/pinecone/hooks/pinecone.py             |  4 ++--
 airflow/providers/postgres/hooks/postgres.py             |  4 ++--
 airflow/providers/salesforce/hooks/salesforce.py         |  8 ++++----
 airflow/providers/sftp/hooks/sftp.py                     |  4 ++--
 airflow/providers/smtp/hooks/smtp.py                     |  4 ++--
 airflow/providers/snowflake/hooks/snowflake.py           |  8 ++++----
 airflow/providers/ssh/hooks/ssh.py                       |  4 ++--
 airflow/providers/tabular/hooks/tabular.py               |  4 ++--
 airflow/providers/yandex/hooks/yandex.py                 |  8 ++++----
 tests/providers/microsoft/azure/test_utils.py            | 10 +++++++---
 45 files changed, 137 insertions(+), 133 deletions(-)

diff --git a/airflow/providers/amazon/aws/hooks/base_aws.py 
b/airflow/providers/amazon/aws/hooks/base_aws.py
index d608a87b8c..d6e0762a1a 100644
--- a/airflow/providers/amazon/aws/hooks/base_aws.py
+++ b/airflow/providers/amazon/aws/hooks/base_aws.py
@@ -812,8 +812,8 @@ class AwsGenericHook(BaseHook, Generic[BaseAwsConnection]):
 
         return retry_decorator
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Return custom UI field behaviour for AWS Connection."""
         return {
             "hidden_fields": ["host", "schema", "port"],
diff --git a/airflow/providers/amazon/aws/hooks/emr.py 
b/airflow/providers/amazon/aws/hooks/emr.py
index 41bcf9a0c6..c6dc88e4e8 100644
--- a/airflow/providers/amazon/aws/hooks/emr.py
+++ b/airflow/providers/amazon/aws/hooks/emr.py
@@ -205,8 +205,8 @@ class EmrHook(AwsBaseHook):
         )
         return False, msg
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Return custom UI field behaviour for Amazon Elastic MapReduce 
Connection."""
         return {
             "hidden_fields": ["host", "schema", "port", "login", "password"],
diff --git a/airflow/providers/amazon/aws/hooks/redshift_sql.py 
b/airflow/providers/amazon/aws/hooks/redshift_sql.py
index 8ce97f26bd..66659cb0a1 100644
--- a/airflow/providers/amazon/aws/hooks/redshift_sql.py
+++ b/airflow/providers/amazon/aws/hooks/redshift_sql.py
@@ -62,8 +62,8 @@ class RedshiftSQLHook(DbApiHook):
         super().__init__(*args, **kwargs)
         self.aws_conn_id = aws_conn_id
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict:
         """Get custom field behavior."""
         return {
             "hidden_fields": [],
diff --git a/airflow/providers/apache/kafka/hooks/base.py 
b/airflow/providers/apache/kafka/hooks/base.py
index d2ba9cb057..189c4cd2aa 100644
--- a/airflow/providers/apache/kafka/hooks/base.py
+++ b/airflow/providers/apache/kafka/hooks/base.py
@@ -42,8 +42,8 @@ class KafkaBaseHook(BaseHook):
         self.kafka_config_id = kafka_config_id
         self.get_conn
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Return custom field behaviour."""
         return {
             "hidden_fields": ["schema", "login", "password", "port", "host"],
diff --git a/airflow/providers/apache/spark/hooks/spark_connect.py 
b/airflow/providers/apache/spark/hooks/spark_connect.py
index 29828b0b78..179680387c 100644
--- a/airflow/providers/apache/spark/hooks/spark_connect.py
+++ b/airflow/providers/apache/spark/hooks/spark_connect.py
@@ -37,8 +37,8 @@ class SparkConnectHook(BaseHook, LoggingMixin):
     conn_type = "spark_connect"
     hook_name = "Spark Connect"
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Return custom field behaviour."""
         return {
             "hidden_fields": [
@@ -47,8 +47,8 @@ class SparkConnectHook(BaseHook, LoggingMixin):
             "relabeling": {"password": "Token", "login": "User ID"},
         }
 
-    @staticmethod
-    def get_connection_form_widgets() -> dict[str, Any]:
+    @classmethod
+    def get_connection_form_widgets(cls) -> dict[str, Any]:
         """Returns connection widgets to add to connection form."""
         from flask_babel import lazy_gettext
         from wtforms import BooleanField
diff --git a/airflow/providers/apache/spark/hooks/spark_submit.py 
b/airflow/providers/apache/spark/hooks/spark_submit.py
index d519eb3e6e..be087dada9 100644
--- a/airflow/providers/apache/spark/hooks/spark_submit.py
+++ b/airflow/providers/apache/spark/hooks/spark_submit.py
@@ -87,8 +87,8 @@ class SparkSubmitHook(BaseHook, LoggingMixin):
     conn_type = "spark"
     hook_name = "Spark"
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Return custom field behaviour."""
         return {
             "hidden_fields": ["schema", "login", "password"],
diff --git a/airflow/providers/apprise/hooks/apprise.py 
b/airflow/providers/apprise/hooks/apprise.py
index 8b896773d7..48431e3bea 100644
--- a/airflow/providers/apprise/hooks/apprise.py
+++ b/airflow/providers/apprise/hooks/apprise.py
@@ -110,8 +110,8 @@ class AppriseHook(BaseHook):
     def get_conn(self) -> None:
         raise NotImplementedError()
 
-    @staticmethod
-    def get_connection_form_widgets() -> dict[str, Any]:
+    @classmethod
+    def get_connection_form_widgets(cls) -> dict[str, Any]:
         """Return connection widgets to add to connection form."""
         from flask_appbuilder.fieldwidgets import BS3PasswordFieldWidget
         from flask_babel import lazy_gettext
@@ -127,8 +127,8 @@ class AppriseHook(BaseHook):
             ),
         }
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         return {
             "hidden_fields": ["host", "schema", "login", "password", "port", 
"extra"],
             "relabeling": {},
diff --git a/airflow/providers/arangodb/hooks/arangodb.py 
b/airflow/providers/arangodb/hooks/arangodb.py
index 389694051d..469cd49815 100644
--- a/airflow/providers/arangodb/hooks/arangodb.py
+++ b/airflow/providers/arangodb/hooks/arangodb.py
@@ -134,8 +134,8 @@ class ArangoDBHook(BaseHook):
             self.log.info("Graph already exists: %s", name)
             return False
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         return {
             "hidden_fields": ["port", "extra"],
             "relabeling": {
diff --git a/airflow/providers/asana/hooks/asana.py 
b/airflow/providers/asana/hooks/asana.py
index ec9360b27e..cc7276a502 100644
--- a/airflow/providers/asana/hooks/asana.py
+++ b/airflow/providers/asana/hooks/asana.py
@@ -58,8 +58,8 @@ class AsanaHook(BaseHook):
     def get_conn(self) -> Client:
         return self.client
 
-    @staticmethod
-    def get_connection_form_widgets() -> dict[str, Any]:
+    @classmethod
+    def get_connection_form_widgets(cls) -> dict[str, Any]:
         """Return connection widgets to add to connection form."""
         from flask_appbuilder.fieldwidgets import BS3TextFieldWidget
         from flask_babel import lazy_gettext
@@ -70,8 +70,8 @@ class AsanaHook(BaseHook):
             "project": StringField(lazy_gettext("Project"), 
widget=BS3TextFieldWidget()),
         }
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Return custom field behaviour."""
         return {
             "hidden_fields": ["port", "host", "login", "schema"],
diff --git a/airflow/providers/cloudant/hooks/cloudant.py 
b/airflow/providers/cloudant/hooks/cloudant.py
index f73b573ae1..873462ccbf 100644
--- a/airflow/providers/cloudant/hooks/cloudant.py
+++ b/airflow/providers/cloudant/hooks/cloudant.py
@@ -40,8 +40,8 @@ class CloudantHook(BaseHook):
     conn_type = "cloudant"
     hook_name = "Cloudant"
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Return custom field behaviour."""
         return {
             "hidden_fields": ["port", "extra"],
diff --git a/airflow/providers/cncf/kubernetes/hooks/kubernetes.py 
b/airflow/providers/cncf/kubernetes/hooks/kubernetes.py
index 83e7fc8477..4a68a37cd0 100644
--- a/airflow/providers/cncf/kubernetes/hooks/kubernetes.py
+++ b/airflow/providers/cncf/kubernetes/hooks/kubernetes.py
@@ -86,8 +86,8 @@ class KubernetesHook(BaseHook, PodOperatorHookProtocol):
 
     DEFAULT_NAMESPACE = "default"
 
-    @staticmethod
-    def get_connection_form_widgets() -> dict[str, Any]:
+    @classmethod
+    def get_connection_form_widgets(cls) -> dict[str, Any]:
         """Return connection widgets to add to connection form."""
         from flask_appbuilder.fieldwidgets import BS3TextFieldWidget
         from flask_babel import lazy_gettext
@@ -111,8 +111,8 @@ class KubernetesHook(BaseHook, PodOperatorHookProtocol):
             ),
         }
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Return custom field behaviour."""
         return {
             "hidden_fields": ["host", "schema", "login", "password", "port", 
"extra"],
diff --git a/airflow/providers/cohere/hooks/cohere.py 
b/airflow/providers/cohere/hooks/cohere.py
index 20c77d5869..3b60c9060c 100644
--- a/airflow/providers/cohere/hooks/cohere.py
+++ b/airflow/providers/cohere/hooks/cohere.py
@@ -66,8 +66,8 @@ class CohereHook(BaseHook):
         embeddings = response.embeddings
         return embeddings
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         return {
             "hidden_fields": ["schema", "login", "port", "extra"],
             "relabeling": {
diff --git a/airflow/providers/datadog/hooks/datadog.py 
b/airflow/providers/datadog/hooks/datadog.py
index 4db7abd3ca..3530aa7677 100644
--- a/airflow/providers/datadog/hooks/datadog.py
+++ b/airflow/providers/datadog/hooks/datadog.py
@@ -158,8 +158,8 @@ class DatadogHook(BaseHook, LoggingMixin):
         self.validate_response(response)
         return response
 
-    @staticmethod
-    def get_connection_form_widgets() -> dict[str, Any]:
+    @classmethod
+    def get_connection_form_widgets(cls) -> dict[str, Any]:
         """Return connection widgets to add to connection form."""
         from flask_appbuilder.fieldwidgets import BS3TextFieldWidget
         from flask_babel import lazy_gettext
@@ -172,8 +172,8 @@ class DatadogHook(BaseHook, LoggingMixin):
             "source_type_name": StringField(lazy_gettext("Source type name"), 
widget=BS3TextFieldWidget()),
         }
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Return custom field behaviour."""
         return {
             "hidden_fields": ["schema", "login", "password", "port", "extra"],
diff --git a/airflow/providers/dbt/cloud/hooks/dbt.py 
b/airflow/providers/dbt/cloud/hooks/dbt.py
index b37a9ca829..a375aa27c7 100644
--- a/airflow/providers/dbt/cloud/hooks/dbt.py
+++ b/airflow/providers/dbt/cloud/hooks/dbt.py
@@ -174,8 +174,8 @@ class DbtCloudHook(HttpHook):
     conn_type = "dbt_cloud"
     hook_name = "dbt Cloud"
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Build custom field behavior for the dbt Cloud connection form in 
the Airflow UI."""
         return {
             "hidden_fields": ["schema", "port", "extra"],
diff --git a/airflow/providers/docker/hooks/docker.py 
b/airflow/providers/docker/hooks/docker.py
index 768ea9f942..763c3a7877 100644
--- a/airflow/providers/docker/hooks/docker.py
+++ b/airflow/providers/docker/hooks/docker.py
@@ -166,8 +166,8 @@ class DockerHook(BaseHook):
             self.log.error("Login failed")
             raise
 
-    @staticmethod
-    def get_connection_form_widgets() -> dict[str, Any]:
+    @classmethod
+    def get_connection_form_widgets(cls) -> dict[str, Any]:
         """Return connection form widgets."""
         from flask_appbuilder.fieldwidgets import BS3TextFieldWidget
         from flask_babel import lazy_gettext
diff --git a/airflow/providers/github/hooks/github.py 
b/airflow/providers/github/hooks/github.py
index b4a4732850..cbd2d92522 100644
--- a/airflow/providers/github/hooks/github.py
+++ b/airflow/providers/github/hooks/github.py
@@ -68,8 +68,8 @@ class GithubHook(BaseHook):
 
         return self.client
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict:
         """Return custom field behaviour."""
         return {
             "hidden_fields": ["schema", "port", "login", "extra"],
diff --git a/airflow/providers/google/cloud/hooks/compute_ssh.py 
b/airflow/providers/google/cloud/hooks/compute_ssh.py
index de488cecab..9ed5899cfc 100644
--- a/airflow/providers/google/cloud/hooks/compute_ssh.py
+++ b/airflow/providers/google/cloud/hooks/compute_ssh.py
@@ -96,8 +96,8 @@ class ComputeEngineSSHHook(SSHHook):
     conn_type = "gcpssh"
     hook_name = "Google Cloud SSH"
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         return {
             "hidden_fields": ["host", "schema", "login", "password", "port", 
"extra"],
             "relabeling": {},
diff --git a/airflow/providers/google/common/hooks/base_google.py 
b/airflow/providers/google/common/hooks/base_google.py
index 3bde53571a..72c51212ac 100644
--- a/airflow/providers/google/common/hooks/base_google.py
+++ b/airflow/providers/google/common/hooks/base_google.py
@@ -188,8 +188,8 @@ class GoogleBaseHook(BaseHook):
     conn_type = "google_cloud_platform"
     hook_name = "Google Cloud"
 
-    @staticmethod
-    def get_connection_form_widgets() -> dict[str, Any]:
+    @classmethod
+    def get_connection_form_widgets(cls) -> dict[str, Any]:
         """Returns connection widgets to add to connection form."""
         from flask_appbuilder.fieldwidgets import BS3PasswordFieldWidget, 
BS3TextFieldWidget
         from flask_babel import lazy_gettext
@@ -221,8 +221,8 @@ class GoogleBaseHook(BaseHook):
             ),
         }
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Returns custom field behaviour."""
         return {
             "hidden_fields": ["host", "schema", "login", "password", "port", 
"extra"],
diff --git a/airflow/providers/grpc/hooks/grpc.py 
b/airflow/providers/grpc/hooks/grpc.py
index a3ea7530cf..b0bec1b9ce 100644
--- a/airflow/providers/grpc/hooks/grpc.py
+++ b/airflow/providers/grpc/hooks/grpc.py
@@ -51,8 +51,8 @@ class GrpcHook(BaseHook):
     conn_type = "grpc"
     hook_name = "GRPC Connection"
 
-    @staticmethod
-    def get_connection_form_widgets() -> dict[str, Any]:
+    @classmethod
+    def get_connection_form_widgets(cls) -> dict[str, Any]:
         """Returns connection widgets to add to connection form."""
         from flask_appbuilder.fieldwidgets import BS3TextFieldWidget
         from flask_babel import lazy_gettext
diff --git a/airflow/providers/hashicorp/hooks/vault.py 
b/airflow/providers/hashicorp/hooks/vault.py
index 67594937f8..4edf616652 100644
--- a/airflow/providers/hashicorp/hooks/vault.py
+++ b/airflow/providers/hashicorp/hooks/vault.py
@@ -403,8 +403,8 @@ class VaultHook(BaseHook):
             "use_tls": BooleanField(lazy_gettext("Use TLS"), default=True),
         }
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Returns custom field behaviour."""
         return {
             "hidden_fields": ["extra"],
diff --git a/airflow/providers/jdbc/hooks/jdbc.py 
b/airflow/providers/jdbc/hooks/jdbc.py
index 35267319af..dd592652ae 100644
--- a/airflow/providers/jdbc/hooks/jdbc.py
+++ b/airflow/providers/jdbc/hooks/jdbc.py
@@ -74,8 +74,8 @@ class JdbcHook(DbApiHook):
         self._driver_path = driver_path
         self._driver_class = driver_class
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Get custom field behaviour."""
         return {
             "hidden_fields": ["port", "schema"],
diff --git a/airflow/providers/jenkins/hooks/jenkins.py 
b/airflow/providers/jenkins/hooks/jenkins.py
index 680b995d5c..afdde319a8 100644
--- a/airflow/providers/jenkins/hooks/jenkins.py
+++ b/airflow/providers/jenkins/hooks/jenkins.py
@@ -32,8 +32,8 @@ class JenkinsHook(BaseHook):
     conn_type = "jenkins"
     hook_name = "Jenkins"
 
-    @staticmethod
-    def get_connection_form_widgets() -> dict[str, Any]:
+    @classmethod
+    def get_connection_form_widgets(cls) -> dict[str, Any]:
         """Returns connection widgets to add to connection form."""
         from flask_babel import lazy_gettext
         from wtforms import BooleanField
@@ -45,8 +45,8 @@ class JenkinsHook(BaseHook):
             ),
         }
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Returns custom field behaviour."""
         return {
             "hidden_fields": ["schema", "extra"],
diff --git a/airflow/providers/microsoft/azure/hooks/asb.py 
b/airflow/providers/microsoft/azure/hooks/asb.py
index 1c8a55544c..6155165554 100644
--- a/airflow/providers/microsoft/azure/hooks/asb.py
+++ b/airflow/providers/microsoft/azure/hooks/asb.py
@@ -45,9 +45,9 @@ class BaseAzureServiceBusHook(BaseHook):
     conn_type = "azure_service_bus"
     hook_name = "Azure Service Bus"
 
-    @staticmethod
+    @classmethod
     @add_managed_identity_connection_widgets
-    def get_connection_form_widgets() -> dict[str, Any]:
+    def get_connection_form_widgets(cls) -> dict[str, Any]:
         """Returns connection widgets to add to connection form."""
         from flask_appbuilder.fieldwidgets import BS3TextFieldWidget
         from flask_babel import lazy_gettext
@@ -60,8 +60,8 @@ class BaseAzureServiceBusHook(BaseHook):
             "credential": PasswordField(lazy_gettext("Credential"), 
widget=BS3TextFieldWidget()),
         }
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Returns custom field behaviour."""
         return {
             "hidden_fields": ["port", "host", "extra", "login", "password"],
diff --git a/airflow/providers/microsoft/azure/hooks/base_azure.py 
b/airflow/providers/microsoft/azure/hooks/base_azure.py
index d6ecf185c4..9ec7aedd4b 100644
--- a/airflow/providers/microsoft/azure/hooks/base_azure.py
+++ b/airflow/providers/microsoft/azure/hooks/base_azure.py
@@ -47,9 +47,9 @@ class AzureBaseHook(BaseHook):
     conn_type = "azure"
     hook_name = "Azure"
 
-    @staticmethod
+    @classmethod
     @add_managed_identity_connection_widgets
-    def get_connection_form_widgets() -> dict[str, Any]:
+    def get_connection_form_widgets(cls) -> dict[str, Any]:
         """Returns connection widgets to add to connection form."""
         from flask_appbuilder.fieldwidgets import BS3TextFieldWidget
         from flask_babel import lazy_gettext
@@ -60,8 +60,8 @@ class AzureBaseHook(BaseHook):
             "subscriptionId": StringField(lazy_gettext("Azure Subscription 
ID"), widget=BS3TextFieldWidget()),
         }
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Returns custom field behaviour."""
         import json
 
diff --git a/airflow/providers/microsoft/azure/hooks/container_registry.py 
b/airflow/providers/microsoft/azure/hooks/container_registry.py
index 04f7893d39..acc704dfdf 100644
--- a/airflow/providers/microsoft/azure/hooks/container_registry.py
+++ b/airflow/providers/microsoft/azure/hooks/container_registry.py
@@ -46,9 +46,9 @@ class AzureContainerRegistryHook(BaseHook):
     conn_type = "azure_container_registry"
     hook_name = "Azure Container Registry"
 
-    @staticmethod
+    @classmethod
     @add_managed_identity_connection_widgets
-    def get_connection_form_widgets() -> dict[str, Any]:
+    def get_connection_form_widgets(cls) -> dict[str, Any]:
         """Returns connection widgets to add to connection form."""
         from flask_appbuilder.fieldwidgets import BS3TextFieldWidget
         from flask_babel import lazy_gettext
diff --git a/airflow/providers/microsoft/azure/hooks/container_volume.py 
b/airflow/providers/microsoft/azure/hooks/container_volume.py
index b9a712738c..5fa926bc1b 100644
--- a/airflow/providers/microsoft/azure/hooks/container_volume.py
+++ b/airflow/providers/microsoft/azure/hooks/container_volume.py
@@ -43,9 +43,9 @@ class AzureContainerVolumeHook(BaseHook):
     conn_type = "azure_container_volume"
     hook_name = "Azure Container Volume"
 
-    @staticmethod
+    @classmethod
     @add_managed_identity_connection_widgets
-    def get_connection_form_widgets() -> dict[str, Any]:
+    def get_connection_form_widgets(cls) -> dict[str, Any]:
         """Returns connection widgets to add to connection form."""
         from flask_appbuilder.fieldwidgets import BS3PasswordFieldWidget, 
BS3TextFieldWidget
         from flask_babel import lazy_gettext
@@ -65,8 +65,8 @@ class AzureContainerVolumeHook(BaseHook):
             ),
         }
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Returns custom field behaviour."""
         return {
             "hidden_fields": ["schema", "port", "host", "extra"],
diff --git a/airflow/providers/microsoft/azure/hooks/cosmos.py 
b/airflow/providers/microsoft/azure/hooks/cosmos.py
index 4737554b50..cf56924609 100644
--- a/airflow/providers/microsoft/azure/hooks/cosmos.py
+++ b/airflow/providers/microsoft/azure/hooks/cosmos.py
@@ -59,9 +59,9 @@ class AzureCosmosDBHook(BaseHook):
     conn_type = "azure_cosmos"
     hook_name = "Azure CosmosDB"
 
-    @staticmethod
+    @classmethod
     @add_managed_identity_connection_widgets
-    def get_connection_form_widgets() -> dict[str, Any]:
+    def get_connection_form_widgets(cls) -> dict[str, Any]:
         """Returns connection widgets to add to connection form."""
         from flask_appbuilder.fieldwidgets import BS3TextFieldWidget
         from flask_babel import lazy_gettext
@@ -84,8 +84,8 @@ class AzureCosmosDBHook(BaseHook):
             ),
         }
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Returns custom field behaviour."""
         return {
             "hidden_fields": ["schema", "port", "host", "extra"],
diff --git a/airflow/providers/microsoft/azure/hooks/data_factory.py 
b/airflow/providers/microsoft/azure/hooks/data_factory.py
index 8047f15939..83181e89c0 100644
--- a/airflow/providers/microsoft/azure/hooks/data_factory.py
+++ b/airflow/providers/microsoft/azure/hooks/data_factory.py
@@ -156,9 +156,9 @@ class AzureDataFactoryHook(BaseHook):
     default_conn_name: str = "azure_data_factory_default"
     hook_name: str = "Azure Data Factory"
 
-    @staticmethod
+    @classmethod
     @add_managed_identity_connection_widgets
-    def get_connection_form_widgets() -> dict[str, Any]:
+    def get_connection_form_widgets(cls) -> dict[str, Any]:
         """Returns connection widgets to add to connection form."""
         from flask_appbuilder.fieldwidgets import BS3TextFieldWidget
         from flask_babel import lazy_gettext
@@ -173,8 +173,8 @@ class AzureDataFactoryHook(BaseHook):
             "factory_name": StringField(lazy_gettext("Factory Name"), 
widget=BS3TextFieldWidget()),
         }
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Returns custom field behaviour."""
         return {
             "hidden_fields": ["schema", "port", "host", "extra"],
diff --git a/airflow/providers/microsoft/azure/hooks/data_lake.py 
b/airflow/providers/microsoft/azure/hooks/data_lake.py
index b6f49e5cf8..0b247ac7fc 100644
--- a/airflow/providers/microsoft/azure/hooks/data_lake.py
+++ b/airflow/providers/microsoft/azure/hooks/data_lake.py
@@ -65,9 +65,9 @@ class AzureDataLakeHook(BaseHook):
     conn_type = "azure_data_lake"
     hook_name = "Azure Data Lake"
 
-    @staticmethod
+    @classmethod
     @add_managed_identity_connection_widgets
-    def get_connection_form_widgets() -> dict[str, Any]:
+    def get_connection_form_widgets(cls) -> dict[str, Any]:
         """Returns connection widgets to add to connection form."""
         from flask_appbuilder.fieldwidgets import BS3TextFieldWidget
         from flask_babel import lazy_gettext
@@ -80,8 +80,8 @@ class AzureDataLakeHook(BaseHook):
             ),
         }
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Returns custom field behaviour."""
         return {
             "hidden_fields": ["schema", "port", "host", "extra"],
diff --git a/airflow/providers/microsoft/azure/hooks/fileshare.py 
b/airflow/providers/microsoft/azure/hooks/fileshare.py
index 5ecaee80da..e9a2b21873 100644
--- a/airflow/providers/microsoft/azure/hooks/fileshare.py
+++ b/airflow/providers/microsoft/azure/hooks/fileshare.py
@@ -42,9 +42,9 @@ class AzureFileShareHook(BaseHook):
     conn_type = "azure_fileshare"
     hook_name = "Azure FileShare"
 
-    @staticmethod
+    @classmethod
     @add_managed_identity_connection_widgets
-    def get_connection_form_widgets() -> dict[str, Any]:
+    def get_connection_form_widgets(cls) -> dict[str, Any]:
         """Returns connection widgets to add to connection form."""
         from flask_appbuilder.fieldwidgets import BS3PasswordFieldWidget, 
BS3TextFieldWidget
         from flask_babel import lazy_gettext
@@ -57,8 +57,8 @@ class AzureFileShareHook(BaseHook):
             ),
         }
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Returns custom field behaviour."""
         return {
             "hidden_fields": ["schema", "port", "host", "extra"],
diff --git a/airflow/providers/microsoft/azure/hooks/synapse.py 
b/airflow/providers/microsoft/azure/hooks/synapse.py
index d48109d694..397c82640d 100644
--- a/airflow/providers/microsoft/azure/hooks/synapse.py
+++ b/airflow/providers/microsoft/azure/hooks/synapse.py
@@ -69,9 +69,9 @@ class AzureSynapseHook(BaseHook):
     default_conn_name: str = "azure_synapse_default"
     hook_name: str = "Azure Synapse"
 
-    @staticmethod
+    @classmethod
     @add_managed_identity_connection_widgets
-    def get_connection_form_widgets() -> dict[str, Any]:
+    def get_connection_form_widgets(cls) -> dict[str, Any]:
         """Returns connection widgets to add to connection form."""
         from flask_appbuilder.fieldwidgets import BS3TextFieldWidget
         from flask_babel import lazy_gettext
@@ -82,8 +82,8 @@ class AzureSynapseHook(BaseHook):
             "subscriptionId": StringField(lazy_gettext("Subscription ID"), 
widget=BS3TextFieldWidget()),
         }
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Returns custom field behaviour."""
         return {
             "hidden_fields": ["schema", "port", "extra"],
@@ -253,8 +253,8 @@ class AzureSynapsePipelineHook(BaseHook):
     default_conn_name: str = "azure_synapse_connection"
     hook_name: str = "Azure Synapse Pipeline"
 
-    @staticmethod
-    def get_connection_form_widgets() -> dict[str, Any]:
+    @classmethod
+    def get_connection_form_widgets(cls) -> dict[str, Any]:
         """Returns connection widgets to add to connection form."""
         from flask_appbuilder.fieldwidgets import BS3TextFieldWidget
         from flask_babel import lazy_gettext
@@ -264,8 +264,8 @@ class AzureSynapsePipelineHook(BaseHook):
             "tenantId": StringField(lazy_gettext("Tenant ID"), 
widget=BS3TextFieldWidget()),
         }
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Returns custom field behaviour."""
         return {
             "hidden_fields": ["schema", "port", "extra"],
diff --git a/airflow/providers/microsoft/azure/hooks/wasb.py 
b/airflow/providers/microsoft/azure/hooks/wasb.py
index 13bab2c719..7d05ac862b 100644
--- a/airflow/providers/microsoft/azure/hooks/wasb.py
+++ b/airflow/providers/microsoft/azure/hooks/wasb.py
@@ -81,9 +81,9 @@ class WasbHook(BaseHook):
     conn_type = "wasb"
     hook_name = "Azure Blob Storage"
 
-    @staticmethod
+    @classmethod
     @add_managed_identity_connection_widgets
-    def get_connection_form_widgets() -> dict[str, Any]:
+    def get_connection_form_widgets(cls) -> dict[str, Any]:
         """Returns connection widgets to add to connection form."""
         from flask_appbuilder.fieldwidgets import BS3PasswordFieldWidget, 
BS3TextFieldWidget
         from flask_babel import lazy_gettext
@@ -102,8 +102,8 @@ class WasbHook(BaseHook):
             "sas_token": PasswordField(lazy_gettext("SAS Token (optional)"), 
widget=BS3PasswordFieldWidget()),
         }
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Returns custom field behaviour."""
         return {
             "hidden_fields": ["schema", "port"],
diff --git a/airflow/providers/opensearch/hooks/opensearch.py 
b/airflow/providers/opensearch/hooks/opensearch.py
index 5338a52ab5..d0bdc3ff86 100644
--- a/airflow/providers/opensearch/hooks/opensearch.py
+++ b/airflow/providers/opensearch/hooks/opensearch.py
@@ -105,8 +105,8 @@ class OpenSearchHook(BaseHook):
         else:
             AirflowException("To delete a document you must include one of 
either a query or a document id. ")
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Returns custom UI field behaviour for OpenSearch Connection."""
         return {
             "hidden_fields": ["schema"],
diff --git a/airflow/providers/pagerduty/hooks/pagerduty.py 
b/airflow/providers/pagerduty/hooks/pagerduty.py
index d839088782..0b74d671ba 100644
--- a/airflow/providers/pagerduty/hooks/pagerduty.py
+++ b/airflow/providers/pagerduty/hooks/pagerduty.py
@@ -50,8 +50,8 @@ class PagerdutyHook(BaseHook):
     conn_type = "pagerduty"
     hook_name = "Pagerduty"
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Returns custom field behaviour."""
         return {
             "hidden_fields": ["port", "login", "schema", "host"],
diff --git a/airflow/providers/pagerduty/hooks/pagerduty_events.py 
b/airflow/providers/pagerduty/hooks/pagerduty_events.py
index 9ad34bd154..2e73d63d5a 100644
--- a/airflow/providers/pagerduty/hooks/pagerduty_events.py
+++ b/airflow/providers/pagerduty/hooks/pagerduty_events.py
@@ -47,8 +47,8 @@ class PagerdutyEventsHook(BaseHook):
     conn_type = "pagerduty_events"
     hook_name = "Pagerduty Events"
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Returns custom field behaviour."""
         return {
             "hidden_fields": ["port", "login", "schema", "host", "extra"],
diff --git a/airflow/providers/pinecone/hooks/pinecone.py 
b/airflow/providers/pinecone/hooks/pinecone.py
index d4fcd70400..f15605556c 100644
--- a/airflow/providers/pinecone/hooks/pinecone.py
+++ b/airflow/providers/pinecone/hooks/pinecone.py
@@ -43,8 +43,8 @@ class PineconeHook(BaseHook):
     conn_type = "pinecone"
     hook_name = "Pinecone"
 
-    @staticmethod
-    def get_connection_form_widgets() -> dict[str, Any]:
+    @classmethod
+    def get_connection_form_widgets(cls) -> dict[str, Any]:
         """Returns connection widgets to add to connection form."""
         from flask_appbuilder.fieldwidgets import BS3TextFieldWidget
         from flask_babel import lazy_gettext
diff --git a/airflow/providers/postgres/hooks/postgres.py 
b/airflow/providers/postgres/hooks/postgres.py
index 033fff0921..15472a3037 100644
--- a/airflow/providers/postgres/hooks/postgres.py
+++ b/airflow/providers/postgres/hooks/postgres.py
@@ -366,8 +366,8 @@ class PostgresHook(DbApiHook):
         """Returns current schema. This is usually changed with 
``SEARCH_PATH`` parameter."""
         return self.get_first("SELECT CURRENT_SCHEMA;")[0]
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         return {
             "hidden_fields": [],
             "relabeling": {
diff --git a/airflow/providers/salesforce/hooks/salesforce.py 
b/airflow/providers/salesforce/hooks/salesforce.py
index b8dc1af10f..af3ef1292b 100644
--- a/airflow/providers/salesforce/hooks/salesforce.py
+++ b/airflow/providers/salesforce/hooks/salesforce.py
@@ -91,8 +91,8 @@ class SalesforceHook(BaseHook):
         prefixed_name = f"{backcompat_prefix}{field_name}"
         return extras.get(prefixed_name) or None
 
-    @staticmethod
-    def get_connection_form_widgets() -> dict[str, Any]:
+    @classmethod
+    def get_connection_form_widgets(cls) -> dict[str, Any]:
         """Returns connection widgets to add to connection form."""
         from flask_appbuilder.fieldwidgets import BS3PasswordFieldWidget, 
BS3TextFieldWidget
         from flask_babel import lazy_gettext
@@ -114,8 +114,8 @@ class SalesforceHook(BaseHook):
             "client_id": StringField(lazy_gettext("Client ID"), 
widget=BS3TextFieldWidget()),
         }
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Returns custom field behaviour."""
         return {
             "hidden_fields": ["schema", "port", "extra", "host"],
diff --git a/airflow/providers/sftp/hooks/sftp.py 
b/airflow/providers/sftp/hooks/sftp.py
index 7f3b851c9f..3b67d164a2 100644
--- a/airflow/providers/sftp/hooks/sftp.py
+++ b/airflow/providers/sftp/hooks/sftp.py
@@ -61,8 +61,8 @@ class SFTPHook(SSHHook):
     conn_type = "sftp"
     hook_name = "SFTP"
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         return {
             "hidden_fields": ["schema"],
             "relabeling": {
diff --git a/airflow/providers/smtp/hooks/smtp.py 
b/airflow/providers/smtp/hooks/smtp.py
index cf624e4cf0..4712180eac 100644
--- a/airflow/providers/smtp/hooks/smtp.py
+++ b/airflow/providers/smtp/hooks/smtp.py
@@ -378,8 +378,8 @@ class SmtpHook(BaseHook):
     def use_ssl(self) -> bool:
         return not bool(self.conn.extra_dejson.get("disable_ssl", False))
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Returns custom field behaviour."""
         return {
             "hidden_fields": ["schema", "extra"],
diff --git a/airflow/providers/snowflake/hooks/snowflake.py 
b/airflow/providers/snowflake/hooks/snowflake.py
index 081d734ac3..ead3e92274 100644
--- a/airflow/providers/snowflake/hooks/snowflake.py
+++ b/airflow/providers/snowflake/hooks/snowflake.py
@@ -90,8 +90,8 @@ class SnowflakeHook(DbApiHook):
     supports_autocommit = True
     _test_connection_sql = "select 1"
 
-    @staticmethod
-    def get_connection_form_widgets() -> dict[str, Any]:
+    @classmethod
+    def get_connection_form_widgets(cls) -> dict[str, Any]:
         """Returns connection widgets to add to connection form."""
         from flask_appbuilder.fieldwidgets import BS3TextAreaFieldWidget, 
BS3TextFieldWidget
         from flask_babel import lazy_gettext
@@ -112,8 +112,8 @@ class SnowflakeHook(DbApiHook):
             ),
         }
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Returns custom field behaviour."""
         import json
 
diff --git a/airflow/providers/ssh/hooks/ssh.py 
b/airflow/providers/ssh/hooks/ssh.py
index 98f38835d8..5bd7878daa 100644
--- a/airflow/providers/ssh/hooks/ssh.py
+++ b/airflow/providers/ssh/hooks/ssh.py
@@ -93,8 +93,8 @@ class SSHHook(BaseHook):
     conn_type = "ssh"
     hook_name = "SSH"
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Returns custom field behaviour."""
         return {
             "hidden_fields": ["schema"],
diff --git a/airflow/providers/tabular/hooks/tabular.py 
b/airflow/providers/tabular/hooks/tabular.py
index da99cfbb9f..3d0835282e 100644
--- a/airflow/providers/tabular/hooks/tabular.py
+++ b/airflow/providers/tabular/hooks/tabular.py
@@ -44,8 +44,8 @@ class TabularHook(BaseHook):
     conn_type = "tabular"
     hook_name = "Tabular"
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Returns custom field behaviour."""
         return {
             "hidden_fields": ["schema", "port"],
diff --git a/airflow/providers/yandex/hooks/yandex.py 
b/airflow/providers/yandex/hooks/yandex.py
index e91b287bfa..f7f0fb1398 100644
--- a/airflow/providers/yandex/hooks/yandex.py
+++ b/airflow/providers/yandex/hooks/yandex.py
@@ -38,8 +38,8 @@ class YandexCloudBaseHook(BaseHook):
     conn_type = "yandexcloud"
     hook_name = "Yandex Cloud"
 
-    @staticmethod
-    def get_connection_form_widgets() -> dict[str, Any]:
+    @classmethod
+    def get_connection_form_widgets(cls) -> dict[str, Any]:
         """Returns connection widgets to add to connection form."""
         from flask_appbuilder.fieldwidgets import BS3PasswordFieldWidget, 
BS3TextFieldWidget
         from flask_babel import lazy_gettext
@@ -107,8 +107,8 @@ class YandexCloudBaseHook(BaseHook):
             warnings.warn(f"Hook '{cls.hook_name}' info is not initialized in 
airflow.ProviderManager")
             return None
 
-    @staticmethod
-    def get_ui_field_behaviour() -> dict[str, Any]:
+    @classmethod
+    def get_ui_field_behaviour(cls) -> dict[str, Any]:
         """Returns custom field behaviour."""
         return {
             "hidden_fields": ["host", "schema", "login", "password", "port", 
"extra"],
diff --git a/tests/providers/microsoft/azure/test_utils.py 
b/tests/providers/microsoft/azure/test_utils.py
index f04acaab13..4102961bbe 100644
--- a/tests/providers/microsoft/azure/test_utils.py
+++ b/tests/providers/microsoft/azure/test_utils.py
@@ -71,13 +71,17 @@ def test_get_field_non_prefixed(input, expected):
 
 
 def test_add_managed_identity_connection_widgets():
-    def test_func() -> dict[str, Any]:
-        return {}
+    class FakeHook:
+        @classmethod
+        @add_managed_identity_connection_widgets
+        def test_class_method(cls) -> dict[str, Any]:
+            return {"foo": "bar"}
 
-    widgets = add_managed_identity_connection_widgets(test_func)()
+    widgets = FakeHook.test_class_method()
 
     assert "managed_identity_client_id" in widgets
     assert "workload_identity_tenant_id" in widgets
+    assert widgets["foo"] == "bar"
 
 
 @mock.patch(f"{MODULE}.DefaultAzureCredential")


Reply via email to