From a765acf380135694bbd4d1336bd4beddef6ef808 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Thu, 20 Mar 2025 13:06:16 +0300 Subject: [PATCH 1/3] fix: always serialize security schemes in components --- .../Models/OpenApiComponents.cs | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/OpenApiComponents.cs b/src/Microsoft.OpenApi/Models/OpenApiComponents.cs index 250254212..540664ae5 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiComponents.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiComponents.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Linq; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Models.References; @@ -110,7 +111,7 @@ public void SerializeAsV31(IOpenApiWriter writer) // however if they have cycles, then we will need a component rendered if (writer.GetSettings().InlineLocalReferences) { - RenderComponents(writer, (writer, element) => element.SerializeAsV31(writer)); + RenderComponents(writer, (writer, element) => element.SerializeAsV31(writer), OpenApiSpecVersion.OpenApi3_1); return; } @@ -148,7 +149,7 @@ public void SerializeAsV3(IOpenApiWriter writer) // however if they have cycles, then we will need a component rendered if (writer.GetSettings().InlineLocalReferences) { - RenderComponents(writer, (writer, element) => element.SerializeAsV3(writer)); + RenderComponents(writer, (writer, element) => element.SerializeAsV3(writer), OpenApiSpecVersion.OpenApi3_0); return; } @@ -315,7 +316,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version writer.WriteEndObject(); } - private void RenderComponents(IOpenApiWriter writer, Action callback) + private void RenderComponents(IOpenApiWriter writer, Action callback, OpenApiSpecVersion version) { var loops = writer.GetSettings().LoopDetector.Loops; writer.WriteStartObject(); @@ -323,6 +324,19 @@ private void RenderComponents(IOpenApiWriter writer, Action + { + if (version is OpenApiSpecVersion.OpenApi3_1) + component.SerializeAsV31(writer); + component.SerializeAsV3(writer); + }); + } writer.WriteEndObject(); } From 01784e4e4a3ce679af9df0b6fc1ed59586eabe53 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Thu, 20 Mar 2025 13:06:36 +0300 Subject: [PATCH 2/3] chore: add test to validate --- .../Models/OpenApiDocumentTests.cs | 43 +++++++++++++++++++ .../Models/Samples/docWithSecurityScheme.yaml | 32 ++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 test/Microsoft.OpenApi.Tests/Models/Samples/docWithSecurityScheme.yaml diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs index 75ad6d086..6c3498007 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs @@ -2179,5 +2179,48 @@ public void SerializeAsThrowsIfVersionIsNotSupported() Assert.Equal("version", actual.ParamName); Assert.Equal(version, actual.ActualValue); } + + [Fact] + public async Task SerializeDocWithSecuritySchemeWithInlineRefererencesWorks() + { + var expected = @"openapi: 3.0.4 +info: + title: Repair Service + version: 1.0.0 +servers: + - url: https://pluginrentu.azurewebsites.net/api +paths: + /repairs: + get: + summary: List all repairs with oauth + description: Returns a list of repairs with their details and images + operationId: listRepairs + responses: + '200': + description: A list of repairs + content: + application/json: + schema: + type: object + security: + - oAuth2AuthCode: [ ] +components: + securitySchemes: + oAuth2AuthCode: + type: oauth2 + description: OAuth configuration for the repair service + flows: + authorizationCode: + authorizationUrl: https://login.microsoftonline.com/2f13b28c-bd4d-43e2-8ae6-48594aaba125/oauth2/v2.0/authorize + tokenUrl: https://login.microsoftonline.com/2f13b28c-bd4d-43e2-8ae6-48594aaba125/oauth2/v2.0/token + scopes: + api://a2a7226d-e8d1-4ded-8c53-dd4c136ff456/repairs_read: Read repair records"; + + var doc = (await OpenApiDocument.LoadAsync("Models/Samples/docWithSecurityScheme.yaml", SettingsFixture.ReaderSettings)).Document; + var stringWriter = new StringWriter(); + doc.SerializeAsV3(new OpenApiYamlWriter(stringWriter, new OpenApiWriterSettings { InlineLocalReferences = true })); + var actual = stringWriter.ToString(); + Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), actual.MakeLineBreaksEnvironmentNeutral()); + } } } diff --git a/test/Microsoft.OpenApi.Tests/Models/Samples/docWithSecurityScheme.yaml b/test/Microsoft.OpenApi.Tests/Models/Samples/docWithSecurityScheme.yaml new file mode 100644 index 000000000..ee888cb2c --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/Samples/docWithSecurityScheme.yaml @@ -0,0 +1,32 @@ +openapi: 3.0.0 +info: + title: Repair Service + version: 1.0.0 +servers: + - url: https://pluginrentu.azurewebsites.net/api +components: + securitySchemes: + oAuth2AuthCode: + type: oauth2 + description: OAuth configuration for the repair service + flows: + authorizationCode: + authorizationUrl: https://login.microsoftonline.com/2f13b28c-bd4d-43e2-8ae6-48594aaba125/oauth2/v2.0/authorize + tokenUrl: https://login.microsoftonline.com/2f13b28c-bd4d-43e2-8ae6-48594aaba125/oauth2/v2.0/token + scopes: + api://a2a7226d-e8d1-4ded-8c53-dd4c136ff456/repairs_read: Read repair records +paths: + /repairs: + get: + operationId: listRepairs + summary: List all repairs with oauth + description: Returns a list of repairs with their details and images + security: + - oAuth2AuthCode: [] + responses: + '200': + description: A list of repairs + content: + application/json: + schema: + type: object \ No newline at end of file From fd4c3681a8746d400706ea6688b48852bf2143ae Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Thu, 20 Mar 2025 14:31:05 +0300 Subject: [PATCH 3/3] chore: copy file to output directory --- test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj index da64a0482..e1d0e3752 100644 --- a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj +++ b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj @@ -1,4 +1,4 @@ - + net8.0 false @@ -51,6 +51,10 @@ PreserveNewest + + PreserveNewest + + \ No newline at end of file