Lumi/companion/src/Lumi.Companion.Core/CompanionTransportPolicy.cs
2026-07-24 14:44:27 +02:00

38 lines
1.5 KiB
C#

namespace Lumi.Companion.Core;
/// <summary>
/// Canonical transport boundary for every Companion feature that sends
/// credentials or private stream data to Lumi.
/// </summary>
public static class CompanionTransportPolicy
{
public static bool IsSecureOrigin(Uri uri) =>
uri.Scheme.Equals(Uri.UriSchemeHttps, StringComparison.OrdinalIgnoreCase);
public static bool IsLoopbackHttpOrigin(Uri uri) =>
uri.Scheme.Equals(Uri.UriSchemeHttp, StringComparison.OrdinalIgnoreCase) &&
uri.IsLoopback;
public static bool IsSameOrigin(Uri left, Uri right) =>
left.Scheme.Equals(right.Scheme, StringComparison.OrdinalIgnoreCase) &&
left.Host.Equals(right.Host, StringComparison.OrdinalIgnoreCase) &&
left.Port == right.Port;
public static bool IsPairingExchangeAllowed(Uri exchangeUri, Uri hostUri) =>
IsSameOrigin(exchangeUri, hostUri) &&
((IsSecureOrigin(exchangeUri) && IsSecureOrigin(hostUri)) ||
(IsLoopbackHttpOrigin(exchangeUri) && IsLoopbackHttpOrigin(hostUri)));
public static bool IsPairedHostAllowed(Uri hostUri) =>
IsSecureOrigin(hostUri) || IsLoopbackHttpOrigin(hostUri);
public static bool IsEndpointAllowed(Uri endpoint, Uri? pairedHost)
{
if (IsSecureOrigin(endpoint)) return true;
return pairedHost is not null &&
IsLoopbackHttpOrigin(endpoint) &&
IsLoopbackHttpOrigin(pairedHost) &&
IsSameOrigin(endpoint, pairedHost);
}
}