From bcfaf1fee30994c0b504e3ff5bd77db774ec9763 Mon Sep 17 00:00:00 2001 From: Dragory <2606411+Dragory@users.noreply.github.com> Date: Mon, 10 Aug 2020 00:39:07 +0300 Subject: [PATCH] Use RegExpRunner in !search and !bansearch --- backend/src/plugins/Utility/UtilityPlugin.ts | 7 ++++ backend/src/plugins/Utility/search.ts | 43 ++++++++++++-------- backend/src/plugins/Utility/types.ts | 2 + 3 files changed, 34 insertions(+), 18 deletions(-) diff --git a/backend/src/plugins/Utility/UtilityPlugin.ts b/backend/src/plugins/Utility/UtilityPlugin.ts index 1300e8d1..b54e7c23 100644 --- a/backend/src/plugins/Utility/UtilityPlugin.ts +++ b/backend/src/plugins/Utility/UtilityPlugin.ts @@ -32,6 +32,7 @@ import { ChannelInfoCmd } from "./commands/ChannelInfoCmd"; import { MessageInfoCmd } from "./commands/MessageInfoCmd"; import { InfoCmd } from "./commands/InfoCmd"; import { SnowflakeInfoCmd } from "./commands/SnowflakeInfoCmd"; +import { discardRegExpRunner, getRegExpRunner } from "../../regExpRunners"; const defaultOptions: PluginOptions = { config: { @@ -139,6 +140,8 @@ export const UtilityPlugin = zeppelinPlugin()("utility", { state.archives = GuildArchives.getGuildInstance(guild.id); state.supporters = new Supporters(); + state.regexRunner = getRegExpRunner(`guild-${pluginData.guild.id}`); + state.lastReload = Date.now(); if (activeReloads.has(guild.id)) { @@ -146,4 +149,8 @@ export const UtilityPlugin = zeppelinPlugin()("utility", { activeReloads.delete(guild.id); } }, + + onUnload(pluginData) { + discardRegExpRunner(`guild-${pluginData.guild.id}`); + }, }); diff --git a/backend/src/plugins/Utility/search.ts b/backend/src/plugins/Utility/search.ts index 3463c8d6..89109b70 100644 --- a/backend/src/plugins/Utility/search.ts +++ b/backend/src/plugins/Utility/search.ts @@ -1,7 +1,6 @@ import { Member, Message, User } from "eris"; import moment from "moment-timezone"; import escapeStringRegexp from "escape-string-regexp"; -import safeRegex from "safe-regex"; import { isFullMessage, MINUTES, multiSorter, noop, sorter, trimLines } from "../../utils"; import { getBaseUrl, sendErrorMessage } from "../../pluginUtils"; import { PluginData } from "knub"; @@ -11,6 +10,7 @@ import { banSearchSignature } from "./commands/BanSearchCmd"; import { UtilityPluginType } from "./types"; import { refreshMembersIfNeeded } from "./refreshMembers"; import { getUserInfoEmbed } from "./functions/getUserInfoEmbed"; +import { allowTimeout } from "../../RegExpRunner"; const SEARCH_RESULTS_PER_PAGE = 15; const SEARCH_ID_RESULTS_PER_PAGE = 50; @@ -262,36 +262,47 @@ async function performMemberSearch( queryRegex = new RegExp(escapeStringRegexp(args.query.trimStart()), args["case-sensitive"] ? "" : "i"); } - if (!safeRegex(queryRegex)) { - throw new SearchError("Unsafe/too complex regex (star depth is limited to 1)"); - } - if (args["status-search"]) { matchingMembers = matchingMembers.filter(member => { if (member.game) { - if (member.game.name && member.game.name.match(queryRegex)) { + if (member.game.name && pluginData.state.regexRunner.exec(queryRegex, member.game.name).catch(allowTimeout)) { return true; } - if (member.game.state && member.game.state.match(queryRegex)) { + if ( + member.game.state && + pluginData.state.regexRunner.exec(queryRegex, member.game.state).catch(allowTimeout) + ) { return true; } - if (member.game.details && member.game.details.match(queryRegex)) { + if ( + member.game.details && + pluginData.state.regexRunner.exec(queryRegex, member.game.details).catch(allowTimeout) + ) { return true; } if (member.game.assets) { - if (member.game.assets.small_text && member.game.assets.small_text.match(queryRegex)) { + if ( + member.game.assets.small_text && + pluginData.state.regexRunner.exec(queryRegex, member.game.assets.small_text).catch(allowTimeout) + ) { return true; } - if (member.game.assets.large_text && member.game.assets.large_text.match(queryRegex)) { + if ( + member.game.assets.large_text && + pluginData.state.regexRunner.exec(queryRegex, member.game.assets.large_text).catch(allowTimeout) + ) { return true; } } - if (member.game.emoji && member.game.emoji.name.match(queryRegex)) { + if ( + member.game.emoji && + pluginData.state.regexRunner.exec(queryRegex, member.game.emoji.name).catch(allowTimeout) + ) { return true; } } @@ -299,10 +310,10 @@ async function performMemberSearch( }); } else { matchingMembers = matchingMembers.filter(member => { - if (member.nick && member.nick.match(queryRegex)) return true; + if (member.nick && pluginData.state.regexRunner.exec(queryRegex, member.nick).catch(allowTimeout)) return true; const fullUsername = `${member.user.username}#${member.user.discriminator}`; - if (fullUsername.match(queryRegex)) return true; + if (pluginData.state.regexRunner.exec(queryRegex, fullUsername).catch(allowTimeout)) return true; return false; }); @@ -357,13 +368,9 @@ async function performBanSearch( queryRegex = new RegExp(escapeStringRegexp(args.query.trimStart()), args["case-sensitive"] ? "" : "i"); } - if (!safeRegex(queryRegex)) { - throw new SearchError("Unsafe/too complex regex (star depth is limited to 1)"); - } - matchingBans = matchingBans.filter(user => { const fullUsername = `${user.username}#${user.discriminator}`; - if (fullUsername.match(queryRegex)) return true; + if (pluginData.state.regexRunner.exec(queryRegex, fullUsername).catch(allowTimeout)) return true; }); } diff --git a/backend/src/plugins/Utility/types.ts b/backend/src/plugins/Utility/types.ts index c75cd9bb..346dfdfa 100644 --- a/backend/src/plugins/Utility/types.ts +++ b/backend/src/plugins/Utility/types.ts @@ -5,6 +5,7 @@ import { GuildCases } from "../../data/GuildCases"; import { GuildSavedMessages } from "../../data/GuildSavedMessages"; import { GuildArchives } from "../../data/GuildArchives"; import { Supporters } from "../../data/Supporters"; +import { RegExpRunner } from "../../RegExpRunner"; export const ConfigSchema = t.type({ can_roles: t.boolean, @@ -41,6 +42,7 @@ export interface UtilityPluginType extends BasePluginType { savedMessages: GuildSavedMessages; archives: GuildArchives; supporters: Supporters; + regexRunner: RegExpRunner; lastReload: number; };