diff --git a/src/app/utils/consolePasteScamWarning.ts b/src/app/utils/consolePasteScamWarning.ts new file mode 100644 index 000000000..72d750e28 --- /dev/null +++ b/src/app/utils/consolePasteScamWarning.ts @@ -0,0 +1,58 @@ +// This is probably not very accurate, but doesn't really matter I suppose +function isDockedDevtoolsLikely(): boolean { + const gapW = window.outerWidth - window.innerWidth; + const gapH = window.outerHeight - window.innerHeight; + const threshold = 160; + return gapW >= threshold || gapH >= threshold; +} + +export function installConsolePasteScamWarning(): void { + const BANNER_STYLE = + 'font-size:56px;font-weight:900;color:#ff0033;background:#1a0006;padding:16px 24px;border:6px solid #ff0033;line-height:1.1;'; + const BODY_STYLE = + 'font-size:22px;font-weight:700;color:#ffb3c1;background:#120008;padding:14px 20px;line-height:1.35;max-width:920px;'; + const CONTRIBUTE_STYLE = + 'font-size:18px;font-weight:600;color:#a8d4ff;background:#0a1520;padding:12px 20px;line-height:1.35;max-width:920px;'; + + const spamWarnings = () => { + const repeat = 15; + const betweenPairsMs = 300; + + const emitPair = (index: number) => { + console.warn('%cSTOP', BANNER_STYLE); + console.warn( + '%cIf anyone told you to paste code or text here, you are being scammed. Close this window, do not paste anything, and report their account.', + BODY_STYLE + ); + if (index + 1 < repeat) { + window.setTimeout(() => { + emitPair(index + 1); + }, betweenPairsMs); + } else { + window.setTimeout(() => { + console.warn( + "%cIf you know what you're doing, check out our GitHub and contribute: https://github.com/SableClient/Sable", + CONTRIBUTE_STYLE + ); + }, betweenPairsMs); + } + }; + + emitPair(0); + }; + + let devtoolsWasOpen = false; + + const check = () => { + const devtoolsLikelyOpen = isDockedDevtoolsLikely(); + if (devtoolsLikelyOpen && !devtoolsWasOpen) { + spamWarnings(); + } + devtoolsWasOpen = devtoolsLikelyOpen; + }; + + window.setInterval(check, 1500); + window.addEventListener('resize', () => queueMicrotask(check)); + + queueMicrotask(check); +} diff --git a/src/index.tsx b/src/index.tsx index 4f6dfb004..1721755d5 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -22,8 +22,10 @@ import type { Sessions } from './app/state/sessions'; import { getFallbackSession, MATRIX_SESSIONS_KEY, ACTIVE_SESSION_KEY } from './app/state/sessions'; import { createLogger } from './app/utils/debug'; import { getLocalStorageItem } from './app/state/utils/atomWithLocalStorage'; +import { installConsolePasteScamWarning } from './app/utils/consolePasteScamWarning'; enableMapSet(); +installConsolePasteScamWarning(); const log = createLogger('index'); document.body.classList.add(configClass, varsClass);