From e2a05a77eef57d5eeea7204e93941278c4ed3340 Mon Sep 17 00:00:00 2001 From: pylixonly <82711525+pylixonly@users.noreply.github.com> Date: Wed, 19 Feb 2025 21:20:44 +0800 Subject: [PATCH] fix(metro): Blacklist IntlMessagesProxy exports Blacklist an evil module that always returns a function. More info: https://github.com/discord/discord-intl/commit/7f721c2bdbf3e2a1768f175a4691b4a204ee71f7 --- src/lib/utils/lazy.ts | 6 ++++-- src/metro/internals/caches.ts | 4 ++-- src/metro/internals/modules.ts | 3 ++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/lib/utils/lazy.ts b/src/lib/utils/lazy.ts index 1496f41..0e2867f 100644 --- a/src/lib/utils/lazy.ts +++ b/src/lib/utils/lazy.ts @@ -41,6 +41,8 @@ const lazyHandler: ProxyHandler = { return Reflect.has(resolved, p); }, get(target, p, receiver) { + if (__DEV__ && p === "__IS_BUNNY_LAZY_PROXY__") return true; + const contextHolder = proxyContextHolder.get(target); if (contextHolder?.options) { @@ -62,12 +64,12 @@ const lazyHandler: ProxyHandler = { return cacheKeys; }, getOwnPropertyDescriptor: (target, p) => { + if (isUnconfigurable(p)) return Reflect.getOwnPropertyDescriptor(target, p); + const contextHolder = proxyContextHolder.get(target); const resolved = contextHolder?.factory(); if (!resolved) throw new Error(`Trying to getOwnPropertyDescriptor of ${typeof resolved}`); - if (isUnconfigurable(p)) return Reflect.getOwnPropertyDescriptor(target, p); - const descriptor = Reflect.getOwnPropertyDescriptor(resolved, p); if (descriptor) Object.defineProperty(target, p, descriptor); return descriptor; diff --git a/src/metro/internals/caches.ts b/src/metro/internals/caches.ts index 81adee3..34ed45c 100644 --- a/src/metro/internals/caches.ts +++ b/src/metro/internals/caches.ts @@ -4,7 +4,7 @@ import { debounce } from "es-toolkit"; import { ModuleFlags, ModulesMapInternal } from "./enums"; -const CACHE_VERSION = 100; +const CACHE_VERSION = 102; const BUNNY_METRO_CACHE_PATH = "caches/metro_modules.json"; type ModulesMap = { @@ -13,7 +13,7 @@ type ModulesMap = { let _metroCache = null as unknown as ReturnType; -export const getMetroCache = window.__getMetroCache = () => _metroCache; +export const getMetroCache = () => _metroCache; function buildInitCache() { const cache = { diff --git a/src/metro/internals/modules.ts b/src/metro/internals/modules.ts index 357b849..e764502 100644 --- a/src/metro/internals/modules.ts +++ b/src/metro/internals/modules.ts @@ -76,7 +76,8 @@ function isBadExports(exports: any) { return !exports || exports === window || exports[""] === null - || (exports.__proto__ === Object.prototype && Reflect.ownKeys(exports).length === 0); + || (exports.__proto__ === Object.prototype && Reflect.ownKeys(exports).length === 0) + || (exports.default?.[Symbol.toStringTag] === "IntlMessagesProxy"); } function onModuleRequire(moduleExports: any, id: Metro.ModuleID) {