コード例 #1
0
            public async void GrantedGlobalPermissionReturnsTrueForGrantedLocalWithDifferingTarget()
            {
                var requiredPermission = (Permission.SetClass, PermissionTarget.Self);

                var grantedLocalPermission = new LocalPermission
                {
                    Permission      = Permission.SetClass,
                    Target          = PermissionTarget.Self,
                    ServerDiscordID = (long)this.Guild.Id,
                    UserDiscordID   = (long)this.User.Id
                };

                var grantedGlobalPermission = new GlobalPermission
                {
                    Permission    = Permission.SetClass,
                    Target        = PermissionTarget.Other,
                    UserDiscordID = (long)this.User.Id
                };

                await this.Database.GlobalPermissions.AddAsync(grantedGlobalPermission);

                await this.Database.LocalPermissions.AddAsync(grantedLocalPermission);

                await this.Database.SaveChangesAsync();

                Assert.True(await this.Permissions.HasPermissionAsync(this.Database, this.Guild, this.User, requiredPermission));
            }
コード例 #2
0
        /// <summary>
        /// Grants the specified user the given permission. If the user already has the permission, it is augmented with
        /// the new scope and target (if they are more permissive than the existing ones).
        /// </summary>
        /// <param name="db">The database.</param>
        /// <param name="discordServer">The Discord server the permission was granted on.</param>
        /// <param name="discordUser">The Discord user.</param>
        /// <param name="grantedPermission">The granted permission.</param>
        /// <returns>A task wrapping the granting of the permission.</returns>
        public async Task GrantLocalPermissionAsync
        (
            [NotNull] GlobalInfoContext db,
            [NotNull] IGuild discordServer,
            [NotNull] IUser discordUser,
            [NotNull] LocalPermission grantedPermission
        )
        {
            var existingPermission = await GetLocalUserPermissions(db, discordUser, discordServer).FirstOrDefaultAsync
                                     (
                p =>
                p.Permission == grantedPermission.Permission &&
                p.ServerDiscordID == (long)discordServer.Id
                                     );

            if (existingPermission is null)
            {
                await db.LocalPermissions.AddAsync(grantedPermission);
            }
            else
            {
                // Include the new target permissions
                existingPermission.Target |= grantedPermission.Target;
            }

            await db.SaveChangesAsync();
        }
コード例 #3
0
 /// <summary>
 /// Adds a mocked local permission to the database.
 /// </summary>
 /// <param name="grantedPermission">The granted permission.</param>
 public void AddMockedLocalPermission([NotNull] LocalPermission grantedPermission)
 {
     using (var db = GetDatabaseContext())
     {
         db.LocalPermissions.Add(grantedPermission);
         db.SaveChanges();
     }
 }
コード例 #4
0
            public async Task Default([NotNull] IUser discordUser, Permission grantedPermission, PermissionTarget grantedTarget = PermissionTarget.Self)
            {
                var newPermission = new LocalPermission
                {
                    Permission      = grantedPermission,
                    Target          = grantedTarget,
                    ServerDiscordID = (long)this.Context.Guild.Id
                };

                await this.Permissions.GrantLocalPermissionAsync(this.Database, this.Context.Guild, discordUser, newPermission);

                await this.Feedback.SendConfirmationAsync(this.Context, $"{grantedPermission.ToString().Humanize().Transform(To.TitleCase)} granted to {discordUser.Mention}.");
            }
コード例 #5
0
        /// <summary>
        /// Grants the specified user their default permissions on the given server.
        /// </summary>
        /// <param name="db">The database.</param>
        /// <param name="server">The server to grant the permissions on.</param>
        /// <param name="user">The user to grant the permissions to.</param>
        /// <returns>A task wrapping the granting of default permissions.</returns>
        public async Task GrantDefaultPermissionsAsync([NotNull] GlobalInfoContext db, [NotNull] IGuild server, [NotNull] IUser user)
        {
            foreach (var permission in DefaultPermissions.DefaultPermissionSet)
            {
                var scopedPermission = new LocalPermission
                {
                    Permission      = permission.Permission,
                    Target          = permission.Target,
                    UserDiscordID   = (long)user.Id,
                    ServerDiscordID = (long)server.Id
                };

                await db.LocalPermissions.AddAsync(scopedPermission);
            }

            await db.SaveChangesAsync();
        }
コード例 #6
0
            public async void GrantedOtherTargetReturnsFalseForMatchingAndSelfTarget()
            {
                var requiredPermission = (Permission.SetClass, PermissionTarget.Self);

                var grantedPermission = new LocalPermission
                {
                    Permission      = Permission.SetClass,
                    Target          = PermissionTarget.Other,
                    ServerDiscordID = (long)this.Guild.Id,
                    UserDiscordID   = (long)this.User.Id
                };

                await this.Database.LocalPermissions.AddAsync(grantedPermission);

                await this.Database.SaveChangesAsync();

                Assert.False(await this.Permissions.HasPermissionAsync(this.Database, this.Guild, this.User, requiredPermission));
            }
コード例 #7
0
            public async void ExactlyMatchingLocalPermissionSetReturnsTrue()
            {
                var requiredPermission = (Permission.SetClass, PermissionTarget.Other);

                var grantedPermission = new LocalPermission
                {
                    Permission      = Permission.SetClass,
                    Target          = PermissionTarget.Other,
                    ServerDiscordID = (long)this.Guild.Id,
                    UserDiscordID   = (long)this.User.Id
                };

                await this.Database.LocalPermissions.AddAsync(grantedPermission);

                await this.Database.SaveChangesAsync();

                Assert.True(await this.Permissions.HasPermissionAsync(this.Database, this.Guild, this.User, requiredPermission));
            }
コード例 #8
0
            public async void GrantedLocalPermissionReturnsFalseIfServerIDsDiffer()
            {
                var anotherServer      = MockHelper.CreateDiscordGuild(2);
                var requiredPermission = (Permission.SetClass, PermissionTarget.Self);

                var grantedPermission = new LocalPermission
                {
                    Permission      = Permission.SetClass,
                    Target          = PermissionTarget.Other,
                    ServerDiscordID = (long)anotherServer.Id
                };

                await this.Database.LocalPermissions.AddAsync(grantedPermission);

                await this.Database.SaveChangesAsync();

                Assert.False(await this.Permissions.HasPermissionAsync(this.Database, this.Guild, this.User, requiredPermission));
            }