From 3189f2e4540f27578952ad9b961c92ca08d46445 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 9 Apr 2026 13:11:52 +0000 Subject: [PATCH] feat: Updated OpenAPI spec --- .../Guardrails.GuardClient.CreateGuard.g.cs | 29 +++- .../Guardrails.GuardClient.DeleteGuard.g.cs | 29 +++- .../Guardrails.GuardClient.GetGuard.g.cs | 29 +++- ...uardrails.GuardClient.GetGuardHistory.g.cs | 29 +++- .../Guardrails.GuardClient.GetGuards.g.cs | 29 +++- .../Guardrails.GuardClient.UpdateGuard.g.cs | 29 +++- .../Generated/Guardrails.GuardClient.g.cs | 2 +- ...uardrailsClient.Authorizations.Bearer.g.cs | 12 +- ....GuardrailsClient.Constructors.Bearer.g.cs | 1 + .../Guardrails.GuardrailsClient.g.cs | 2 +- ...uardrailsClient.Authorizations.Bearer.g.cs | 1 + ...ils.OpenaiClient.OpenaiChatCompletion.g.cs | 29 +++- .../Generated/Guardrails.OpenaiClient.g.cs | 2 +- .../Generated/Guardrails.PathBuilder.g.cs | 34 ++++ .../Generated/Guardrails.Security.g.cs | 145 ++++++++++++++++++ ...rails.ServiceHealthClient.HealthCheck.g.cs | 29 +++- .../Guardrails.ServiceHealthClient.g.cs | 2 +- .../Guardrails.ValidateClient.Validate.g.cs | 29 +++- .../Generated/Guardrails.ValidateClient.g.cs | 2 +- 19 files changed, 440 insertions(+), 24 deletions(-) create mode 100644 src/libs/Guardrails/Generated/Guardrails.Security.g.cs diff --git a/src/libs/Guardrails/Generated/Guardrails.GuardClient.CreateGuard.g.cs b/src/libs/Guardrails/Generated/Guardrails.GuardClient.CreateGuard.g.cs index 05cf5af..cdeb281 100644 --- a/src/libs/Guardrails/Generated/Guardrails.GuardClient.CreateGuard.g.cs +++ b/src/libs/Guardrails/Generated/Guardrails.GuardClient.CreateGuard.g.cs @@ -5,6 +5,25 @@ namespace Guardrails { public partial class GuardClient { + + + private static readonly global::Guardrails.EndPointSecurityRequirement s_CreateGuardSecurityRequirement0 = + new global::Guardrails.EndPointSecurityRequirement + { + Authorizations = new global::Guardrails.EndPointAuthorizationRequirement[] + { new global::Guardrails.EndPointAuthorizationRequirement + { + Type = "Http", + Location = "Header", + Name = "Bearer", + FriendlyName = "Bearer", + }, + }, + }; + private static readonly global::Guardrails.EndPointSecurityRequirement[] s_CreateGuardSecurityRequirements = + new global::Guardrails.EndPointSecurityRequirement[] + { s_CreateGuardSecurityRequirement0, + }; partial void PrepareCreateGuardArguments( global::System.Net.Http.HttpClient httpClient, global::Guardrails.Guard request); @@ -40,9 +59,15 @@ partial void ProcessCreateGuardResponseContent( httpClient: HttpClient, request: request); + + var __authorizations = global::Guardrails.EndPointSecurityResolver.ResolveAuthorizations( + availableAuthorizations: Authorizations, + securityRequirements: s_CreateGuardSecurityRequirements, + operationName: "CreateGuardAsync"); + var __pathBuilder = new global::Guardrails.PathBuilder( path: "/guards", - baseUri: HttpClient.BaseAddress); + baseUri: HttpClient.BaseAddress); var __path = __pathBuilder.ToString(); using var __httpRequest = new global::System.Net.Http.HttpRequestMessage( method: global::System.Net.Http.HttpMethod.Post, @@ -52,7 +77,7 @@ partial void ProcessCreateGuardResponseContent( __httpRequest.VersionPolicy = global::System.Net.Http.HttpVersionPolicy.RequestVersionOrHigher; #endif - foreach (var __authorization in Authorizations) + foreach (var __authorization in __authorizations) { if (__authorization.Type == "Http" || __authorization.Type == "OAuth2") diff --git a/src/libs/Guardrails/Generated/Guardrails.GuardClient.DeleteGuard.g.cs b/src/libs/Guardrails/Generated/Guardrails.GuardClient.DeleteGuard.g.cs index 967abcd..f19f70c 100644 --- a/src/libs/Guardrails/Generated/Guardrails.GuardClient.DeleteGuard.g.cs +++ b/src/libs/Guardrails/Generated/Guardrails.GuardClient.DeleteGuard.g.cs @@ -5,6 +5,25 @@ namespace Guardrails { public partial class GuardClient { + + + private static readonly global::Guardrails.EndPointSecurityRequirement s_DeleteGuardSecurityRequirement0 = + new global::Guardrails.EndPointSecurityRequirement + { + Authorizations = new global::Guardrails.EndPointAuthorizationRequirement[] + { new global::Guardrails.EndPointAuthorizationRequirement + { + Type = "Http", + Location = "Header", + Name = "Bearer", + FriendlyName = "Bearer", + }, + }, + }; + private static readonly global::Guardrails.EndPointSecurityRequirement[] s_DeleteGuardSecurityRequirements = + new global::Guardrails.EndPointSecurityRequirement[] + { s_DeleteGuardSecurityRequirement0, + }; partial void PrepareDeleteGuardArguments( global::System.Net.Http.HttpClient httpClient, ref string guardName); @@ -37,9 +56,15 @@ partial void ProcessDeleteGuardResponseContent( httpClient: HttpClient, guardName: ref guardName); + + var __authorizations = global::Guardrails.EndPointSecurityResolver.ResolveAuthorizations( + availableAuthorizations: Authorizations, + securityRequirements: s_DeleteGuardSecurityRequirements, + operationName: "DeleteGuardAsync"); + var __pathBuilder = new global::Guardrails.PathBuilder( path: $"/guards/{guardName}", - baseUri: HttpClient.BaseAddress); + baseUri: HttpClient.BaseAddress); var __path = __pathBuilder.ToString(); using var __httpRequest = new global::System.Net.Http.HttpRequestMessage( method: global::System.Net.Http.HttpMethod.Delete, @@ -49,7 +74,7 @@ partial void ProcessDeleteGuardResponseContent( __httpRequest.VersionPolicy = global::System.Net.Http.HttpVersionPolicy.RequestVersionOrHigher; #endif - foreach (var __authorization in Authorizations) + foreach (var __authorization in __authorizations) { if (__authorization.Type == "Http" || __authorization.Type == "OAuth2") diff --git a/src/libs/Guardrails/Generated/Guardrails.GuardClient.GetGuard.g.cs b/src/libs/Guardrails/Generated/Guardrails.GuardClient.GetGuard.g.cs index 20b6da8..5f9a012 100644 --- a/src/libs/Guardrails/Generated/Guardrails.GuardClient.GetGuard.g.cs +++ b/src/libs/Guardrails/Generated/Guardrails.GuardClient.GetGuard.g.cs @@ -5,6 +5,25 @@ namespace Guardrails { public partial class GuardClient { + + + private static readonly global::Guardrails.EndPointSecurityRequirement s_GetGuardSecurityRequirement0 = + new global::Guardrails.EndPointSecurityRequirement + { + Authorizations = new global::Guardrails.EndPointAuthorizationRequirement[] + { new global::Guardrails.EndPointAuthorizationRequirement + { + Type = "Http", + Location = "Header", + Name = "Bearer", + FriendlyName = "Bearer", + }, + }, + }; + private static readonly global::Guardrails.EndPointSecurityRequirement[] s_GetGuardSecurityRequirements = + new global::Guardrails.EndPointSecurityRequirement[] + { s_GetGuardSecurityRequirement0, + }; partial void PrepareGetGuardArguments( global::System.Net.Http.HttpClient httpClient, ref string guardName, @@ -42,12 +61,18 @@ partial void ProcessGetGuardResponseContent( guardName: ref guardName, asOf: ref asOf); + + var __authorizations = global::Guardrails.EndPointSecurityResolver.ResolveAuthorizations( + availableAuthorizations: Authorizations, + securityRequirements: s_GetGuardSecurityRequirements, + operationName: "GetGuardAsync"); + var __pathBuilder = new global::Guardrails.PathBuilder( path: $"/guards/{guardName}", baseUri: HttpClient.BaseAddress); __pathBuilder .AddOptionalParameter("asOf", asOf?.ToString("yyyy-MM-ddTHH:mm:ssZ")) - ; + ; var __path = __pathBuilder.ToString(); using var __httpRequest = new global::System.Net.Http.HttpRequestMessage( method: global::System.Net.Http.HttpMethod.Get, @@ -57,7 +82,7 @@ partial void ProcessGetGuardResponseContent( __httpRequest.VersionPolicy = global::System.Net.Http.HttpVersionPolicy.RequestVersionOrHigher; #endif - foreach (var __authorization in Authorizations) + foreach (var __authorization in __authorizations) { if (__authorization.Type == "Http" || __authorization.Type == "OAuth2") diff --git a/src/libs/Guardrails/Generated/Guardrails.GuardClient.GetGuardHistory.g.cs b/src/libs/Guardrails/Generated/Guardrails.GuardClient.GetGuardHistory.g.cs index 6314afb..a85a92d 100644 --- a/src/libs/Guardrails/Generated/Guardrails.GuardClient.GetGuardHistory.g.cs +++ b/src/libs/Guardrails/Generated/Guardrails.GuardClient.GetGuardHistory.g.cs @@ -5,6 +5,25 @@ namespace Guardrails { public partial class GuardClient { + + + private static readonly global::Guardrails.EndPointSecurityRequirement s_GetGuardHistorySecurityRequirement0 = + new global::Guardrails.EndPointSecurityRequirement + { + Authorizations = new global::Guardrails.EndPointAuthorizationRequirement[] + { new global::Guardrails.EndPointAuthorizationRequirement + { + Type = "Http", + Location = "Header", + Name = "Bearer", + FriendlyName = "Bearer", + }, + }, + }; + private static readonly global::Guardrails.EndPointSecurityRequirement[] s_GetGuardHistorySecurityRequirements = + new global::Guardrails.EndPointSecurityRequirement[] + { s_GetGuardHistorySecurityRequirement0, + }; partial void PrepareGetGuardHistoryArguments( global::System.Net.Http.HttpClient httpClient, ref string guardName, @@ -42,9 +61,15 @@ partial void ProcessGetGuardHistoryResponseContent( guardName: ref guardName, callId: ref callId); + + var __authorizations = global::Guardrails.EndPointSecurityResolver.ResolveAuthorizations( + availableAuthorizations: Authorizations, + securityRequirements: s_GetGuardHistorySecurityRequirements, + operationName: "GetGuardHistoryAsync"); + var __pathBuilder = new global::Guardrails.PathBuilder( path: $"/guards/{guardName}/history/{callId}", - baseUri: HttpClient.BaseAddress); + baseUri: HttpClient.BaseAddress); var __path = __pathBuilder.ToString(); using var __httpRequest = new global::System.Net.Http.HttpRequestMessage( method: global::System.Net.Http.HttpMethod.Get, @@ -54,7 +79,7 @@ partial void ProcessGetGuardHistoryResponseContent( __httpRequest.VersionPolicy = global::System.Net.Http.HttpVersionPolicy.RequestVersionOrHigher; #endif - foreach (var __authorization in Authorizations) + foreach (var __authorization in __authorizations) { if (__authorization.Type == "Http" || __authorization.Type == "OAuth2") diff --git a/src/libs/Guardrails/Generated/Guardrails.GuardClient.GetGuards.g.cs b/src/libs/Guardrails/Generated/Guardrails.GuardClient.GetGuards.g.cs index 67b09ed..00ebb1c 100644 --- a/src/libs/Guardrails/Generated/Guardrails.GuardClient.GetGuards.g.cs +++ b/src/libs/Guardrails/Generated/Guardrails.GuardClient.GetGuards.g.cs @@ -5,6 +5,25 @@ namespace Guardrails { public partial class GuardClient { + + + private static readonly global::Guardrails.EndPointSecurityRequirement s_GetGuardsSecurityRequirement0 = + new global::Guardrails.EndPointSecurityRequirement + { + Authorizations = new global::Guardrails.EndPointAuthorizationRequirement[] + { new global::Guardrails.EndPointAuthorizationRequirement + { + Type = "Http", + Location = "Header", + Name = "Bearer", + FriendlyName = "Bearer", + }, + }, + }; + private static readonly global::Guardrails.EndPointSecurityRequirement[] s_GetGuardsSecurityRequirements = + new global::Guardrails.EndPointSecurityRequirement[] + { s_GetGuardsSecurityRequirement0, + }; partial void PrepareGetGuardsArguments( global::System.Net.Http.HttpClient httpClient); partial void PrepareGetGuardsRequest( @@ -32,9 +51,15 @@ partial void ProcessGetGuardsResponseContent( PrepareGetGuardsArguments( httpClient: HttpClient); + + var __authorizations = global::Guardrails.EndPointSecurityResolver.ResolveAuthorizations( + availableAuthorizations: Authorizations, + securityRequirements: s_GetGuardsSecurityRequirements, + operationName: "GetGuardsAsync"); + var __pathBuilder = new global::Guardrails.PathBuilder( path: "/guards", - baseUri: HttpClient.BaseAddress); + baseUri: HttpClient.BaseAddress); var __path = __pathBuilder.ToString(); using var __httpRequest = new global::System.Net.Http.HttpRequestMessage( method: global::System.Net.Http.HttpMethod.Get, @@ -44,7 +69,7 @@ partial void ProcessGetGuardsResponseContent( __httpRequest.VersionPolicy = global::System.Net.Http.HttpVersionPolicy.RequestVersionOrHigher; #endif - foreach (var __authorization in Authorizations) + foreach (var __authorization in __authorizations) { if (__authorization.Type == "Http" || __authorization.Type == "OAuth2") diff --git a/src/libs/Guardrails/Generated/Guardrails.GuardClient.UpdateGuard.g.cs b/src/libs/Guardrails/Generated/Guardrails.GuardClient.UpdateGuard.g.cs index b1a52dc..678c9f2 100644 --- a/src/libs/Guardrails/Generated/Guardrails.GuardClient.UpdateGuard.g.cs +++ b/src/libs/Guardrails/Generated/Guardrails.GuardClient.UpdateGuard.g.cs @@ -5,6 +5,25 @@ namespace Guardrails { public partial class GuardClient { + + + private static readonly global::Guardrails.EndPointSecurityRequirement s_UpdateGuardSecurityRequirement0 = + new global::Guardrails.EndPointSecurityRequirement + { + Authorizations = new global::Guardrails.EndPointAuthorizationRequirement[] + { new global::Guardrails.EndPointAuthorizationRequirement + { + Type = "Http", + Location = "Header", + Name = "Bearer", + FriendlyName = "Bearer", + }, + }, + }; + private static readonly global::Guardrails.EndPointSecurityRequirement[] s_UpdateGuardSecurityRequirements = + new global::Guardrails.EndPointSecurityRequirement[] + { s_UpdateGuardSecurityRequirement0, + }; partial void PrepareUpdateGuardArguments( global::System.Net.Http.HttpClient httpClient, ref string guardName, @@ -45,9 +64,15 @@ partial void ProcessUpdateGuardResponseContent( guardName: ref guardName, request: request); + + var __authorizations = global::Guardrails.EndPointSecurityResolver.ResolveAuthorizations( + availableAuthorizations: Authorizations, + securityRequirements: s_UpdateGuardSecurityRequirements, + operationName: "UpdateGuardAsync"); + var __pathBuilder = new global::Guardrails.PathBuilder( path: $"/guards/{guardName}", - baseUri: HttpClient.BaseAddress); + baseUri: HttpClient.BaseAddress); var __path = __pathBuilder.ToString(); using var __httpRequest = new global::System.Net.Http.HttpRequestMessage( method: global::System.Net.Http.HttpMethod.Put, @@ -57,7 +82,7 @@ partial void ProcessUpdateGuardResponseContent( __httpRequest.VersionPolicy = global::System.Net.Http.HttpVersionPolicy.RequestVersionOrHigher; #endif - foreach (var __authorization in Authorizations) + foreach (var __authorization in __authorizations) { if (__authorization.Type == "Http" || __authorization.Type == "OAuth2") diff --git a/src/libs/Guardrails/Generated/Guardrails.GuardClient.g.cs b/src/libs/Guardrails/Generated/Guardrails.GuardClient.g.cs index 8414c0d..2f9eca8 100644 --- a/src/libs/Guardrails/Generated/Guardrails.GuardClient.g.cs +++ b/src/libs/Guardrails/Generated/Guardrails.GuardClient.g.cs @@ -12,7 +12,7 @@ public sealed partial class GuardClient : global::Guardrails.IGuardClient, globa /// /// Default self-hosted Guardrails server /// - public const string DefaultBaseUrl = "http://localhost:8000"; + public const string DefaultBaseUrl = "http://localhost:8000/"; private bool _disposeHttpClient = true; diff --git a/src/libs/Guardrails/Generated/Guardrails.GuardrailsClient.Authorizations.Bearer.g.cs b/src/libs/Guardrails/Generated/Guardrails.GuardrailsClient.Authorizations.Bearer.g.cs index bd96d32..b4c12e4 100644 --- a/src/libs/Guardrails/Generated/Guardrails.GuardrailsClient.Authorizations.Bearer.g.cs +++ b/src/libs/Guardrails/Generated/Guardrails.GuardrailsClient.Authorizations.Bearer.g.cs @@ -5,13 +5,23 @@ namespace Guardrails { public sealed partial class GuardrailsClient { + /// public void AuthorizeUsingBearer( string apiKey) { apiKey = apiKey ?? throw new global::System.ArgumentNullException(nameof(apiKey)); - Authorizations.Clear(); + for (var i = Authorizations.Count - 1; i >= 0; i--) + { + var __authorization = Authorizations[i]; + if (__authorization.Type == "Http" && + __authorization.Name == "Bearer") + { + Authorizations.RemoveAt(i); + } + } + Authorizations.Add(new global::Guardrails.EndPointAuthorization { Type = "Http", diff --git a/src/libs/Guardrails/Generated/Guardrails.GuardrailsClient.Constructors.Bearer.g.cs b/src/libs/Guardrails/Generated/Guardrails.GuardrailsClient.Constructors.Bearer.g.cs index 34fb8e1..44155a4 100644 --- a/src/libs/Guardrails/Generated/Guardrails.GuardrailsClient.Constructors.Bearer.g.cs +++ b/src/libs/Guardrails/Generated/Guardrails.GuardrailsClient.Constructors.Bearer.g.cs @@ -6,6 +6,7 @@ namespace Guardrails public sealed partial class GuardrailsClient { /// + public GuardrailsClient( string apiKey, global::System.Net.Http.HttpClient? httpClient = null, diff --git a/src/libs/Guardrails/Generated/Guardrails.GuardrailsClient.g.cs b/src/libs/Guardrails/Generated/Guardrails.GuardrailsClient.g.cs index 0cc3713..77e4d7d 100644 --- a/src/libs/Guardrails/Generated/Guardrails.GuardrailsClient.g.cs +++ b/src/libs/Guardrails/Generated/Guardrails.GuardrailsClient.g.cs @@ -13,7 +13,7 @@ public sealed partial class GuardrailsClient : global::Guardrails.IGuardrailsCli /// /// Default self-hosted Guardrails server /// - public const string DefaultBaseUrl = "http://localhost:8000"; + public const string DefaultBaseUrl = "http://localhost:8000/"; private bool _disposeHttpClient = true; diff --git a/src/libs/Guardrails/Generated/Guardrails.IGuardrailsClient.Authorizations.Bearer.g.cs b/src/libs/Guardrails/Generated/Guardrails.IGuardrailsClient.Authorizations.Bearer.g.cs index 13182fa..d4407ba 100644 --- a/src/libs/Guardrails/Generated/Guardrails.IGuardrailsClient.Authorizations.Bearer.g.cs +++ b/src/libs/Guardrails/Generated/Guardrails.IGuardrailsClient.Authorizations.Bearer.g.cs @@ -9,6 +9,7 @@ public partial interface IGuardrailsClient /// Authorize using bearer authentication. /// /// + public void AuthorizeUsingBearer( string apiKey); } diff --git a/src/libs/Guardrails/Generated/Guardrails.OpenaiClient.OpenaiChatCompletion.g.cs b/src/libs/Guardrails/Generated/Guardrails.OpenaiClient.OpenaiChatCompletion.g.cs index 80c15dc..de25581 100644 --- a/src/libs/Guardrails/Generated/Guardrails.OpenaiClient.OpenaiChatCompletion.g.cs +++ b/src/libs/Guardrails/Generated/Guardrails.OpenaiClient.OpenaiChatCompletion.g.cs @@ -5,6 +5,25 @@ namespace Guardrails { public partial class OpenaiClient { + + + private static readonly global::Guardrails.EndPointSecurityRequirement s_OpenaiChatCompletionSecurityRequirement0 = + new global::Guardrails.EndPointSecurityRequirement + { + Authorizations = new global::Guardrails.EndPointAuthorizationRequirement[] + { new global::Guardrails.EndPointAuthorizationRequirement + { + Type = "Http", + Location = "Header", + Name = "Bearer", + FriendlyName = "Bearer", + }, + }, + }; + private static readonly global::Guardrails.EndPointSecurityRequirement[] s_OpenaiChatCompletionSecurityRequirements = + new global::Guardrails.EndPointSecurityRequirement[] + { s_OpenaiChatCompletionSecurityRequirement0, + }; partial void PrepareOpenaiChatCompletionArguments( global::System.Net.Http.HttpClient httpClient, ref string guardName, @@ -45,9 +64,15 @@ partial void ProcessOpenaiChatCompletionResponseContent( guardName: ref guardName, request: request); + + var __authorizations = global::Guardrails.EndPointSecurityResolver.ResolveAuthorizations( + availableAuthorizations: Authorizations, + securityRequirements: s_OpenaiChatCompletionSecurityRequirements, + operationName: "OpenaiChatCompletionAsync"); + var __pathBuilder = new global::Guardrails.PathBuilder( path: $"/guards/{guardName}/openai/v1/chat/completions", - baseUri: HttpClient.BaseAddress); + baseUri: HttpClient.BaseAddress); var __path = __pathBuilder.ToString(); using var __httpRequest = new global::System.Net.Http.HttpRequestMessage( method: global::System.Net.Http.HttpMethod.Post, @@ -57,7 +82,7 @@ partial void ProcessOpenaiChatCompletionResponseContent( __httpRequest.VersionPolicy = global::System.Net.Http.HttpVersionPolicy.RequestVersionOrHigher; #endif - foreach (var __authorization in Authorizations) + foreach (var __authorization in __authorizations) { if (__authorization.Type == "Http" || __authorization.Type == "OAuth2") diff --git a/src/libs/Guardrails/Generated/Guardrails.OpenaiClient.g.cs b/src/libs/Guardrails/Generated/Guardrails.OpenaiClient.g.cs index 0365f9a..f1dfd08 100644 --- a/src/libs/Guardrails/Generated/Guardrails.OpenaiClient.g.cs +++ b/src/libs/Guardrails/Generated/Guardrails.OpenaiClient.g.cs @@ -12,7 +12,7 @@ public sealed partial class OpenaiClient : global::Guardrails.IOpenaiClient, glo /// /// Default self-hosted Guardrails server /// - public const string DefaultBaseUrl = "http://localhost:8000"; + public const string DefaultBaseUrl = "http://localhost:8000/"; private bool _disposeHttpClient = true; diff --git a/src/libs/Guardrails/Generated/Guardrails.PathBuilder.g.cs b/src/libs/Guardrails/Generated/Guardrails.PathBuilder.g.cs index 6c699be..7502e58 100644 --- a/src/libs/Guardrails/Generated/Guardrails.PathBuilder.g.cs +++ b/src/libs/Guardrails/Generated/Guardrails.PathBuilder.g.cs @@ -224,6 +224,40 @@ public PathBuilder AddOptionalParameter( return this; } + /// + /// Adds a pre-serialized query string fragment to the URL. + /// + /// The serialized query string value. + /// The current instance. + public PathBuilder AddRawQueryString( + string value) + { + if (string.IsNullOrWhiteSpace(value)) + { + return this; + } + + value = value.TrimStart('?', '&'); + if (value.Length == 0) + { + return this; + } + + if (_firstParameter) + { + _stringBuilder.Append('?'); + _firstParameter = false; + } + else + { + _stringBuilder.Append('&'); + } + + _stringBuilder.Append(value); + + return this; + } + /// /// Returns the constructed URL as a string. /// diff --git a/src/libs/Guardrails/Generated/Guardrails.Security.g.cs b/src/libs/Guardrails/Generated/Guardrails.Security.g.cs new file mode 100644 index 0000000..9f85b04 --- /dev/null +++ b/src/libs/Guardrails/Generated/Guardrails.Security.g.cs @@ -0,0 +1,145 @@ +#nullable enable + +namespace Guardrails +{ + internal sealed class EndPointAuthorizationRequirement + { + internal string Type { get; set; } = string.Empty; + + internal string Location { get; set; } = string.Empty; + + internal string Name { get; set; } = string.Empty; + + internal string FriendlyName { get; set; } = string.Empty; + } + + internal sealed class EndPointSecurityRequirement + { + internal global::System.Collections.Generic.IReadOnlyList Authorizations { get; set; } = + global::System.Array.Empty(); + } + + internal static class EndPointSecurityResolver + { + internal static global::System.Collections.Generic.List ResolveAuthorizations( + global::System.Collections.Generic.IReadOnlyList availableAuthorizations, + global::System.Collections.Generic.IReadOnlyList securityRequirements, + string operationName) + { + availableAuthorizations = availableAuthorizations ?? throw new global::System.ArgumentNullException(nameof(availableAuthorizations)); + securityRequirements = securityRequirements ?? throw new global::System.ArgumentNullException(nameof(securityRequirements)); + operationName = operationName ?? throw new global::System.ArgumentNullException(nameof(operationName)); + + if (securityRequirements.Count == 0) + { + return new global::System.Collections.Generic.List(); + } + + var allowsAnonymous = false; + + foreach (var requirement in securityRequirements) + { + if (requirement.Authorizations.Count == 0) + { + allowsAnonymous = true; + continue; + } + + var selected = new global::System.Collections.Generic.List(requirement.Authorizations.Count); + var satisfied = true; + + foreach (var requiredAuthorization in requirement.Authorizations) + { + var found = false; + + for (var i = 0; i < availableAuthorizations.Count; i++) + { + if (!Matches(availableAuthorizations[i], requiredAuthorization)) + { + continue; + } + + selected.Add(availableAuthorizations[i]); + found = true; + break; + } + + if (!found) + { + satisfied = false; + break; + } + } + + if (satisfied) + { + return selected; + } + } + + if (allowsAnonymous) + { + return new global::System.Collections.Generic.List(); + } + + throw new global::System.InvalidOperationException( + $"Operation '{operationName}' requires one of the configured security alternatives: {DescribeRequirements(securityRequirements)}."); + } + + private static bool Matches( + EndPointAuthorization availableAuthorization, + EndPointAuthorizationRequirement requiredAuthorization) + { + if (!string.Equals(availableAuthorization.Type, requiredAuthorization.Type, global::System.StringComparison.Ordinal)) + { + return false; + } + + return requiredAuthorization.Type switch + { + "OAuth2" => true, + "Http" => string.Equals( + availableAuthorization.Name, + requiredAuthorization.Name, + global::System.StringComparison.Ordinal), + "ApiKey" => string.Equals( + availableAuthorization.Location, + requiredAuthorization.Location, + global::System.StringComparison.Ordinal) && + string.Equals( + availableAuthorization.Name, + requiredAuthorization.Name, + global::System.StringComparison.Ordinal), + _ => string.Equals( + availableAuthorization.Location, + requiredAuthorization.Location, + global::System.StringComparison.Ordinal) && + string.Equals( + availableAuthorization.Name, + requiredAuthorization.Name, + global::System.StringComparison.Ordinal), + }; + } + + private static string DescribeRequirements( + global::System.Collections.Generic.IReadOnlyList securityRequirements) + { + var parts = new global::System.Collections.Generic.List(securityRequirements.Count); + + foreach (var requirement in securityRequirements) + { + if (requirement.Authorizations.Count == 0) + { + parts.Add("anonymous"); + continue; + } + + parts.Add(string.Join( + " + ", + global::System.Linq.Enumerable.Select(requirement.Authorizations, static x => x.FriendlyName))); + } + + return string.Join(" or ", parts); + } + } +} \ No newline at end of file diff --git a/src/libs/Guardrails/Generated/Guardrails.ServiceHealthClient.HealthCheck.g.cs b/src/libs/Guardrails/Generated/Guardrails.ServiceHealthClient.HealthCheck.g.cs index 40a26d7..8106873 100644 --- a/src/libs/Guardrails/Generated/Guardrails.ServiceHealthClient.HealthCheck.g.cs +++ b/src/libs/Guardrails/Generated/Guardrails.ServiceHealthClient.HealthCheck.g.cs @@ -5,6 +5,25 @@ namespace Guardrails { public partial class ServiceHealthClient { + + + private static readonly global::Guardrails.EndPointSecurityRequirement s_HealthCheckSecurityRequirement0 = + new global::Guardrails.EndPointSecurityRequirement + { + Authorizations = new global::Guardrails.EndPointAuthorizationRequirement[] + { new global::Guardrails.EndPointAuthorizationRequirement + { + Type = "Http", + Location = "Header", + Name = "Bearer", + FriendlyName = "Bearer", + }, + }, + }; + private static readonly global::Guardrails.EndPointSecurityRequirement[] s_HealthCheckSecurityRequirements = + new global::Guardrails.EndPointSecurityRequirement[] + { s_HealthCheckSecurityRequirement0, + }; partial void PrepareHealthCheckArguments( global::System.Net.Http.HttpClient httpClient); partial void PrepareHealthCheckRequest( @@ -32,9 +51,15 @@ partial void ProcessHealthCheckResponseContent( PrepareHealthCheckArguments( httpClient: HttpClient); + + var __authorizations = global::Guardrails.EndPointSecurityResolver.ResolveAuthorizations( + availableAuthorizations: Authorizations, + securityRequirements: s_HealthCheckSecurityRequirements, + operationName: "HealthCheckAsync"); + var __pathBuilder = new global::Guardrails.PathBuilder( path: "/health-check", - baseUri: HttpClient.BaseAddress); + baseUri: HttpClient.BaseAddress); var __path = __pathBuilder.ToString(); using var __httpRequest = new global::System.Net.Http.HttpRequestMessage( method: global::System.Net.Http.HttpMethod.Get, @@ -44,7 +69,7 @@ partial void ProcessHealthCheckResponseContent( __httpRequest.VersionPolicy = global::System.Net.Http.HttpVersionPolicy.RequestVersionOrHigher; #endif - foreach (var __authorization in Authorizations) + foreach (var __authorization in __authorizations) { if (__authorization.Type == "Http" || __authorization.Type == "OAuth2") diff --git a/src/libs/Guardrails/Generated/Guardrails.ServiceHealthClient.g.cs b/src/libs/Guardrails/Generated/Guardrails.ServiceHealthClient.g.cs index e8d4bff..f7b9277 100644 --- a/src/libs/Guardrails/Generated/Guardrails.ServiceHealthClient.g.cs +++ b/src/libs/Guardrails/Generated/Guardrails.ServiceHealthClient.g.cs @@ -12,7 +12,7 @@ public sealed partial class ServiceHealthClient : global::Guardrails.IServiceHea /// /// Default self-hosted Guardrails server /// - public const string DefaultBaseUrl = "http://localhost:8000"; + public const string DefaultBaseUrl = "http://localhost:8000/"; private bool _disposeHttpClient = true; diff --git a/src/libs/Guardrails/Generated/Guardrails.ValidateClient.Validate.g.cs b/src/libs/Guardrails/Generated/Guardrails.ValidateClient.Validate.g.cs index a4ab81f..4a9b951 100644 --- a/src/libs/Guardrails/Generated/Guardrails.ValidateClient.Validate.g.cs +++ b/src/libs/Guardrails/Generated/Guardrails.ValidateClient.Validate.g.cs @@ -5,6 +5,25 @@ namespace Guardrails { public partial class ValidateClient { + + + private static readonly global::Guardrails.EndPointSecurityRequirement s_ValidateSecurityRequirement0 = + new global::Guardrails.EndPointSecurityRequirement + { + Authorizations = new global::Guardrails.EndPointAuthorizationRequirement[] + { new global::Guardrails.EndPointAuthorizationRequirement + { + Type = "Http", + Location = "Header", + Name = "Bearer", + FriendlyName = "Bearer", + }, + }, + }; + private static readonly global::Guardrails.EndPointSecurityRequirement[] s_ValidateSecurityRequirements = + new global::Guardrails.EndPointSecurityRequirement[] + { s_ValidateSecurityRequirement0, + }; partial void PrepareValidateArguments( global::System.Net.Http.HttpClient httpClient, ref string guardName, @@ -50,9 +69,15 @@ partial void ProcessValidateResponseContent( xOpenaiApiKey: ref xOpenaiApiKey, request: request); + + var __authorizations = global::Guardrails.EndPointSecurityResolver.ResolveAuthorizations( + availableAuthorizations: Authorizations, + securityRequirements: s_ValidateSecurityRequirements, + operationName: "ValidateAsync"); + var __pathBuilder = new global::Guardrails.PathBuilder( path: $"/guards/{guardName}/validate", - baseUri: HttpClient.BaseAddress); + baseUri: HttpClient.BaseAddress); var __path = __pathBuilder.ToString(); using var __httpRequest = new global::System.Net.Http.HttpRequestMessage( method: global::System.Net.Http.HttpMethod.Post, @@ -62,7 +87,7 @@ partial void ProcessValidateResponseContent( __httpRequest.VersionPolicy = global::System.Net.Http.HttpVersionPolicy.RequestVersionOrHigher; #endif - foreach (var __authorization in Authorizations) + foreach (var __authorization in __authorizations) { if (__authorization.Type == "Http" || __authorization.Type == "OAuth2") diff --git a/src/libs/Guardrails/Generated/Guardrails.ValidateClient.g.cs b/src/libs/Guardrails/Generated/Guardrails.ValidateClient.g.cs index 8088130..69e8fb0 100644 --- a/src/libs/Guardrails/Generated/Guardrails.ValidateClient.g.cs +++ b/src/libs/Guardrails/Generated/Guardrails.ValidateClient.g.cs @@ -12,7 +12,7 @@ public sealed partial class ValidateClient : global::Guardrails.IValidateClient, /// /// Default self-hosted Guardrails server /// - public const string DefaultBaseUrl = "http://localhost:8000"; + public const string DefaultBaseUrl = "http://localhost:8000/"; private bool _disposeHttpClient = true;