Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ public partial interface ISimliClient
/// Authorize using ApiKey authentication.
/// </summary>
/// <param name="apiKey"></param>

public void AuthorizeUsingApiKeyInHeader(
string apiKey);
}
Expand Down
34 changes: 34 additions & 0 deletions src/libs/Simli/Generated/Simli.PathBuilder.g.cs
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,40 @@ public PathBuilder AddOptionalParameter<T>(
return this;
}

/// <summary>
/// Adds a pre-serialized query string fragment to the URL.
/// </summary>
/// <param name="value">The serialized query string value.</param>
/// <returns>The current <see cref="PathBuilder"/> instance.</returns>
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;
}

/// <summary>
/// Returns the constructed URL as a string.
/// </summary>
Expand Down
34 changes: 34 additions & 0 deletions src/libs/Simli/Generated/Simli.Realtime.PathBuilder.g.cs
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,40 @@ public PathBuilder AddOptionalParameter<T>(
return this;
}

/// <summary>
/// Adds a pre-serialized query string fragment to the URL.
/// </summary>
/// <param name="value">The serialized query string value.</param>
/// <returns>The current <see cref="PathBuilder"/> instance.</returns>
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;
}

/// <summary>
/// Returns the constructed URL as a string.
/// </summary>
Expand Down
145 changes: 145 additions & 0 deletions src/libs/Simli/Generated/Simli.Security.g.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
#nullable enable

namespace Simli
{
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<EndPointAuthorizationRequirement> Authorizations { get; set; } =
global::System.Array.Empty<EndPointAuthorizationRequirement>();
}

internal static class EndPointSecurityResolver
{
internal static global::System.Collections.Generic.List<EndPointAuthorization> ResolveAuthorizations(
global::System.Collections.Generic.IReadOnlyList<EndPointAuthorization> availableAuthorizations,
global::System.Collections.Generic.IReadOnlyList<EndPointSecurityRequirement> 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<EndPointAuthorization>();
}

var allowsAnonymous = false;

foreach (var requirement in securityRequirements)
{
if (requirement.Authorizations.Count == 0)
{
allowsAnonymous = true;
continue;
}

var selected = new global::System.Collections.Generic.List<EndPointAuthorization>(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<EndPointAuthorization>();
}

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<EndPointSecurityRequirement> securityRequirements)
{
var parts = new global::System.Collections.Generic.List<string>(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);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,25 @@ namespace Simli
{
public partial class SimliClient
{


private static readonly global::Simli.EndPointSecurityRequirement s_AudioToVideoInterfaceStaticAudioPostSecurityRequirement0 =
new global::Simli.EndPointSecurityRequirement
{
Authorizations = new global::Simli.EndPointAuthorizationRequirement[]
{ new global::Simli.EndPointAuthorizationRequirement
{
Type = "ApiKey",
Location = "Header",
Name = "x-simli-api-key",
FriendlyName = "ApiKeyInHeader",
},
},
};
private static readonly global::Simli.EndPointSecurityRequirement[] s_AudioToVideoInterfaceStaticAudioPostSecurityRequirements =
new global::Simli.EndPointSecurityRequirement[]
{ s_AudioToVideoInterfaceStaticAudioPostSecurityRequirement0,
};
partial void PrepareAudioToVideoInterfaceStaticAudioPostArguments(
global::System.Net.Http.HttpClient httpClient,
global::Simli.AudioToVideoRequest request);
Expand Down Expand Up @@ -41,9 +60,15 @@ partial void ProcessAudioToVideoInterfaceStaticAudioPostResponseContent(
httpClient: HttpClient,
request: request);


var __authorizations = global::Simli.EndPointSecurityResolver.ResolveAuthorizations(
availableAuthorizations: Authorizations,
securityRequirements: s_AudioToVideoInterfaceStaticAudioPostSecurityRequirements,
operationName: "AudioToVideoInterfaceStaticAudioPostAsync");

var __pathBuilder = new global::Simli.PathBuilder(
path: "/static/audio",
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,
Expand All @@ -53,7 +78,7 @@ partial void ProcessAudioToVideoInterfaceStaticAudioPostResponseContent(
__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")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,24 @@ namespace Simli
{
public sealed partial class SimliClient
{

/// <inheritdoc/>
public void AuthorizeUsingApiKeyInHeader(
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 == "ApiKey" &&
__authorization.Location == "Header" &&
__authorization.Name == "x-simli-api-key")
{
Authorizations.RemoveAt(i);
}
}

Authorizations.Add(new global::Simli.EndPointAuthorization
{
Type = "ApiKey",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ namespace Simli
public sealed partial class SimliClient
{
/// <inheritdoc cref="SimliClient(global::System.Net.Http.HttpClient?, global::System.Uri?, global::System.Collections.Generic.List{global::Simli.EndPointAuthorization}?, bool)"/>

public SimliClient(
string apiKey,
global::System.Net.Http.HttpClient? httpClient = null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,25 @@ namespace Simli
{
public partial class SimliClient
{


private static readonly global::Simli.EndPointSecurityRequirement s_DeleteFacesTrinityByIdSecurityRequirement0 =
new global::Simli.EndPointSecurityRequirement
{
Authorizations = new global::Simli.EndPointAuthorizationRequirement[]
{ new global::Simli.EndPointAuthorizationRequirement
{
Type = "ApiKey",
Location = "Header",
Name = "x-simli-api-key",
FriendlyName = "ApiKeyInHeader",
},
},
};
private static readonly global::Simli.EndPointSecurityRequirement[] s_DeleteFacesTrinityByIdSecurityRequirements =
new global::Simli.EndPointSecurityRequirement[]
{ s_DeleteFacesTrinityByIdSecurityRequirement0,
};
partial void PrepareDeleteFacesTrinityByIdArguments(
global::System.Net.Http.HttpClient httpClient,
ref global::System.Guid id);
Expand Down Expand Up @@ -33,9 +52,15 @@ partial void ProcessDeleteFacesTrinityByIdResponse(
httpClient: HttpClient,
id: ref id);


var __authorizations = global::Simli.EndPointSecurityResolver.ResolveAuthorizations(
availableAuthorizations: Authorizations,
securityRequirements: s_DeleteFacesTrinityByIdSecurityRequirements,
operationName: "DeleteFacesTrinityByIdAsync");

var __pathBuilder = new global::Simli.PathBuilder(
path: $"/faces/trinity/{id}",
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,
Expand All @@ -45,7 +70,7 @@ partial void ProcessDeleteFacesTrinityByIdResponse(
__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")
Expand Down
Loading