private Dictionary <PermissionTypeBase, int> PermissionQueryWithLinq_GetRelatedPermissions(
            SecurityContext ctx, int entityId, int identityId, PermissionLevel level)
        {
            var counters        = new int[PermissionTypeBase.PermissionCount];
            var permissionTypes = PermissionTypeBase.GetPermissionTypes();

            void CountBits(ulong bits)
            {
                var mask = 1uL;
                var b    = bits;

                foreach (var pt in permissionTypes)
                {
                    if ((b & mask) > 0)
                    {
                        counters[pt.Index]++;
                    }
                    mask <<= 1;
                }
            }

            var identities = new[] { identityId };

            foreach (var change in SecurityQuery.Subtree(ctx)
                     .GetPermissionChanges(entityId, identities, BreakOptions.StopAtParentBreak)
                     .Where(x => x.EntryType == EntryType.Normal))
            {
                switch (level)
                {
                case PermissionLevel.Allowed:
                    CountBits(change.ChangedBits.AllowBits);
                    break;

                case PermissionLevel.Denied:
                    CountBits(change.ChangedBits.DenyBits);
                    break;

                case PermissionLevel.AllowedOrDenied:
                    CountBits(change.ChangedBits.AllowBits);
                    CountBits(change.ChangedBits.DenyBits);
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(level), level, null);
                }
            }

            var result = new Dictionary <PermissionTypeBase, int>();

            for (var i = 0; i < PermissionTypeBase.PermissionCount; i++)
            {
                result.Add(PermissionTypeBase.GetPermissionTypeByIndex(i), counters[i]);
            }

            return(result);
        }
Example #2
0
        private static PermissionTypeBase[] GetPermissionTypes(string bitMask)
        {
            var result = new List <PermissionTypeBase>();
            var length = bitMask.Length;

            for (var i = 0; i < length; i++)
            {
                if (bitMask[i] != '_')
                {
                    result.Add(PermissionTypeBase.GetPermissionTypeByIndex(length - i - 1));
                }
            }

            return(result.ToArray());
        }
Example #3
0
        /// <summary>
        /// Returns resolved permission types by the passed source string like this: "______________+"
        /// </summary>
        /// <param name="src">Use like tis: "______________+"</param>
        /// <returns>PermissionType[]</returns>
        internal PermissionTypeBase[] GetPermissionTypes(string src)
        {
            var result = new List <PermissionTypeBase>();
            var index  = 0;

            for (var i = src.Length - 1; i >= 0; i--)
            {
                if (src[i] != '_')
                {
                    result.Add(PermissionTypeBase.GetPermissionTypeByIndex(index));
                }
                index++;
            }
            return(result.ToArray());
        }
        private Dictionary <PermissionTypeBase, int> PermissionQueryWithLinq_GetRelatedPermissions_OLD(
            TestSecurityContext ctx, int entityId, int identityId, PermissionLevel level)
        {
            var counters        = new int[PermissionTypeBase.PermissionCount];
            var permissionTypes = PermissionTypeBase.GetPermissionTypes();

            void CountBits(ulong bits)
            {
                var mask = 1uL;
                var b    = bits;

                foreach (var pt in permissionTypes)
                {
                    if ((b & mask) > 0)
                    {
                        counters[pt.Index]++;
                    }
                    mask = mask << 1;
                }
            }

            //var identities = new TestSecurityContext(new TestUser { Id = identityId }).GetGroups();
            //identities.Add(identityId);
            var identities = new[] { identityId };

            var aces = SecurityQuery.ParentChain(ctx).GetEntities(entityId, BreakOptions.StopAtParentBreak)
                       .Where(e => e.Acl != null)                              // relevant entities
                       .SelectMany(e => e.Acl.Entries)                         // join
                       .Where(e => identities.Contains(e.IdentityId) &&        // identity filter
                              !e.LocalOnly &&                                  // local only entry is not affected on the parent chain
                              e.EntryType == EntryType.Normal)                 // only the normal entries are relevant
                       .Union(SecurityQuery.Subtree(ctx).GetEntities(entityId) // do not stop at breaks
                              .Where(e => e.Acl != null)                       // relevant entities
                              .SelectMany(e => e.Acl.Entries)                  // join
                              .Where(e => identities.Contains(e.IdentityId) && // identity filter
                                     e.EntryType == EntryType.Normal)          // only the normal entries are relevant
                              );

            foreach (var ace in aces)
            {
                switch (level)
                {
                case PermissionLevel.Allowed:
                    CountBits(ace.AllowBits);
                    break;

                case PermissionLevel.Denied:
                    CountBits(ace.DenyBits);
                    break;

                case PermissionLevel.AllowedOrDenied:
                    CountBits(ace.AllowBits);
                    CountBits(ace.DenyBits);
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(level), level, null);
                }
            }

            var result = new Dictionary <PermissionTypeBase, int>();

            for (var i = 0; i < PermissionTypeBase.PermissionCount; i++)
            {
                result.Add(PermissionTypeBase.GetPermissionTypeByIndex(i), counters[i]);
            }

            return(result);
        }