Skip to content

Commit

Permalink
Don't attempt to resolve permissions for invalid roles
Browse files Browse the repository at this point in the history
This resolves #824.

Discord seems to have inconsistencies where a role can be deleted, but
there will still be a few users who still have it in their `role_ids`. I
was able to find this bug appearing in 11 members of a 10,000 member
guild, so it would make sense that this is relatively rare, and it's why
we hadn't noticed it previously.

Since our permission resolution code is implementation agnostic, it
operates on the user's RoleIds collection, which is what Discord sends
us directly, and is not vaidated against the member's guild.

In our permission resolution code, we make the assumption that Discord
will always be telling us the truth with regard to a member's
`role_ids`. This PR changes the behavior of permissions resolution to
instead verify that the guild was able to return a role before
attempting to resolve its permissions.
  • Loading branch information
foxbot committed Jan 15, 2018
1 parent a384ce0 commit 05cd1ff
Showing 1 changed file with 3 additions and 2 deletions.
5 changes: 3 additions & 2 deletions src/Discord.Net.Core/Utils/Permissions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -133,9 +133,10 @@ public static ulong ResolveChannel(IGuild guild, IGuildUser user, IGuildChannel
ulong deniedPermissions = 0UL, allowedPermissions = 0UL;
foreach (var roleId in user.RoleIds)
{
if (roleId != guild.EveryoneRole.Id)
IRole role = null;
if (roleId != guild.EveryoneRole.Id && (role = guild.GetRole(roleId)) != null)
{
perms = channel.GetPermissionOverwrite(guild.GetRole(roleId));
perms = channel.GetPermissionOverwrite(role);
if (perms != null)
{
allowedPermissions |= perms.Value.AllowValue;
Expand Down

0 comments on commit 05cd1ff

Please sign in to comment.