Initial commit
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
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+(?<id>[0-9a-fA-F-]{36})\s*$",
|
||||
RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
|
||||
private static readonly Regex LimitedAccessListRegex = new(
|
||||
@"^Limited Access System Group For List\s+(?<id>[0-9a-fA-F-]{36})\s*$",
|
||||
RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
|
||||
private static readonly Regex SharingLinkRegex = new(
|
||||
@"^SharingLinks\.(?<item>[0-9a-fA-F-]{36})\.(?<type>[^.]+)\.(?<share>[0-9a-fA-F-]{36})\s*$",
|
||||
RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
|
||||
public static bool IsExternalUser(string loginName) =>
|
||||
loginName.Contains("#EXT#", StringComparison.OrdinalIgnoreCase);
|
||||
|
||||
public static IReadOnlyList<string> FilterPermissionLevels(IEnumerable<string> 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);
|
||||
Reference in New Issue
Block a user