From 97179fb5df128107fa430a9ee4042bfd015b824e Mon Sep 17 00:00:00 2001 From: Ebram Tawfik Date: Mon, 18 May 2026 11:06:37 -0700 Subject: [PATCH 1/3] fix: update fast-uri to 3.1.2 to resolve CVE-2026-6321 and CVE-2026-6322 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- DataFactory.MCP.Core/Resources/McpApps/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/DataFactory.MCP.Core/Resources/McpApps/package-lock.json b/DataFactory.MCP.Core/Resources/McpApps/package-lock.json index 7fa9fa8..682eaec 100644 --- a/DataFactory.MCP.Core/Resources/McpApps/package-lock.json +++ b/DataFactory.MCP.Core/Resources/McpApps/package-lock.json @@ -1860,9 +1860,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "funding": [ { "type": "github", From 383da85ddc0eef1aff725257ac89ab9cdcdabb8c Mon Sep 17 00:00:00 2001 From: Ebram Tawfik Date: Mon, 18 May 2026 11:31:57 -0700 Subject: [PATCH 2/3] fix: register Airflow Job types in DataFactoryJsonContext for source-gen JSON Add CreateAirflowJobRequest, UpdateAirflowJobRequest, AirflowJob, ListAirflowJobsResponse, and definition types to the source-generated JSON context. Replace anonymous type with EmptyRequest for getDefinition. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Configuration/DataFactoryJsonContext.cs | 12 ++++++++++++ .../Services/FabricAirflowJobService.cs | 3 ++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/DataFactory.MCP.Core/Configuration/DataFactoryJsonContext.cs b/DataFactory.MCP.Core/Configuration/DataFactoryJsonContext.cs index b649247..13d81d2 100644 --- a/DataFactory.MCP.Core/Configuration/DataFactoryJsonContext.cs +++ b/DataFactory.MCP.Core/Configuration/DataFactoryJsonContext.cs @@ -3,6 +3,8 @@ using System.Text.Json; using System.Text.Json.Serialization; +using DataFactory.MCP.Models.AirflowJob; +using DataFactory.MCP.Models.AirflowJob.Definition; using DataFactory.MCP.Models.Capacity; using DataFactory.MCP.Models.Common; using DataFactory.MCP.Models.Connection; @@ -97,6 +99,16 @@ namespace DataFactory.MCP.Configuration; [JsonSerializable(typeof(JsonElement))] [JsonSerializable(typeof(EmptyRequest))] [JsonSerializable(typeof(RunOnDemandRequest))] +// AirflowJob types +[JsonSerializable(typeof(AirflowJob))] +[JsonSerializable(typeof(CreateAirflowJobRequest))] +[JsonSerializable(typeof(UpdateAirflowJobRequest))] +[JsonSerializable(typeof(ListAirflowJobsResponse))] +// AirflowJob Definition types +[JsonSerializable(typeof(AirflowJobDefinition))] +[JsonSerializable(typeof(AirflowJobDefinitionPart))] +[JsonSerializable(typeof(GetAirflowJobDefinitionResponse))] +[JsonSerializable(typeof(UpdateAirflowJobDefinitionRequest))] internal sealed partial class DataFactoryJsonContext : JsonSerializerContext { } diff --git a/DataFactory.MCP.Core/Services/FabricAirflowJobService.cs b/DataFactory.MCP.Core/Services/FabricAirflowJobService.cs index d0d7e81..c3f494f 100644 --- a/DataFactory.MCP.Core/Services/FabricAirflowJobService.cs +++ b/DataFactory.MCP.Core/Services/FabricAirflowJobService.cs @@ -4,6 +4,7 @@ using DataFactory.MCP.Infrastructure.Http; using DataFactory.MCP.Models.AirflowJob; using DataFactory.MCP.Models.AirflowJob.Definition; +using DataFactory.MCP.Models.Common; using Microsoft.Extensions.Logging; namespace DataFactory.MCP.Services; @@ -185,7 +186,7 @@ public async Task GetAirflowJobDefinitionAsync( Logger.LogInformation("Getting definition for Apache Airflow Job {AirflowJobId} in workspace {WorkspaceId}", airflowJobId, workspaceId); - var emptyRequest = new { }; + var emptyRequest = new EmptyRequest(); var response = await PostAsync(endpoint, emptyRequest) ?? throw new InvalidOperationException("Failed to get Apache Airflow Job definition response"); From 7168f4a653417efda5964c985903085f9238e114 Mon Sep 17 00:00:00 2001 From: Ebram Tawfik Date: Mon, 18 May 2026 11:44:06 -0700 Subject: [PATCH 3/3] fix: skip lifecycle test when workspace doesn't support Airflow Jobs The FullLifecycle test now gracefully skips when the create API returns an error (e.g., EntityNotFound), instead of failing with a confusing assertion error about missing airflowJobId. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Integration/AirflowJobToolIntegrationTests.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/DataFactory.MCP.Tests/Integration/AirflowJobToolIntegrationTests.cs b/DataFactory.MCP.Tests/Integration/AirflowJobToolIntegrationTests.cs index dd8a93e..ef3d0d1 100644 --- a/DataFactory.MCP.Tests/Integration/AirflowJobToolIntegrationTests.cs +++ b/DataFactory.MCP.Tests/Integration/AirflowJobToolIntegrationTests.cs @@ -433,6 +433,13 @@ public async Task AirflowJob_FullLifecycle_CreateGetUpdateDeleteAsync() if (!IsValidJson(createResult)) return; // API may not support creation in test workspace var createJson = JsonDocument.Parse(createResult); + + // Skip if API returned an error (e.g., workspace doesn't support Airflow Jobs) + if (createJson.RootElement.TryGetProperty("success", out var successProp) && !successProp.GetBoolean()) + { + Skip.If(true, $"Skipping lifecycle test - create returned error: {createResult}"); + } + Assert.True(createJson.RootElement.TryGetProperty("airflowJobId", out var idElement), $"Create response missing airflowJobId. Response: {createResult}"); airflowJobId = idElement.GetString();