コード例 #1
0
        public async Task <IEnumerable <string> > GetDeniedPermissionsAsync(IPermissionActor target, bool inherit = true)
        {
            PermissionSection section = target is IPermissionGroup
                ? (PermissionSection) await GetConfigSectionAsync <GroupPermissionSection>(target, false)
                : await GetConfigSectionAsync <PlayerPermissionSection>(target, false);

            List <string> permissions;

            if (section != null)
            {
                permissions = section.Permissions
                              .Where(c => c.StartsWith("!"))
                              .Select(c => c.Substring(1).ToLower())
                              .ToList();
            }
            else
            {
                permissions = new List <string>();
            }

            if (inherit)
            {
                foreach (var parent in await GetGroupsAsync(target))
                {
                    permissions
                    .AddRange(await GetDeniedPermissionsAsync(parent, true));
                }
            }

            return(permissions.Distinct());
        }
コード例 #2
0
        public IEnumerable <string> GetDeniedPermissions(IIdentity target, bool inherit = true)
        {
            PermissionSection section = target is IPermissionGroup
                ? (PermissionSection)GetConfigSection <GroupPermissionSection>(target, false)
                : GetConfigSection <PlayerPermissionSection>(target, false);

            List <string> permissions;

            if (section != null)
            {
                permissions = section.Permissions
                              .Where(c => c.StartsWith("!"))
                              .Select(c => c.Substring(1).ToLower())
                              .ToList();
            }
            else
            {
                permissions = new List <string>();
            }

            if (inherit)
            {
                foreach (var parent in GetGroups(target))
                {
                    permissions
                    .AddRange(GetDeniedPermissions(parent, true));
                }
            }

            return(permissions.Distinct());
        }
コード例 #3
0
        public async Task <PermissionResult> CheckPermissionAsync(IPermissionActor target, string permission)
        {
            GuardLoaded();
            GuardPermission(ref permission);
            GuardTarget(target);

            permission = permission.Replace("!!", ""); //remove double negations

            if (!permission.StartsWith("!") && await CheckPermissionAsync(target, "!" + permission) == PermissionResult.Grant)
            {
                return(PermissionResult.Deny);
            }

            IEnumerable <string> permissionTree = BuildPermissionTree(permission);

            PermissionSection section = target is IPermissionGroup
                ? (PermissionSection) await GetConfigSectionAsync <GroupPermissionSection>(target, false)
                : await GetConfigSectionAsync <PlayerPermissionSection>(target, false);

            string[] permissions = section?.Permissions ?? new string[0];

            foreach (string permissionNode in permissionTree)
            {
                foreach (string c in permissions)
                {
                    if (c.Contains("*") && !c.StartsWith("!") && permission.StartsWith("!"))
                    {
                        continue;
                    }

                    if (c.Trim().Equals(permissionNode, StringComparison.OrdinalIgnoreCase))
                    {
                        return(PermissionResult.Grant);
                    }
                }
            }

            // check parent group permissions / player group permissions
            IEnumerable <IPermissionGroup> groups = await GetGroupsAsync(target);

            foreach (IPermissionGroup group in groups)
            {
                PermissionResult result = await CheckPermissionAsync(group, permission);

                if (result == PermissionResult.Grant)
                {
                    return(PermissionResult.Grant);
                }

                if (result == PermissionResult.Deny)
                {
                    return(PermissionResult.Deny);
                }
            }

            return(PermissionResult.Default);
        }
コード例 #4
0
        public bool AddPermission(IIdentity target, string permission)
        {
            GuardPermission(ref permission);
            GuardTarget(target);

            PermissionSection section = target is IPermissionGroup
                ? (PermissionSection)GetConfigSection <GroupPermissionSection>(target, true)
                : GetConfigSection <PlayerPermissionSection>(target, true);

            List <string> permissions = section.Permissions.ToList();

            permissions.Add(permission);
            section.Permissions = permissions.ToArray();
            section.Save();
            return(true);
        }
コード例 #5
0
        public async Task <bool> AddPermissionAsync(IPermissionActor target, string permission)
        {
            GuardPermission(ref permission);
            GuardTarget(target);

            PermissionSection section = (target is IPermissionGroup
                ? (PermissionSection)await GetConfigSectionAsync <GroupPermissionSection>(target, true)
                : await GetConfigSectionAsync <PlayerPermissionSection>(target, true));

            List <string> permissions = section.Permissions.ToList();

            permissions.Add(permission);
            section.Permissions = permissions.ToArray();
            await section.SaveAsync();

            return(true);
        }
コード例 #6
0
        public async Task <IEnumerable <IPermissionGroup> > GetGroupsAsync(IPermissionActor target)
        {
            GuardLoaded();
            GuardTarget(target);

            PermissionSection section = (target is IPermissionGroup
                ? (PermissionSection)await GetConfigSectionAsync <GroupPermissionSection>(target, false)
                : await GetConfigSectionAsync <PlayerPermissionSection>(target, false));

            if (section == null)
            {
                return((await GetGroupsAsync()).Where(c => c.AutoAssign));
            }

            return(section.GetGroups()
                   .Select(e => GetGroupAsync(e).GetAwaiter().GetResult())
                   .Where(c => c != null));
        }
