summaryrefslogtreecommitdiff
path: root/packages/backend/src/misc
diff options
context:
space:
mode:
authorJohann150 <johann.galle@protonmail.com>2022-02-10 11:47:46 +0100
committerGitHub <noreply@github.com>2022-02-10 19:47:46 +0900
commitafb63049798dd0277cd9045eb00a16ab1228376b (patch)
treec3a00837a7fc7e626f5632902cf894db326c7828 /packages/backend/src/misc
parentNode v16.13.2 (#8281) (diff)
downloadmisskey-afb63049798dd0277cd9045eb00a16ab1228376b.tar.gz
misskey-afb63049798dd0277cd9045eb00a16ab1228376b.tar.bz2
misskey-afb63049798dd0277cd9045eb00a16ab1228376b.zip
fix: regular expressions in word mutes (#8254)
* fix: handle regex exceptions for word mutes * add i18n strings Co-authored-by: rinsuki <428rinsuki+git@gmail.com> * stricter input validation in backend * add migration for hard mutes * fix * use correct regex library in migration * use query builder to avoid SQL injection Co-authored-by: Robin B <robflop98@outlook.com> Co-authored-by: rinsuki <428rinsuki+git@gmail.com>
Diffstat (limited to 'packages/backend/src/misc')
-rw-r--r--packages/backend/src/misc/check-word-mute.ts31
1 files changed, 18 insertions, 13 deletions
diff --git a/packages/backend/src/misc/check-word-mute.ts b/packages/backend/src/misc/check-word-mute.ts
index e2e871dd2b..dedda3cdf6 100644
--- a/packages/backend/src/misc/check-word-mute.ts
+++ b/packages/backend/src/misc/check-word-mute.ts
@@ -11,26 +11,31 @@ type UserLike = {
id: User['id'];
};
-export async function checkWordMute(note: NoteLike, me: UserLike | null | undefined, mutedWords: string[][]): Promise<boolean> {
+export async function checkWordMute(note: NoteLike, me: UserLike | null | undefined, mutedWords: Array<string | string[]>): Promise<boolean> {
// 自分自身
if (me && (note.userId === me.id)) return false;
- const words = mutedWords
- // Clean up
- .map(xs => xs.filter(x => x !== ''))
- .filter(xs => xs.length > 0);
-
- if (words.length > 0) {
+ if (mutedWords.length > 0) {
if (note.text == null) return false;
- const matched = words.some(and =>
- and.every(keyword => {
- const regexp = keyword.match(/^\/(.+)\/(.*)$/);
- if (regexp) {
+ const matched = mutedWords.some(filter => {
+ if (Array.isArray(filter)) {
+ return filter.every(keyword => note.text!.includes(keyword));
+ } else {
+ // represents RegExp
+ const regexp = filter.match(/^\/(.+)\/(.*)$/);
+
+ // This should never happen due to input sanitisation.
+ if (!regexp) return false;
+
+ try {
return new RE2(regexp[1], regexp[2]).test(note.text!);
+ } catch (err) {
+ // This should never happen due to input sanitisation.
+ return false;
}
- return note.text!.includes(keyword);
- }));
+ }
+ });
if (matched) return true;
}