From 68f7e1c1c019266db3fd8751b2a2ccc2682f957b Mon Sep 17 00:00:00 2001 From: xenos <66328734+xenos1337@users.noreply.github.com> Date: Tue, 17 Mar 2026 00:29:26 +0100 Subject: [PATCH] update for 1.24.4 --- inject.js | 84 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 76 insertions(+), 8 deletions(-) diff --git a/inject.js b/inject.js index a6f0016..3371eea 100644 --- a/inject.js +++ b/inject.js @@ -1,14 +1,11 @@ (function () { console.log("[PAGE-INJECT] Installing hooks in page context"); + // Properties to hook directly on accountStore (still exist as computed properties) const propertyHooks = { - isPaidUser: true, isLoggedIn: true, - userHasSubscription: true, userEmail: "hi@httptoolkit.com", mightBePaidUser: true, - isPastDueUser: false, - isStatusUnexpired: true, userSubscription: { state: "fulfilled", status: "active", @@ -25,12 +22,35 @@ }, }; + // Methods to hook on the user object (moved from accountStore properties to user methods in v3.1.0) + const userMethodHooks = { + isPaidUser: true, + isPastDueUser: false, + userHasSubscription: true, + }; + const hookedObjects = new WeakSet(); + const hookedUsers = new WeakSet(); + + // Patch user object methods + function patchUserObject(user) { + if (!user || typeof user !== "object" || hookedUsers.has(user)) return; + + for (const methodName of Object.keys(userMethodHooks)) { + if (typeof user[methodName] === "function") { + console.log("[PAGE-INJECT] Patching user." + methodName + "()"); + user[methodName] = function () { + return userMethodHooks[methodName]; + }; + } + } + + hookedUsers.add(user); + } // Override Object.defineProperty to intercept all property definitions const originalDefineProperty = Object.defineProperty; Object.defineProperty = function (target, prop, descriptor) { - // Intercept our target properties if (prop in propertyHooks) { console.log("[PAGE-INJECT] Intercepting defineProperty for: " + prop); @@ -47,6 +67,22 @@ } } + // Intercept the 'user' property to patch its methods when it's set/accessed + if (prop === "user") { + console.log("[PAGE-INJECT] Intercepting defineProperty for: user"); + + if (descriptor && descriptor.get) { + const originalGetter = descriptor.get; + descriptor.get = function () { + const user = originalGetter.call(this); + if (user) patchUserObject(user); + return user; + }; + } else if (descriptor && descriptor.value !== undefined && descriptor.value) { + patchUserObject(descriptor.value); + } + } + return originalDefineProperty.call(this, target, prop, descriptor); }; @@ -67,6 +103,20 @@ props[prop].value = propertyHooks[prop]; } } + + if (prop === "user") { + console.log("[PAGE-INJECT] Intercepting defineProperties for: user"); + if (props[prop].get) { + const originalGetter = props[prop].get; + props[prop].get = function () { + const user = originalGetter.call(this); + if (user) patchUserObject(user); + return user; + }; + } else if (props[prop].value !== undefined && props[prop].value) { + patchUserObject(props[prop].value); + } + } } return originalDefineProperties.call(this, target, props); }; @@ -80,6 +130,7 @@ if (!obj || hookedObjects.has(obj)) return; try { + // Patch direct property hooks Object.keys(propertyHooks).forEach(prop => { try { const desc = Object.getOwnPropertyDescriptor(obj, prop); @@ -88,7 +139,7 @@ if (desc.get) { const originalGetter = desc.get; - Object.defineProperty(obj, prop, { + originalDefineProperty(obj, prop, { get: function () { const originalValue = originalGetter.call(this); console.log("[PAGE-INJECT] " + prop + " getter intercepted, original=" + originalValue + ", returning=" + JSON.stringify(propertyHooks[prop])); @@ -108,6 +159,14 @@ } }); + // Patch user object if present + try { + if (obj.user && typeof obj.user === "object") { + console.log("[PAGE-INJECT] Found user object on object #" + idx + ", patching methods..."); + patchUserObject(obj.user); + } + } catch (e) {} + hookedObjects.add(obj); } catch (e) { // Ignore object access errors @@ -128,7 +187,7 @@ const desc = Object.getOwnPropertyDescriptor(store, prop); if (desc && desc.configurable && desc.get) { const originalGetter = desc.get; - Object.defineProperty(store, prop, { + originalDefineProperty(store, prop, { get: function () { const originalValue = originalGetter.call(this); console.log("[PAGE-INJECT] accountStore." + prop + " intercepted, original=" + originalValue + ", returning=" + JSON.stringify(propertyHooks[prop])); @@ -141,6 +200,15 @@ } } catch (e) {} }); + + // Patch user methods on the store + try { + if (store.user && typeof store.user === "object") { + console.log("[PAGE-INJECT] Found user object in accountStore, patching methods..."); + patchUserObject(store.user); + } + } catch (e) {} + hookedObjects.add(store); } } @@ -160,7 +228,7 @@ if (scanCount >= 50) { clearInterval(scanInterval); - console.log("[PAGE-INJECT] Stopped periodic scanning after 10 attempts"); + console.log("[PAGE-INJECT] Stopped periodic scanning after 50 attempts"); } }, 100);