#nullable enable using System; using System.Collections.Generic; namespace ShrinkNetwork { public enum ShrinkNetworkPeerKind { Unknown = 0, Client = 1, Server = 2, TrustedServer = 3 } public enum ShrinkNetworkAuthority { Any = 0, ClientOnly = 1, ServerOnly = 2, TrustedServerOnly = 3 } public readonly struct ShrinkNetworkPermissionRequirement { public ShrinkNetworkAuthority Authority { get; } public string? Permission { get; } public ShrinkNetworkPermissionRequirement(ShrinkNetworkAuthority authority, string? permission) { Authority = authority; Permission = string.IsNullOrWhiteSpace(permission) ? null : permission.Trim(); } } internal static class ShrinkNetworkPermissionValidator { public static bool IsAllowed(ShrinkNetworkSession session, ShrinkNetworkPermissionRequirement requirement) { if (session == null) return false; if (!CheckAuthority(session.PeerKind, requirement.Authority)) return false; if (!string.IsNullOrEmpty(requirement.Permission) && !session.HasPermission(requirement.Permission)) return false; return true; } private static bool CheckAuthority(ShrinkNetworkPeerKind peerKind, ShrinkNetworkAuthority authority) { return authority switch { ShrinkNetworkAuthority.Any => true, ShrinkNetworkAuthority.ClientOnly => peerKind == ShrinkNetworkPeerKind.Client, ShrinkNetworkAuthority.ServerOnly => peerKind == ShrinkNetworkPeerKind.Server || peerKind == ShrinkNetworkPeerKind.TrustedServer, ShrinkNetworkAuthority.TrustedServerOnly => peerKind == ShrinkNetworkPeerKind.TrustedServer, _ => false }; } } }