You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by "davidnzhang (via GitHub)" <gi...@apache.org> on 2026/06/26 07:25:07 UTC

[PR] Fix msgraph/Power BI auth failure from empty allowed_hosts list [airflow]

davidnzhang opened a new pull request, #69014:
URL: https://github.com/apache/airflow/pull/69014

    <!-- SPDX-License-Identifier: Apache-2.0
         https://www.apache.org/licenses/LICENSE-2.0 -->
   
   <!--
   Thank you for contributing!
   
   Please provide above a brief description of the changes made in this pull request.
   Write a good git commit message following this guide: http://chris.beams.io/posts/git-commit/
   
   Please make sure that your code changes are covered with tests.
   And in case of new features or big changes remember to adjust the documentation.
   
   For user-facing UI changes, please attach before/after screenshots (or a short
   screen recording) so reviewers can assess the visual impact.
   
   Feel free to ping (in general) for the review if you do not see reaction for a few days
   (72 Hours is the minimum reaction time you can expect from volunteers) - we sometimes miss notifications.
   
   In case of an existing issue, reference it using one of the following:
   
   * closes: #ISSUE
   * related: #ISSUE
   -->
   
   ## What
   `KiotaRequestAdapterHook._build_request_adapter` derives `allowed_hosts` from the connection's `extra` field and passes it to `AzureIdentityAuthenticationProvider`. When neither `allowed_hosts` nor `authority` is configured, `allowed_hosts` returned `[""]` rather than a true empty list.
   
   When this value eventually flows through to kiota's `AllowedHostsValidator.is_url_host_valid` method, it fails to skip validation via the early return:
   ```python
   if not self.get_allowed_hosts():
       return True
   ```
   
   This PR filters out blank strings so an unconfigured connection yields `[]` and correctly takes the early exit described above.
   
   ## Why
   A recent change in the microsoft-kiota-abstractions package ([microsoft/kiota-python@8755f70](https://github.com/microsoft/kiota-python/commit/8755f7026763e0cf30d13d01ac46f48fd26798ff)) fixed the `AllowedHostsValidator` to actually enforce a list of allowed hosts. Previously, it only checked whether a URL was structurally valid and ignored the configured `allowed_hosts` set entirely. The `is_url_host_valid` method now correctly extracts the hostname from the URL and checks is against the allow list.
   
   This seemed to break existing Power BI connections which did not configure `allowed_hosts` or `authority` (which is the default for Power BI connections), as the validator receives a list with an empty string instead of a true empty list, causing requests to fail validation.
   
   Note that before the Microsoft change this was harmless, as the validator method never actually compared against the configured hosts (`return all([scheme, netloc])` -> `True`). This PR restores kiota's "skip validation" pathway for the default case where no `allowed_hosts` are set.
   
   ---
   
   ##### Was generative AI tooling used to co-author this PR?
   
   <!--
   If generative AI tooling has been used in the process of authoring this PR, please
   change below checkbox to `[X]` followed by the name of the tool, uncomment the "Generated-by".
   -->
   
   - [x] Yes (please specify the tool below)
   
   Generated-by: Claude Sonnet 4.6, following [the guidelines](https://github.com/apache/airflow/blob/main/contributing-docs/05_pull_requests.rst#gen-ai-assisted-contributions)
   
   ---
   
   * Read the **[Pull Request Guidelines](https://github.com/apache/airflow/blob/main/contributing-docs/05_pull_requests.rst#pull-request-guidelines)** for more information. Note: commit author/co-author name and email in commits become permanently public when merged.
   * For fundamental code changes, an Airflow Improvement Proposal ([AIP](https://cwiki.apache.org/confluence/display/AIRFLOW/Airflow+Improvement+Proposals)) is needed.
   * When adding dependency, check compliance with the [ASF 3rd Party License Policy](https://www.apache.org/legal/resolved.html#category-x).
   * For significant user-facing changes create newsfragment: `{pr_number}.significant.rst`, in [airflow-core/newsfragments](https://github.com/apache/airflow/tree/main/airflow-core/newsfragments). You can add this file in a follow-up commit after the PR is created so you know the PR number.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Fix msgraph/Power BI auth failure from empty allowed_hosts list [airflow]

Posted by "dabla (via GitHub)" <gi...@apache.org>.
dabla commented on code in PR #69014:
URL: https://github.com/apache/airflow/pull/69014#discussion_r3490136049


##########
providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/msgraph.py:
##########
@@ -311,7 +311,7 @@ def _build_request_adapter(self, connection) -> tuple[str, RequestAdapter]:
             scopes = scopes.split(",")
         verify = config.get("verify", True)
         trust_env = config.get("trust_env", False)
-        allowed_hosts = (config.get("allowed_hosts", authority) or "").split(",")
+        allowed_hosts = [host for host in (config.get("allowed_hosts", authority) or "").split(",") if host]

Review Comment:
   Looking good, if CI/CD is green we can merge, thx for the PR !



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Fix msgraph/Power BI auth failure from empty allowed_hosts list [airflow]

Posted by "davidnzhang (via GitHub)" <gi...@apache.org>.
davidnzhang commented on code in PR #69014:
URL: https://github.com/apache/airflow/pull/69014#discussion_r3485702009


##########
providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/msgraph.py:
##########
@@ -311,7 +311,7 @@ def _build_request_adapter(self, connection) -> tuple[str, RequestAdapter]:
             scopes = scopes.split(",")
         verify = config.get("verify", True)
         trust_env = config.get("trust_env", False)
-        allowed_hosts = (config.get("allowed_hosts", authority) or "").split(",")
+        allowed_hosts = [host for host in (config.get("allowed_hosts", authority) or "").split(",") if host]

Review Comment:
   Thanks for your suggestions @SameerMesiah97 @dabla 
   
   I've just split this out into its own static method in 63f1456 as it seems like it's doing a few different things now.
   
   Also added the filtering logic for empty host entries in 5e90794.
   
   I think blank entries in an otherwise valid list e.g. "host1,,host2," and "," as suggested by @SameerMesiah97 in the testing thread was not the target of this fix, which is to allow the early return for truly empty allowed_hosts in `AllowedHostsValidator`.  The first example "host1,,host2," would still allow for validation to occur on host1 and host2. The second example "," will actually fail validation without `[host for host in ... if host]` but is arguably a garbage in garbage out situation.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Fix msgraph/Power BI auth failure from empty allowed_hosts list [airflow]

Posted by "dabla (via GitHub)" <gi...@apache.org>.
dabla merged PR #69014:
URL: https://github.com/apache/airflow/pull/69014


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Fix msgraph/Power BI auth failure from empty allowed_hosts list [airflow]

Posted by "davidnzhang (via GitHub)" <gi...@apache.org>.
davidnzhang commented on code in PR #69014:
URL: https://github.com/apache/airflow/pull/69014#discussion_r3485754259


##########
providers/microsoft/azure/tests/unit/microsoft/azure/hooks/test_msgraph.py:
##########
@@ -570,6 +570,19 @@ async def test_send_request_invalidates_cache_and_raises_on_any_error(self):
             adapter.send_no_response_content_async.assert_called_once()
             assert hook.conn_id not in hook.cached_request_adapters
 
+    @pytest.mark.asyncio
+    async def test_allowed_hosts_is_empty_list_when_not_configured(self):
+        """an unset allowed_hosts/authority must yield []."""
+        KiotaRequestAdapterHook.cached_request_adapters.clear()
+        with patch_hook():
+            with patch(
+                "airflow.providers.microsoft.azure.hooks.msgraph.AzureIdentityAuthenticationProvider"
+            ) as mock_auth_provider:
+                hook = KiotaRequestAdapterHook(conn_id="msgraph_api")
+                await hook.get_async_conn()
+
+                assert mock_auth_provider.call_args.kwargs["allowed_hosts"] == []

Review Comment:
   Thanks for the review - changed to lighter direct unit tests on the new static method now that logic is moved out of `_build_request_adapter` (63f1456).
   
   On the filtering test - I held off on a dedicated test case for "host1,,host2,", as a blank host given alongside real hosts doesn't affect the validator. It just needs the distinction between an empty list `[]` which will hit this [early return](https://github.com/microsoft/kiota-python/commit/8755f7026763e0cf30d13d01ac46f48fd26798ff#diff-e26d7f5896b4b10a85e1e8cc9bc3a5f7654f88d31ed067def7863e8dfb9f931dR60-R61) block and a list with an empty string `[""]` which will evaluate to False in the same block and proceed to host validation.
   
   Happy to add the "," and "host1,,host2," if you think these are worth pinning down explicitly.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Fix msgraph/Power BI auth failure from empty allowed_hosts list [airflow]

Posted by "SameerMesiah97 (via GitHub)" <gi...@apache.org>.
SameerMesiah97 commented on code in PR #69014:
URL: https://github.com/apache/airflow/pull/69014#discussion_r3483411140


##########
providers/microsoft/azure/tests/unit/microsoft/azure/hooks/test_msgraph.py:
##########
@@ -570,6 +570,19 @@ async def test_send_request_invalidates_cache_and_raises_on_any_error(self):
             adapter.send_no_response_content_async.assert_called_once()
             assert hook.conn_id not in hook.cached_request_adapters
 
+    @pytest.mark.asyncio
+    async def test_allowed_hosts_is_empty_list_when_not_configured(self):
+        """an unset allowed_hosts/authority must yield []."""
+        KiotaRequestAdapterHook.cached_request_adapters.clear()
+        with patch_hook():
+            with patch(
+                "airflow.providers.microsoft.azure.hooks.msgraph.AzureIdentityAuthenticationProvider"
+            ) as mock_auth_provider:
+                hook = KiotaRequestAdapterHook(conn_id="msgraph_api")
+                await hook.get_async_conn()
+
+                assert mock_auth_provider.call_args.kwargs["allowed_hosts"] == []

Review Comment:
   Could we make this test exercise the filtering logic? Right now it only verifies the unconfigured case. Since the implementation now filters out empty entries, it woud be good to include input like "host1,,host2," (or even just ",") and assert that only the non-empty hosts are passed to `AzureIdentityAuthenticationProvider`.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Fix msgraph/Power BI auth failure from empty allowed_hosts list [airflow]

Posted by "dabla (via GitHub)" <gi...@apache.org>.
dabla commented on code in PR #69014:
URL: https://github.com/apache/airflow/pull/69014#discussion_r3485655204


##########
providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/msgraph.py:
##########
@@ -311,7 +311,7 @@ def _build_request_adapter(self, connection) -> tuple[str, RequestAdapter]:
             scopes = scopes.split(",")
         verify = config.get("verify", True)
         trust_env = config.get("trust_env", False)
-        allowed_hosts = (config.get("allowed_hosts", authority) or "").split(",")
+        allowed_hosts = [host for host in (config.get("allowed_hosts", authority) or "").split(",") if host]

Review Comment:
   Whu would you split if you already know allowed_hosts is an empty string? I think above example can be even more optimized.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Fix msgraph/Power BI auth failure from empty allowed_hosts list [airflow]

Posted by "dabla (via GitHub)" <gi...@apache.org>.
dabla commented on code in PR #69014:
URL: https://github.com/apache/airflow/pull/69014#discussion_r3485658128


##########
providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/msgraph.py:
##########
@@ -311,7 +311,7 @@ def _build_request_adapter(self, connection) -> tuple[str, RequestAdapter]:
             scopes = scopes.split(",")
         verify = config.get("verify", True)
         trust_env = config.get("trust_env", False)
-        allowed_hosts = (config.get("allowed_hosts", authority) or "").split(",")
+        allowed_hosts = [host for host in (config.get("allowed_hosts", authority) or "").split(",") if host]

Review Comment:
   allowed_hosts = config.get("allowed_hosts", authority)
   if allowed_hosts:
       return [host for host in allowed_hosts.split(",") if host]
   return [“”]



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Fix msgraph/Power BI auth failure from empty allowed_hosts list [airflow]

Posted by "SameerMesiah97 (via GitHub)" <gi...@apache.org>.
SameerMesiah97 commented on code in PR #69014:
URL: https://github.com/apache/airflow/pull/69014#discussion_r3485720240


##########
providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/msgraph.py:
##########
@@ -311,7 +311,7 @@ def _build_request_adapter(self, connection) -> tuple[str, RequestAdapter]:
             scopes = scopes.split(",")
         verify = config.get("verify", True)
         trust_env = config.get("trust_env", False)
-        allowed_hosts = (config.get("allowed_hosts", authority) or "").split(",")
+        allowed_hosts = [host for host in (config.get("allowed_hosts", authority) or "").split(",") if host]

Review Comment:
   > allowed_hosts = config.get("allowed_hosts", authority) if allowed_hosts: return [host for host in allowed_hosts.split(",") if host] return [“”]
   
   I agree. Thanks for catching that.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Fix msgraph/Power BI auth failure from empty allowed_hosts list [airflow]

Posted by "SameerMesiah97 (via GitHub)" <gi...@apache.org>.
SameerMesiah97 commented on code in PR #69014:
URL: https://github.com/apache/airflow/pull/69014#discussion_r3483446484


##########
providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/msgraph.py:
##########
@@ -311,7 +311,7 @@ def _build_request_adapter(self, connection) -> tuple[str, RequestAdapter]:
             scopes = scopes.split(",")
         verify = config.get("verify", True)
         trust_env = config.get("trust_env", False)
-        allowed_hosts = (config.get("allowed_hosts", authority) or "").split(",")
+        allowed_hosts = [host for host in (config.get("allowed_hosts", authority) or "").split(",") if host]

Review Comment:
   This could be clearer. Please see the below:
   
   ```
   allowed_hosts = config.get("allowed_hosts", authority)
   if not allowed_hosts:
       allowed_hosts = ""
   
   allowed_hosts = [host for host in allowed_hosts.split(",") if host]
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Fix msgraph/Power BI auth failure from empty allowed_hosts list [airflow]

Posted by "dabla (via GitHub)" <gi...@apache.org>.
dabla commented on code in PR #69014:
URL: https://github.com/apache/airflow/pull/69014#discussion_r3485655204


##########
providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/msgraph.py:
##########
@@ -311,7 +311,7 @@ def _build_request_adapter(self, connection) -> tuple[str, RequestAdapter]:
             scopes = scopes.split(",")
         verify = config.get("verify", True)
         trust_env = config.get("trust_env", False)
-        allowed_hosts = (config.get("allowed_hosts", authority) or "").split(",")
+        allowed_hosts = [host for host in (config.get("allowed_hosts", authority) or "").split(",") if host]

Review Comment:
   Why would you split if you already know allowed_hosts is an empty string? I think above example can be even more optimized.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org