Example #1
0
        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);
            }
        }
Example #2
0
        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);
        }
Example #4
0
 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());
            }
        }