Files
tiku-backend.net/Tiku.Api/Options/OptionsValidation.cs

78 lines
2.6 KiB
C#

using Microsoft.Extensions.Configuration;
using System.Net;
using Tiku.Application.Security;
namespace Tiku.Api.Options;
public static class OptionsValidation
{
public static string ResolveDatabaseConnectionString(
IConfiguration configuration,
bool isDevelopment)
{
var connectionString =
configuration.GetConnectionString("Database") ??
configuration["DATABASE_URL"];
if (!string.IsNullOrWhiteSpace(connectionString))
{
return connectionString;
}
if (isDevelopment)
{
return $"Host=localhost;Database=tiku;Username={Environment.UserName}";
}
throw new InvalidOperationException(
"Database connection is required outside Development. Configure ConnectionStrings:Database or DATABASE_URL.");
}
public static bool BeValidJwtOptions(JwtOptions options, bool isProduction)
{
return JwtOptions.BeValid(options, isProduction);
}
public static bool BeValidCorsOptions(CorsOptions options)
{
if (options.AllowCredentials && options.AllowedOrigins.Length == 0)
{
return false;
}
return options.AllowedOrigins.All(IsHttpOrigin);
}
public static bool BeValidTenantResolutionOptions(
TenantResolutionOptions options,
IConfiguration configuration,
bool isProduction)
{
if (!isProduction)
{
return true;
}
var platformHosts = options.PlatformHosts
.Where(host => !string.IsNullOrWhiteSpace(host))
.Select(host => host.Trim())
.ToArray();
var hasFormalHost = platformHosts.Any(host =>
!string.Equals(host, "localhost", StringComparison.OrdinalIgnoreCase) &&
!string.Equals(host, "127.0.0.1", StringComparison.OrdinalIgnoreCase) &&
!string.Equals(host, "::1", StringComparison.OrdinalIgnoreCase));
var allowedHosts = configuration["AllowedHosts"];
return hasFormalHost &&
options.TrustedProxyAddresses.Any(address => IPAddress.TryParse(address, out _)) &&
!string.IsNullOrWhiteSpace(allowedHosts) &&
!allowedHosts.Split(';', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
.Contains("*", StringComparer.Ordinal);
}
private static bool IsHttpOrigin(string origin)
{
return Uri.TryCreate(origin, UriKind.Absolute, out var uri) &&
(uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps) &&
string.IsNullOrEmpty(uri.PathAndQuery.Trim('/'));
}
}