65 lines
1.9 KiB
C#
65 lines
1.9 KiB
C#
#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
|
|
};
|
|
}
|
|
}
|
|
}
|