Fix bug when permission overwrites could be applied out of order.
The bug was due to the fact that the way overwrites work is by doing a loop of all the values and then applying deny first and then allow. That way the overwrite is defined if role A and role B deny a permission but role C allows it (and said member has A, B, C roles) then the resolution should allow it rather than deny it regardless of the order of the data it is received in.
This commit is contained in:
		| @@ -245,16 +245,22 @@ class Channel(Hashable): | |||||||
|             return Permissions.all() |             return Permissions.all() | ||||||
|  |  | ||||||
|         member_role_ids = set(map(lambda r: r.id, member.roles)) |         member_role_ids = set(map(lambda r: r.id, member.roles)) | ||||||
|  |         denies = 0 | ||||||
|  |         allows = 0 | ||||||
|  |  | ||||||
|         # Apply channel specific role permission overwrites |         # Apply channel specific role permission overwrites | ||||||
|         for overwrite in self._permission_overwrites: |         for overwrite in self._permission_overwrites: | ||||||
|             if overwrite.type == 'role' and overwrite.id in member_role_ids: |             if overwrite.type == 'role' and overwrite.id in member_role_ids: | ||||||
|                 base.handle_overwrite(allow=overwrite.allow, deny=overwrite.deny) |                 denies |= overwrite.deny | ||||||
|  |                 allows |= overwrite.allow | ||||||
|  |  | ||||||
|  |         base.handle_overwrite(allow=allows, deny=denies) | ||||||
|  |  | ||||||
|         # Apply member specific permission overwrites |         # Apply member specific permission overwrites | ||||||
|         for overwrite in self._permission_overwrites: |         for overwrite in self._permission_overwrites: | ||||||
|             if overwrite.type == 'member' and overwrite.id == member.id: |             if overwrite.type == 'member' and overwrite.id == member.id: | ||||||
|                 base.handle_overwrite(allow=overwrite.allow, deny=overwrite.deny) |                 base.handle_overwrite(allow=overwrite.allow, deny=overwrite.deny) | ||||||
|  |                 break | ||||||
|  |  | ||||||
|         # default channels can always be read |         # default channels can always be read | ||||||
|         if self.is_default: |         if self.is_default: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user