using System.Text.RegularExpressions; namespace SharepointToolbox.Web.Core.Helpers; public static class PermissionEntryHelper { private static readonly Regex LimitedAccessWebRegex = new( @"^Limited Access System Group For Web\s+(?[0-9a-fA-F-]{36})\s*$", RegexOptions.Compiled | RegexOptions.IgnoreCase); private static readonly Regex LimitedAccessListRegex = new( @"^Limited Access System Group For List\s+(?[0-9a-fA-F-]{36})\s*$", RegexOptions.Compiled | RegexOptions.IgnoreCase); private static readonly Regex SharingLinkRegex = new( @"^SharingLinks\.(?[0-9a-fA-F-]{36})\.(?[^.]+)\.(?[0-9a-fA-F-]{36})\s*$", RegexOptions.Compiled | RegexOptions.IgnoreCase); public static bool IsExternalUser(string loginName) => loginName.Contains("#EXT#", StringComparison.OrdinalIgnoreCase); public static IReadOnlyList FilterPermissionLevels(IEnumerable levels) => levels.Where(l => !string.Equals(l, "Limited Access", StringComparison.OrdinalIgnoreCase)).ToList(); public static bool IsBareLimitedAccessSystemGroup(string name) => name.Equals("Limited Access System Group", StringComparison.OrdinalIgnoreCase); public static SystemGroupClassification Classify(string groupTitle) { if (string.IsNullOrWhiteSpace(groupTitle)) return new SystemGroupClassification(SystemGroupKind.None, null, null, null, null, null); var trimmed = groupTitle.Trim(); if (IsBareLimitedAccessSystemGroup(trimmed)) return new SystemGroupClassification(SystemGroupKind.LimitedAccessBare, null, null, null, null, null); var mWeb = LimitedAccessWebRegex.Match(trimmed); if (mWeb.Success && Guid.TryParse(mWeb.Groups["id"].Value, out var webId)) return new SystemGroupClassification(SystemGroupKind.LimitedAccessWeb, webId, null, null, null, null); var mList = LimitedAccessListRegex.Match(trimmed); if (mList.Success && Guid.TryParse(mList.Groups["id"].Value, out var listId)) return new SystemGroupClassification(SystemGroupKind.LimitedAccessList, null, listId, null, null, null); var mShare = SharingLinkRegex.Match(trimmed); if (mShare.Success && Guid.TryParse(mShare.Groups["item"].Value, out var itemId) && Guid.TryParse(mShare.Groups["share"].Value, out var shareId)) { return new SystemGroupClassification( SystemGroupKind.SharingLink, null, null, itemId, mShare.Groups["type"].Value, shareId); } return new SystemGroupClassification(SystemGroupKind.None, null, null, null, null, null); } } public enum SystemGroupKind { None, LimitedAccessBare, LimitedAccessWeb, LimitedAccessList, SharingLink } public readonly record struct SystemGroupClassification( SystemGroupKind Kind, Guid? WebId, Guid? ListId, Guid? ItemUniqueId, string? LinkType, Guid? ShareId);