[Core] Prevent users from locking out themselves or guild owner with localblacklist (#3221)

* Update core_commands.py

* Update core_commands.py

* Create 3207.bugfix.rst

* Update core_commands.py

* Create 3221.bugfix.rst

* Update redbot/core/core_commands.py

Co-Authored-By: Michael H <michael@michaelhall.tech>

* Update bot.py

* Rename 3221.bugfix.rst to 3221.bugfix.1.rst

* Create 3221.bugfix.2.rst

* Update bot.py

Co-authored-by: Michael H <michael@michaelhall.tech>
This commit is contained in:
jack1142 2019-12-27 23:33:22 +01:00 committed by Michael H
parent de229f63fe
commit aabdabf3bc
5 changed files with 21 additions and 3 deletions

View File

@ -0,0 +1 @@
Red will now prevent users from locking themselves out with localblacklist.

View File

@ -0,0 +1 @@
Red will now prevent users from locking guild owner out with localblacklist (unless the command caller is bot owner).

View File

@ -0,0 +1 @@
Guild owners are no longer affected by local whitelist and blacklist.

View File

@ -223,6 +223,11 @@ class RedBase(commands.GroupMixin, commands.bot.BotBase, RPCMixin): # pylint: d
------
TypeError
Did not provide ``who`` or ``who_id``
Returns
-------
bool
`True` if user is allowed to run things, `False` otherwise
"""
# Contributor Note:
# All config calls are delayed until needed in this section
@ -254,6 +259,9 @@ class RedBase(commands.GroupMixin, commands.bot.BotBase, RPCMixin): # pylint: d
return False
if guild:
if guild.owner_id == who.id:
return True
# The delayed expansion of ids to check saves time in the DM case.
# Converting to a set reduces the total lookup time in section
if mocked:

View File

@ -1915,8 +1915,15 @@ class Core(commands.Cog, CoreLogic):
user_or_role = discord.Object(id=user_or_role)
user = True
if user and await ctx.bot.is_owner(user_or_role):
await ctx.send(_("You cannot blacklist an owner!"))
if user:
if user_or_role.id == ctx.author.id:
await ctx.send(_("You cannot blacklist yourself!"))
return
if user_or_role.id == ctx.guild.owner_id and not await ctx.bot.is_owner(ctx.author):
await ctx.send(_("You cannot blacklist the guild owner!"))
return
if await ctx.bot.is_owner(user_or_role):
await ctx.send(_("You cannot blacklist a bot owner!"))
return
async with ctx.bot._config.guild(ctx.guild).blacklist() as curr_list: