diff --git a/src/server/Privilege.ts b/src/server/Privilege.ts index 26fefc0da..ab06a48aa 100644 --- a/src/server/Privilege.ts +++ b/src/server/Privilege.ts @@ -84,7 +84,9 @@ export function createMatcher(bannedWords: string[]): RegExpMatcher { }); return { hasMatch: (input: string) => - substringMatcher.hasMatch(input) || collapseMatcher.hasMatch(input), + input.toLowerCase().includes("kkk") || + substringMatcher.hasMatch(input) || + collapseMatcher.hasMatch(input), getAllMatches: (input: string, sorted?: boolean) => [ ...substringMatcher.getAllMatches(input, sorted), ...collapseMatcher.getAllMatches(input, sorted), @@ -118,7 +120,9 @@ function censorUsernameWithMatcher( ? username.replace(`[${clanTag}]`, "").trim() : username; - const clanTagIsProfane = clanTag ? matcher.hasMatch(clanTag) : false; + const clanTagIsProfane = clanTag + ? matcher.hasMatch(clanTag) || clanTag.toLowerCase() === "ss" + : false; const usernameIsProfane = matcher.hasMatch(nameWithoutClan); const censoredName = usernameIsProfane diff --git a/tests/Privilege.test.ts b/tests/Privilege.test.ts index dbf471871..bedfc797b 100644 --- a/tests/Privilege.test.ts +++ b/tests/Privilege.test.ts @@ -131,6 +131,13 @@ describe("UsernameCensor", () => { // "snigger" is whitelisted in englishDataset expect(matcher.hasMatch("snigger")).toBe(false); }); + + test("catches kkk as substring", () => { + expect(matcher.hasMatch("kkk")).toBe(true); + expect(matcher.hasMatch("KKK")).toBe(true); + expect(matcher.hasMatch("kkklover")).toBe(true); + expect(matcher.hasMatch("ilovekkkboys")).toBe(true); + }); }); describe("censorUsername", () => { @@ -186,6 +193,15 @@ describe("UsernameCensor", () => { expect(checker.censorUsername("[NAZI]CoolPlayer")).toBe("CoolPlayer"); }); + test("removes [SS] clan tag", () => { + expect(checker.censorUsername("[SS]Player")).toBe("Player"); + expect(checker.censorUsername("[ss]Player")).toBe("Player"); + }); + + test("removes [KKK] clan tag", () => { + expect(checker.censorUsername("[KKK]Player")).toBe("Player"); + }); + test("keeps clean clan tag when username is clean", () => { expect(checker.censorUsername("[COOL]Player")).toBe("[COOL] Player"); expect(checker.censorUsername("[PRO]Player")).toBe("[PRO] Player");