From e55375fb2534092b1871465832a0a8cdab865930 Mon Sep 17 00:00:00 2001 From: Dragory <2606411+Dragory@users.noreply.github.com> Date: Fri, 21 Aug 2020 03:58:49 +0300 Subject: [PATCH] Eager-check permissions in persist plugin --- backend/src/plugins/Persist/PersistPlugin.ts | 2 ++ .../src/plugins/Persist/events/LoadDataEvt.ts | 34 ++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/backend/src/plugins/Persist/PersistPlugin.ts b/backend/src/plugins/Persist/PersistPlugin.ts index 4b206f4f..c802d783 100644 --- a/backend/src/plugins/Persist/PersistPlugin.ts +++ b/backend/src/plugins/Persist/PersistPlugin.ts @@ -6,6 +6,7 @@ import { GuildLogs } from "src/data/GuildLogs"; import { StoreDataEvt } from "./events/StoreDataEvt"; import { LoadDataEvt } from "./events/LoadDataEvt"; import { trimPluginDescription } from "../../utils"; +import { LogsPlugin } from "../Logs/LogsPlugin"; const defaultOptions: PluginOptions = { config: { @@ -25,6 +26,7 @@ export const PersistPlugin = zeppelinPlugin()("persist", { `), }, + dependencies: [LogsPlugin], configSchema: ConfigSchema, defaultOptions, diff --git a/backend/src/plugins/Persist/events/LoadDataEvt.ts b/backend/src/plugins/Persist/events/LoadDataEvt.ts index 63404921..d4a2bd03 100644 --- a/backend/src/plugins/Persist/events/LoadDataEvt.ts +++ b/backend/src/plugins/Persist/events/LoadDataEvt.ts @@ -1,8 +1,14 @@ import { persistEvent } from "../types"; -import { MemberOptions } from "eris"; +import { Constants, MemberOptions } from "eris"; import intersection from "lodash.intersection"; import { LogType } from "src/data/LogType"; import { stripObjectToScalars } from "src/utils"; +import { getMissingPermissions } from "../../../utils/getMissingPermissions"; +import { LogsPlugin } from "../../Logs/LogsPlugin"; +import { missingPermissionError } from "../../../utils/missingPermissionError"; +import { canAssignRole } from "../../../utils/canAssignRole"; + +const p = Constants.Permissions; export const LoadDataEvt = persistEvent({ event: "guildMemberAdd", @@ -23,9 +29,35 @@ export const LoadDataEvt = persistEvent({ const config = pluginData.config.getForMember(member); const restoredData = []; + // Check permissions + const me = pluginData.guild.members.get(pluginData.client.user.id); + let requiredPermissions = 0; + if (config.persist_nicknames) requiredPermissions |= p.manageNicknames; + if (config.persisted_roles) requiredPermissions |= p.manageRoles; + const missingPermissions = getMissingPermissions(me.permission, requiredPermissions); + if (missingPermissions) { + pluginData.getPlugin(LogsPlugin).log(LogType.BOT_ALERT, { + body: `Missing permissions for persist plugin: ${missingPermissionError(missingPermissions)}`, + }); + return; + } + + // Check specific role permissions + if (config.persisted_roles) { + for (const roleId of config.persisted_roles) { + if (!canAssignRole(pluginData.guild, me, roleId)) { + pluginData.getPlugin(LogsPlugin).log(LogType.BOT_ALERT, { + body: `Missing permissions to assign role \`${roleId}\` in persist plugin`, + }); + return; + } + } + } + const persistedRoles = config.persisted_roles; if (persistedRoles.length) { const rolesToRestore = intersection(persistedRoles, persistedData.roles); + if (rolesToRestore.length) { restoredData.push("roles"); toRestore.roles = Array.from(new Set([...rolesToRestore, ...member.roles]));