[Core] Co-owners cli flag only, implemented owner cli flag

After giving it further thought, I don't believe co-owners really need to be a command, as it is unlikely that co-owners will need to be changed often enough.
Furthermore, this gives a further layer of protection to people who like to gloss over warnings.
This commit is contained in:
Twentysix 2017-07-25 01:46:55 +02:00
parent 2fa5792f69
commit be5c7f4592
3 changed files with 20 additions and 44 deletions

View File

@ -10,13 +10,13 @@ class Red(commands.Bot):
def __init__(self, cli_flags, **kwargs):
self._shutdown_mode = ExitCodes.CRITICAL
self.db = Config.get_core_conf(force_registration=True)
self._co_owners = cli_flags.co_owner
self.db.register_global(
token=None,
prefix=[],
packages=[],
owner=None,
coowners=[],
whitelist=[],
blacklist=[],
enable_sentry=None
@ -43,6 +43,9 @@ class Red(commands.Bot):
if "command_prefix" not in kwargs:
kwargs["command_prefix"] = prefix_manager
if cli_flags.owner and "owner_id" not in kwargs:
kwargs["owner_id"] = cli_flags.owner
if "owner_id" not in kwargs:
kwargs["owner_id"] = self.db.get("owner")
@ -51,7 +54,7 @@ class Red(commands.Bot):
super().__init__(**kwargs)
async def is_owner(self, user):
if user.id in self.db.coowners():
if user.id in self._co_owners:
return True
return await super().is_owner(user)

View File

@ -63,9 +63,17 @@ def ask_sentry(red: Red):
def parse_cli_flags():
parser = argparse.ArgumentParser(description="Red - Discord Bot")
parser.add_argument("--owner", help="ID of the owner. Only who hosts "
"Red should be owner, this has "
"security implications")
parser.add_argument("--owner", type=int,
help="ID of the owner. Only who hosts "
"Red should be owner, this has "
"serious security implications.")
parser.add_argument("--co-owner", type=int, action="append", default=[],
help="ID of a co-owner. Only people who have access "
"to the system that is hosting Red should be "
"co-owners, as this gives them complete access "
"to the system's data. This has serious "
"security implications if misused. Can be "
"multiple.")
parser.add_argument("--prefix", "-p", action="append",
help="Global prefix. Can be multiple")
parser.add_argument("--no-prompt",

View File

@ -11,10 +11,10 @@ import asyncio
log = logging.getLogger("red")
OWNER_DISCLAIMER = ("Setting as owner people who do not have access to "
"the system that is hosting Red is **extremely "
"dangerous**.\n**Owners and co owners are able to access "
"any data that is present on the host system.**")
OWNER_DISCLAIMER = ("⚠ **Only** the person who is hosting Red should be "
"owner. **This has SERIOUS security implications. The "
"owner can access any data that is present on the host "
"system.**")
class Core:
@ -281,38 +281,3 @@ class Core:
await ctx.send("You have been set as owner.")
else:
await ctx.send("Invalid token.")
@_set.command(aliases=["coowners"])
@checks.is_owner()
@commands.guild_only()
async def coowner(self, ctx, *coowners: discord.Member):
"""Sets Red's coowner(s)
Leave empty to reset"""
def check(m):
return m.author == ctx.author and m.channel == ctx.channel
coowners = [m.id for m in coowners]
if not coowners:
await ctx.bot.db.set("coowners", [])
await ctx.send("Coowners list cleared.")
return
await ctx.send("Remember:\n" + OWNER_DISCLAIMER)
await asyncio.sleep(5)
await ctx.send("Type `I understand` if you have read and understand "
"the above message.")
try:
message = await ctx.bot.wait_for("message", check=check,
timeout=60)
except asyncio.TimeoutError:
await ctx.send("The set owner request has timed out.")
else:
if message.content.lower().strip() == "i understand":
await ctx.bot.db.set("coowners", coowners)
await ctx.send("{} coowner(s) set.".format(len(coowners)))
else:
await ctx.send("Set coowner request aborted.")