Skip to content

Commit

Permalink
Merge pull request #1178 from microsoft/mk/bugfix-security-scheme-ref…
Browse files Browse the repository at this point in the history
…erence

Fix: Error generated when security scheme in Components is a reference
  • Loading branch information
MaggieKimani1 authored Mar 7, 2023
2 parents 2d9cffe + a663407 commit 662c901
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 8 deletions.
1 change: 0 additions & 1 deletion src/Microsoft.OpenApi.Readers/OpenApiYamlDocumentReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,6 @@ private void ResolveReferences(OpenApiDiagnostic diagnostic, OpenApiDocument doc
}
}


/// <summary>
/// Reads the stream input and parses the fragment of an OpenAPI description into an Open API Element.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,11 @@ internal static partial class OpenApiV3Deserializer
public static OpenApiSecurityScheme LoadSecurityScheme(ParseNode node)
{
var mapNode = node.CheckMapNode("securityScheme");

var pointer = mapNode.GetReferencePointer();
if (pointer != null)
{
return mapNode.GetReferencedObject<OpenApiSecurityScheme>(ReferenceType.SecurityScheme, pointer);
}
var securityScheme = new OpenApiSecurityScheme();
foreach (var property in mapNode)
{
Expand Down
19 changes: 15 additions & 4 deletions src/Microsoft.OpenApi/Services/OpenApiWalker.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.

using System;
Expand Down Expand Up @@ -116,7 +116,18 @@ internal void Walk(OpenApiComponents components)
}
}
});


Walk(OpenApiConstants.SecuritySchemes, () =>
{
if (components.SecuritySchemes != null)
{
foreach (var item in components.SecuritySchemes)
{
Walk(item.Key, () => Walk(item.Value, isComponent: true));
}
}
});

Walk(OpenApiConstants.Callbacks, () =>
{
if (components.Callbacks != null)
Expand Down Expand Up @@ -996,9 +1007,9 @@ internal void Walk(OpenApiSecurityRequirement securityRequirement)
/// <summary>
/// Visits <see cref="OpenApiSecurityScheme"/> and child objects
/// </summary>
internal void Walk(OpenApiSecurityScheme securityScheme)
internal void Walk(OpenApiSecurityScheme securityScheme, bool isComponent = false)
{
if (securityScheme == null || ProcessAsReference(securityScheme))
if (securityScheme == null || ProcessAsReference(securityScheme, isComponent))
{
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,9 @@
<EmbeddedResource Include="V3Tests\Samples\OpenApiDocument\minimalDocument.yaml">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="V3Tests\Samples\OpenApiDocument\docWithSecuritySchemeReference.yaml">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="V3Tests\Samples\OpenApiDocument\apiWithFullHeaderComponent.yaml">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

using System;
using System.Collections.Generic;
using System.Diagnostics.Contracts;
using System.Globalization;
using System.IO;
using System.Linq;
Expand Down Expand Up @@ -1334,10 +1335,10 @@ public void DoesNotChangeExternalReferences()
{
// Arrange
using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "documentWithExternalRefs.yaml"));

// Act
var doc = new OpenApiStreamReader(
new OpenApiReaderSettings { ReferenceResolution = ReferenceResolutionSetting.DoNotResolveReferences})
new OpenApiReaderSettings { ReferenceResolution = ReferenceResolutionSetting.DoNotResolveReferences })
.Read(stream, out var diagnostic);

var externalRef = doc.Components.Schemas["Nested"].Properties["AnyOf"].AnyOf.First().Reference.ReferenceV3;
Expand All @@ -1347,5 +1348,24 @@ public void DoesNotChangeExternalReferences()
Assert.Equal("file:///C:/MySchemas.json#/definitions/ArrayObject", externalRef);
Assert.Equal("../foo/schemas.yaml#/components/schemas/Number", externalRef2);
}

[Fact]
public void ParseDocumentWithReferencedSecuritySchemeWorks()
{
// Arrange
using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "docWithSecuritySchemeReference.yaml"));

// Act
var doc = new OpenApiStreamReader(new OpenApiReaderSettings
{
ReferenceResolution = ReferenceResolutionSetting.ResolveLocalReferences
}).Read(stream, out var diagnostic);

var securityScheme = doc.Components.SecuritySchemes["OAuth2"];

// Assert
Assert.False(securityScheme.UnresolvedReference);
Assert.NotNull(securityScheme.Flows);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
openapi: 3.0.0
info:
title: Example API
version: 1.0.0
paths: { }
components:
securitySchemes:
OAuth2:
$ref: '#/components/securitySchemes/RefOAuth2'
RefOAuth2:
type: oauth2
flows:
implicit:
authorizationUrl: https://example.com/api/oauth/dialog
scopes:
write:pets: modify pets in your account
read:pets: read your pets

0 comments on commit 662c901

Please sign in to comment.