//------------------------------------------------------------------------------ // // This code was generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. // // Changes to this file may cause incorrect behavior and will be lost when // the code is regenerated. // //------------------------------------------------------------------------------ #nullable enable namespace LukeHagar.PlexAPI.SDK.Utils { using System; using System.Collections.Generic; using System.Net.Http; using System.Reflection; using System.Text; using System.Web; internal class SecurityMetadata { private Dictionary headerParams { get; } = new Dictionary(); private Dictionary queryParams { get; } = new Dictionary(); public SecurityMetadata(Func securitySource) { ParseSecuritySource(securitySource); } public HttpRequestMessage Apply(HttpRequestMessage request) { foreach (var kvp in headerParams) { request.Headers.Add(kvp.Key, kvp.Value); } if(request.RequestUri != null) { var uriBuilder = new UriBuilder(request.RequestUri); var query = HttpUtility.ParseQueryString(uriBuilder.Query); foreach (var kvp in queryParams) { query.Add(kvp.Key, kvp.Value); } uriBuilder.Query = query.ToString(); request.RequestUri = uriBuilder.Uri; } return request; } private void ParseSecuritySource(Func securitySource) { if (securitySource == null) { return; } var security = securitySource(); if (security == null) { return; } foreach (var prop in security.GetType().GetProperties()) { var value = prop.GetValue(security, null); if (value == null) { continue; } var secMetadata = prop.GetCustomAttribute()?.GetSecurityMetadata(); if (secMetadata == null) { continue; } if (secMetadata.Option) { ParseOption(value); } else if (secMetadata.Scheme) { if (secMetadata.SubType == "basic" && !Utilities.IsClass(value)) { ParseScheme(secMetadata, security); return; } else { ParseScheme(secMetadata, value); } } } return; } private void ParseOption(object option) { foreach (var prop in option.GetType().GetProperties()) { var value = prop.GetValue(option, null); if (value == null) { continue; } var secMetadata = prop.GetCustomAttribute()?.GetSecurityMetadata(); if (secMetadata == null || !secMetadata.Scheme) { continue; } ParseScheme(secMetadata, value); } } private void ParseScheme(SpeakeasyMetadata.SecurityMetadata schemeMetadata, object scheme) { if (Utilities.IsClass(scheme)) { if (schemeMetadata.Type == "http" && schemeMetadata.SubType == "basic") { ParseBasicAuthScheme(scheme); return; } foreach (var prop in scheme.GetType().GetProperties()) { var value = prop.GetValue(scheme, null); if (value == null) { continue; } var secMetadata = prop.GetCustomAttribute()?.GetSecurityMetadata(); if (secMetadata == null || secMetadata.Name == "") { continue; } ParseSchemeValue(schemeMetadata, secMetadata, value); } } else { ParseSchemeValue(schemeMetadata, schemeMetadata, scheme); } } private void ParseSchemeValue( SpeakeasyMetadata.SecurityMetadata schemeMetadata, SpeakeasyMetadata.SecurityMetadata valueMetadata, object value ) { var key = valueMetadata.Name; if (key == "") { return; } var valStr = Utilities.ValueToString(value); switch (schemeMetadata.Type) { case "apiKey": switch (schemeMetadata.SubType) { case "header": headerParams.Add(key, valStr); break; case "query": queryParams.Add(key, valStr); break; case "cookie": headerParams.Add("cookie", $"{key}={valStr}"); break; default: throw new Exception($"Unknown apiKey subType: {schemeMetadata.SubType}"); } break; case "openIdConnect": headerParams.Add(key, Utilities.PrefixBearer(valStr)); break; case "oauth2": headerParams.Add(key, Utilities.PrefixBearer(valStr)); break; case "http": switch (schemeMetadata.SubType) { case "bearer": headerParams.Add(key, Utilities.PrefixBearer(valStr)); break; default: throw new Exception($"Unknown http subType: {schemeMetadata.SubType}"); } break; default: throw new Exception($"Unknown security type: {schemeMetadata.Type}"); } } private void ParseBasicAuthScheme(object scheme) { string username = ""; string password = ""; foreach (var prop in scheme.GetType().GetProperties()) { var value = prop.GetValue(scheme, null); if (value == null) { continue; } var secMetadata = prop.GetCustomAttribute()?.GetSecurityMetadata(); if (secMetadata == null || secMetadata.Name == "") { continue; } if (secMetadata.Name == "username") { username = Utilities.ValueToString(value); } else if (secMetadata.Name == "password") { password = Utilities.ValueToString(value); } } var auth = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}:{password}")); headerParams.Add("Authorization", $"Basic {auth}"); } } }