コード例 #7
0
        public IEnumerable <IPermissionGroup> GetGroups(IIdentity target)
        {
            GuardLoaded();
            GuardTarget(target);

            PermissionSection section = target is IPermissionGroup
                ? (PermissionSection)GetConfigSection <GroupPermissionSection>(target, false)
                : GetConfigSection <PlayerPermissionSection>(target, false);

            if (section == null)
            {
                return(GetGroups().Where(c => c.AutoAssign));
            }

            return(section.GetGroups()
                   .Select(GetGroup)
                   .Where(c => c != null));
        }
コード例 #8
0
        public bool AddGroup(IIdentity target, IPermissionGroup group)
        {
            GuardLoaded();
            GuardTarget(target);
            GuardTarget(group);

            PermissionSection section = target is IPermissionGroup
                ? (PermissionSection)GetConfigSection <GroupPermissionSection>(target, true)
                : GetConfigSection <PlayerPermissionSection>(target, true);

            List <string> groups = section.GetGroups().ToList();

            if (!groups.Any(c => c.Equals(group.Id, StringComparison.OrdinalIgnoreCase)))
            {
                groups.Add(group.Id);
            }
            section.SetGroups(groups.ToArray());
            section.Save();
            return(true);
        }
コード例 #9
0
        public bool RemovePermission(IIdentity target, string permission)
        {
            GuardPermission(ref permission);

            PermissionSection section = target is IPermissionGroup
                ? (PermissionSection)GetConfigSection <GroupPermissionSection>(target, false)
                : GetConfigSection <PlayerPermissionSection>(target, false);

            if (section == null)
            {
                return(false);
            }

            List <string> permissions = section.Permissions.ToList();
            int           i           = permissions.RemoveAll(c => c.Trim().Equals(permission, StringComparison.OrdinalIgnoreCase));

            section.Permissions = permissions.ToArray();
            section.Save();
            return(i > 0);
        }
コード例 #10
0
        public async Task <bool> AddGroupAsync(IPermissionActor target, IPermissionGroup group)
        {
            GuardLoaded();
            GuardTarget(target);
            GuardTarget(group);

            PermissionSection section = target is IPermissionGroup
                ? (PermissionSection) await GetConfigSectionAsync <GroupPermissionSection>(target, true)
                : await GetConfigSectionAsync <PlayerPermissionSection>(target, true);

            List <string> groups = section.GetGroups().ToList();

            if (!groups.Any(c => c.Equals(group.Id, StringComparison.OrdinalIgnoreCase)))
            {
                groups.Add(group.Id);
            }
            section.SetGroups(groups.ToArray());
            await section.SaveAsync();

            return(true);
        }
コード例 #11
0
        public async Task <bool> RemovePermissionAsync(IPermissionActor target, string permission)
        {
            GuardPermission(ref permission);

            PermissionSection section = (target is IPermissionGroup
                ? (PermissionSection)await GetConfigSectionAsync <GroupPermissionSection>(target, false)
                : await GetConfigSectionAsync <PlayerPermissionSection>(target, false));

            if (section == null)
            {
                return(false);
            }

            List <string> permissions = section.Permissions.ToList();
            int           i           = permissions.RemoveAll(c => c.Trim().Equals(permission, StringComparison.OrdinalIgnoreCase));

            section.Permissions = permissions.ToArray();
            await section.SaveAsync();

            return(i > 0);
        }
コード例 #12
0
        public bool RemoveGroup(IIdentity target, IPermissionGroup group)
        {
            GuardLoaded();
            GuardTarget(target);
            GuardTarget(group);

            PermissionSection section = target is IPermissionGroup
                ? (PermissionSection)GetConfigSection <GroupPermissionSection>(target, false)
                : GetConfigSection <PlayerPermissionSection>(target, false);

            if (section == null)
            {
                return(false);
            }

            List <string> groups = section.GetGroups().ToList();
            int           i      = groups.RemoveAll(c => c.Equals(group.Id, StringComparison.OrdinalIgnoreCase));

            section.SetGroups(groups.ToArray());
            section.Save();
            return(i > 0);
        }
コード例 #13
0
        public async Task <bool> RemoveGroupAsync(IPermissionActor target, IPermissionGroup group)
        {
            GuardLoaded();
            GuardTarget(target);
            GuardTarget(group);

            PermissionSection section = target is IPermissionGroup
                ? (PermissionSection) await GetConfigSectionAsync <GroupPermissionSection>(target, false)
                : await GetConfigSectionAsync <PlayerPermissionSection>(target, false);

            if (section == null)
            {
                return(false);
            }

            List <string> groups = section.GetGroups().ToList();
            int           i      = groups.RemoveAll(c => c.Equals(group.Id, StringComparison.OrdinalIgnoreCase));

            section.SetGroups(groups.ToArray());
            await section.SaveAsync();

            return(i > 0);
        }