internal static bool CheckDiscriminators(this IInternalRolCan me, bool forAll, TypeDiscriminator typeDiscriminator, params IDiscriminator[] discriminators) { using (var res = Printer.CallResult <bool>()) { using (Printer.Indent2("Input parameters")) { Printer.WriteLine($"Rol: {me?.Rol?.Name}"); Printer.WriteLine($"Functions: {string.Join(",", me.Functions.Select(f => f.Name)) ?? "<null>"}"); Printer.WriteLine($"For all: {forAll}"); Printer.WriteLine($"Type discriminator: {typeDiscriminator?.ToString() ?? "null"}"); Printer.Foreach($"Discriminators:", discriminators, dis => Printer.WriteLine($"{dis}")); } // If Rol is null, return false if (me.Rol == null) { Printer.WriteLine($"Rol is NULL, return FALSE"); return(res.Value = false); } // If target discriminator is null, return true if (typeDiscriminator == null) { Printer.WriteLine($"TypeDiscriminator is NULL, return TRUE"); return(res.Value = true); } bool Compute() { //Printer.Foreach("Iterating functions:", me.Functions, fun => { foreach (var fun in me.Functions) { Printer.WriteLine($"Function '{fun.Name}':"); var pers = SearchPermissions(me.Rol, false, fun, typeDiscriminator, discriminators); if (!pers.Any()) { return(false); } else { var grantPermissions = pers.Where(p => p.Value).ToList(); var deniedPermissions = pers.Where(p => !p.Value).ToList(); Printer.WriteLine($"Found '{grantPermissions.Count}' grant permissions"); Printer.WriteLine($"Found '{deniedPermissions.Count}' denied permissions"); var r = false; if (discriminators.IsNullOrEmpty()) { r = grantPermissions.Count > 0 && deniedPermissions.Count == 0; } else { r = forAll ? discriminators.All(dis => { return(grantPermissions.Count > 0 && deniedPermissions.Count == 0); // || grantPermissions.Count == 0; }) : discriminators.Any(dis => { //var pers = me.Rol.SearchPermissions(fun, dis); //return !pers.Any(p => !p.Value && p.Scopes.Any(s => dis.TypeId == s.Discriminator.TypeId)) && pers.Any(p => p.Value); return(!pers.Any(p => !p.Value && p.Match(false, fun, typeDiscriminator, discriminators)) && pers.Any(p => p.Value)); }); } if (!r && me.ThrowExceptionIfCannot) { throw new UnauthorizedAccessException($"The rol '{me.Rol.Name}' cannot '{me.Functions.Aggregate("", (a, c) => a + c.Name + "·", a => a.Trim('·'))}' of type '{typeDiscriminator.Name}' with given discriminators '{discriminators.Aggregate("", (a, c) => $"{a}, {c.TypeName + "<" + c.Name + ">"}", a => a.Trim(',', ' ')) }'"); } return(r); } } return(false); } res.Value = Compute(); if (!res.Value && me.ThrowExceptionIfCannot) { throw new UnauthorizedAccessException($"The rol '{me.Rol.Name}' cannot '{me.Functions.Aggregate("", (a, c) => a + c.Name + "·", a => a.Trim('·'))}' of type '{typeDiscriminator.Name}' with given discriminators '{discriminators.Aggregate("", (a, c) => $"{a}, {c.TypeName + "<" + c.Name + ">"}", a => a.Trim(',', ' ')) }'"); } return(res.Value); } }
internal static IPermission[] SearchPermissions(this IRol me, bool forFilter, IFunction function, TypeDiscriminator typeDiscriminator, params IDiscriminator[] discriminators) { using (var res = Printer.CallResult <IPermission[]>()) { discriminators = discriminators.RemoveNulls(); using (Printer.Indent2("Inpupt Prameters")) { Printer.WriteLine($"Rol: {me?.Name}"); Printer.WriteLine($"For filter: " + forFilter); Printer.WriteLine($"Function: {function?.ToString() ?? "<null>"}"); Printer.WriteLine($"Type discriminator: {typeDiscriminator?.ToString() ?? "<null>"}"); Printer.Foreach($"Discriminators:", discriminators, dis => Printer.WriteLine($"{dis}")); } // Function validation if (!(function?.IsValid() ?? true)) { throw new ArgumentException($"The '{nameof(function)}' pararameter with value '{function}' has an invalid state", nameof(function)); } // TypeDiscriminator validation if (!typeDiscriminator?.IsValid() ?? false) { throw new InvalidStateException($"The '{typeDiscriminator}' discriminator has an invalid state"); } // Discriminators validation var invalidDiscriminator = discriminators?.FirstOrDefault(d => !d.IsValid()); if (invalidDiscriminator != null) { throw new InvalidStateException($"The '{invalidDiscriminator}' discriminator has an invalid state"); } // Get & print rol permissions var permissions = me.AllPermissions(); using (Printer.Indent2("Permissions:")) permissions.Print(PrintMode.Table); using (Printer.Indent2("Iterate permissions:")) res.Value = permissions.Where(p => p.Match(forFilter, function, typeDiscriminator, discriminators)).ToArray(); res.OnPrintResult = r => r.Print(PrintMode.Table); return(res.Value); } }
internal static bool MatchByDiscriminatorsInclusionsAndExclusions(this IPermission me, bool forFilter, TypeDiscriminator typeDiscriminator, params IDiscriminator[] discriminators) { var res = false; using (Printer.Indent2($"CALL {nameof(MatchByDiscriminatorsInclusionsAndExclusions)}:", '│')) { using (Printer.Indent2("Input parameters")) { Printer.WriteLine($"Permission:"); new[] { me }.Print(PrintMode.Table); Printer.WriteLine($"'{nameof(forFilter)}': " + forFilter); if (typeDiscriminator == null) { Printer.WriteLine($"'{nameof(typeDiscriminator)}': null"); } else { Printer.WriteLine($"'{nameof(typeDiscriminator)}':"); new[] { typeDiscriminator }.Print(PrintMode.Table); } Printer.WriteLine($"'{nameof(discriminators)}':"); discriminators.Print(PrintMode.Table); } if (discriminators.Any(d => Comparer.AreEquals(d.TypeKey, TypeDiscriminator.TypeDiscriminatorId))) { throw new ArgumentException($"'{nameof(discriminators)}' cannot contains a '{nameof(TypeDiscriminator)}'"); } if (typeDiscriminator == null) { throw new ArgumentException($"'{nameof(typeDiscriminator)}' cannot be null"); } bool Compute() { // Si no hay discriminador de tipo, TRUE if (typeDiscriminator == null) { Printer.WriteLine($"'{nameof(typeDiscriminator)}' is null"); //return true; } // Si el permiso no define scopes, TRUE if (!me.Scopes.Any()) { Printer.WriteLine("Permission hasn't scopes"); return(true); } var typeDiscriminatorRelatedWithAnyPermissionScope = false; // Compruebo el discriminador de tipo using (Printer.Indent2($"Checking type discriminator")) { var scopeOfTypeOfTypeDiscriminator = me.Scopes.FirstOrDefault(s => Comparer.AreEquals(s.Discriminator.TypeKey, typeDiscriminator?.TypeKey)); if (scopeOfTypeOfTypeDiscriminator != null) { Printer.WriteLine($"The {nameof(typeDiscriminator)} '{typeDiscriminator}' and permission scope '{scopeOfTypeOfTypeDiscriminator}' have same type '{typeDiscriminator.TypeKey}', continue"); var scopeDiscriminatorRelatedWithTargetDiscriminator = scopeOfTypeOfTypeDiscriminator?.Discriminator .GetAllRelated(scopeOfTypeOfTypeDiscriminator.Propagation) .FirstOrDefault(rel => Comparer.AreEquals(typeDiscriminator.TypeKey, rel.TypeKey) && Comparer.AreEquals(typeDiscriminator.Id, rel.Id)); if (scopeDiscriminatorRelatedWithTargetDiscriminator != null) { Printer.WriteLine($"The {nameof(typeDiscriminator)} '{typeDiscriminator}' is related to permission scope '{scopeOfTypeOfTypeDiscriminator}' on discriminator '{scopeDiscriminatorRelatedWithTargetDiscriminator}', check discriminators"); typeDiscriminatorRelatedWithAnyPermissionScope = true; } else if (typeDiscriminator != TypeDiscriminator.Empty) { Printer.WriteLine($"The {nameof(typeDiscriminator)} '{typeDiscriminator}' isn't related to permission scope '{scopeOfTypeOfTypeDiscriminator}', FALSE"); return(false); } } else { Printer.WriteLine($"The {nameof(typeDiscriminator)} '{typeDiscriminator}' hasn't any scope with discriminator of its type"); if (discriminators.IsNullOrEmpty()) { Printer.WriteLine($"Haven't discriminators, VALUE ({me.Value})"); return(me.Value); } else { Printer.WriteLine($"Have some discriminators, check discriminators"); } } } using (Printer.Indent2($"Checking discriminators:")) { // Compruebo el resto de discriminadores return(discriminators.All(dis => { var scopeOfTypeOfDiscriminator = me.Scopes.FirstOrDefault(s => Comparer.AreEquals(s.Discriminator.TypeKey, dis.TypeKey)); var scopeDiscriminatorRelatedWithDiscriminator = scopeOfTypeOfDiscriminator?.Discriminator .GetAllRelated(scopeOfTypeOfDiscriminator.Propagation) .FirstOrDefault(rel => Comparer.AreEquals(dis.TypeKey, rel.TypeKey) && Comparer.AreEquals(dis.Id, rel.Id)); if (scopeOfTypeOfDiscriminator != null) { Printer.WriteLine($"The discriminator '{dis}' and permission scope '{scopeOfTypeOfDiscriminator}' have same type '{dis.TypeKey}'"); if (scopeDiscriminatorRelatedWithDiscriminator != null) { Printer.WriteLine($"The discriminator '{dis}' is related to permission scope '{scopeOfTypeOfDiscriminator}' on discriminator '{scopeDiscriminatorRelatedWithDiscriminator}'"); return true; } else { Printer.WriteLine($"The discriminator '{dis}' isn't related to permission scopes, continue"); if (forFilter) { Printer.WriteLine($"This search is 'forFilter', TRUE"); return true; } } } else { Printer.WriteLine($"The permission hasn't any discriminator of type '{dis}', check typeDiscriminator"); if (typeDiscriminatorRelatedWithAnyPermissionScope) { Printer.WriteLine($"The {nameof(typeDiscriminator)} '{typeDiscriminator}' is related to any permission scope, TRUE"); return true; } else { Printer.WriteLine($"The {nameof(typeDiscriminator)} '{typeDiscriminator}' isn't related to any permission scope, check if discriminator '{dis}' id is null"); if (dis.Id.IsNullOrDefault()) { Printer.WriteLine($"Discriminator '{dis}' id is null, VALUE ({me.Value})"); return me.Value; } else { Printer.WriteLine($"Discriminator '{dis}' id isn't null, VALUE ({me.Value})"); return !me.Value; } } //return dis.Id.IsNullOrDefault() ? me.Value : !me.Value; } return false; })); } } res = Compute(); } Printer.WriteLine($"● RESULT {nameof(MatchByDiscriminatorsInclusionsAndExclusions)}: {res}"); return(res); }
public static bool ByAny(this IRolCan me, TypeDiscriminator typeDiscriminator, params IDiscriminator[] discriminators) { using (var res = Printer.CallResult <bool>()) return(res.Value = ((IInternalRolCan)me).CheckDiscriminators(false, typeDiscriminator, discriminators)); }
internal static bool Match(this IPermission me, bool forFilter, IFunction function, TypeDiscriminator typeDiscriminator, params IDiscriminator[] discriminators) { using (var res = Printer.CallResult <bool>()) { using (Printer.Indent2("Input parameters")) { Printer.WriteLine($"Permission:"); new[] { me }.Print(PrintMode.Table); Printer.WriteLine($"'{nameof(forFilter)}': " + forFilter); Printer.WriteLine($"Function: {function?.Name ?? "<null>"}"); if (typeDiscriminator != null) { Printer.WriteLine($"'{nameof(typeDiscriminator)}':"); new[] { typeDiscriminator }.Print(PrintMode.Table); } else { Printer.WriteLine($"'{nameof(typeDiscriminator)}': null"); } Printer.WriteLine($"Discriminators:"); discriminators.Print(PrintMode.Table); } bool Compute() { if (function == null || !me.MatchByFunction(function)) { Printer.WriteLine($"Matching failed on check the function"); return(false); } if (!me.MatchByDiscriminatorsInclusionsAndExclusions(forFilter, typeDiscriminator, discriminators)) { Printer.WriteLine($"Matching failed on check the inclusions/exclusions of discriminator"); return(false); } return(true); } return(res.Value = Compute()); } }