Injector v3.1.0: Hash checking for Module Store, minor fixes, code cleanup (see changelog)

pull/8/head
Oj18 4 years ago
parent c7da6d6967
commit 19197b19ef

@ -1,5 +1,19 @@
# GooseMod Changelog
## v3.1.0
- ### Features
- Added hash checking to Module Store for each module
- ### Fixes
- Fixed local module importing being broken
- Fixed reinjecting after being removed in the past not working and still thinking it had been removed
- ### Backend
- Sleep and ab2str specific util JS files / imports as they are used through out (more than once)
- Cleaned up some code when initially loading
## v3.0.1
- ### Tweaks

32
dist/index.js vendored

File diff suppressed because one or more lines are too long

2
dist/index.js.map vendored

File diff suppressed because one or more lines are too long

@ -1,52 +1,32 @@
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
globalThis.modules = {};
globalThis.disabledModules = {};
import sleep from './util/sleep';
import * as Logger from './util/logger';
globalThis.logger = Logger;
globalThis.version = '3.0.1';
globalThis.versionHash = '<hash>';
globalThis.logger.debug('import.version.goosemod', `${globalThis.version} (${globalThis.versionHash})`);
if (window.DiscordNative !== undefined) globalThis.logger.debug('import.version.discord', `${DiscordNative.app.getReleaseChannel()} ${DiscordNative.app.getVersion()}`);
if (window.gmUntethered) {
globalThis.untetheredVersion = window.gmUntethered.slice();
// delete window.gmUntethered;
}
import WebpackModules from './util/discord/webpackModules';
globalThis.webpackModules = WebpackModules;
import fixLocalStorage from './util/discord/fixLocalStorage';
fixLocalStorage();
import cspBypasser from './util/discord/cspBypasser';
import showToast from './ui/toast';
globalThis.showToast = showToast;
import confirmDialog from './ui/modals/confirm';
globalThis.showToast(`GooseMod v${globalThis.version} (${globalThis.versionHash.substring(0, 7)})`, {timeout: 1000});
import { startLoadingScreen, stopLoadingScreen, updateLoadingScreen } from './ui/loading';
import { removeModuleUI, isSettingsOpen, closeSettings, openSettings, openSettingItem, reopenSettings, injectInSettings, checkSettingsOpenInterval } from './ui/settings';
import easterEggs from './ui/easterEggs';
globalThis.messageEasterEggs = easterEggs;
import confirmDialog from './ui/modals/confirm';
globalThis.confirmDialog = confirmDialog;
import { importModule, importModules, bindHandlers, getModuleFiles, importModulesFull } from './moduleManager';
import { saveModuleSettings, clearModuleSetting, clearSettings, loadSavedModuleSetting, loadSavedModuleSettings } from './moduleSettingsStore';
import moduleStoreAPI from './moduleStore';
globalThis.messageEasterEggs.interval = setInterval(globalThis.messageEasterEggs.check, 1000);
import { startLoadingScreen, stopLoadingScreen, updateLoadingScreen } from './ui/loading';
Object.assign(globalThis, {
const importsToAssign = {
startLoadingScreen,
stopLoadingScreen,
updateLoadingScreen
});
updateLoadingScreen,
import { removeModuleUI, isSettingsOpen, closeSettings, openSettings, openSettingItem, reopenSettings, injectInSettings, checkSettingsOpenInterval } from './ui/settings';
Object.assign(globalThis, {
removeModuleUI,
isSettingsOpen,
closeSettings,
@ -54,115 +34,189 @@ Object.assign(globalThis, {
openSettingItem,
reopenSettings,
injectInSettings,
checkSettingsOpenInterval
});
import cspBypasser from './util/discord/cspBypasser';
globalThis.cspBypasser = cspBypasser;
checkSettingsOpenInterval,
globalThis.cspBypasser.init();
console.log('pass 6');
import { importModule, importModules, bindHandlers, getModuleFiles, importModulesFull } from './moduleManager';
Object.assign(globalThis, {
importModule,
importModules,
bindHandlers,
getModuleFiles,
importModulesFull
});
importModulesFull,
import { saveModuleSettings, clearModuleSetting, clearSettings, loadSavedModuleSetting, loadSavedModuleSettings } from './moduleSettingsStore';
Object.assign(globalThis, {
saveModuleSettings,
clearModuleSetting,
clearSettings,
loadSavedModuleSetting,
loadSavedModuleSettings
});
loadSavedModuleSettings,
import moduleStoreAPI from './moduleStore';
globalThis.moduleStoreAPI = moduleStoreAPI;
webpackModules: WebpackModules,
messageEasterEggs: easterEggs,
logger: Logger,
cspBypasser,
showToast,
confirmDialog,
moduleStoreAPI
};
globalThis.saveInterval = setInterval(globalThis.saveModuleSettings, 3000);
const init = async function () {
/*for (let p in toAssign) {
if (toAssign.hasOwnProperty(p)) {
}
}*/
globalThis.remove = () => {
clearInterval(globalThis.messageEasterEggs.interval);
clearInterval(globalThis.saveInterval);
clearInterval(globalThis.injectInSettings);
Object.assign(globalThis, importsToAssign);
globalThis.clearSettings();
globalThis.moduleStoreAPI.jsCache.purgeCache();
// globalThis.logger = Logger;
globalThis.removed = true;
globalThis.removed = false;
for (let p in globalThis.modules) {
if (globalThis.modules.hasOwnProperty(p) && globalThis.modules[p].remove !== undefined) {
globalThis.modules[p].remove();
}
}
};
globalThis.modules = {};
globalThis.disabledModules = {};
const init = async () => {
globalThis.startLoadingScreen();
globalThis.version = '3.1.0';
globalThis.versionHash = '<hash>'; // hash of built final js file is inserted here via build script
globalThis.updateLoadingScreen('Getting module index from Module Store...');
globalThis.logger.debug('import.version.goosemod', `${globalThis.version} (${globalThis.versionHash})`);
if (window.DiscordNative !== undefined) globalThis.logger.debug('import.version.discord', `${DiscordNative.app.getReleaseChannel()} ${DiscordNative.app.getVersion()}`);
if (window.gmUntethered) {
globalThis.untetheredVersion = window.gmUntethered.slice();
// delete window.gmUntethered;
}
// globalThis.webpackModules = WebpackModules;
fixLocalStorage();
// globalThis.showToast = showToast;
globalThis.showToast(`GooseMod v${globalThis.version} (${globalThis.versionHash.substring(0, 7)})`, {timeout: 1000});
// globalThis.messageEasterEggs = easterEggs;
// globalThis.confirmDialog = confirmDialog;
globalThis.messageEasterEggs.interval = setInterval(globalThis.messageEasterEggs.check, 1000);
/* Object.assign(globalThis, {
startLoadingScreen,
stopLoadingScreen,
updateLoadingScreen
});
Object.assign(globalThis, {
removeModuleUI,
isSettingsOpen,
closeSettings,
openSettings,
openSettingItem,
reopenSettings,
injectInSettings,
checkSettingsOpenInterval
});
globalThis.cspBypasser = cspBypasser; */
globalThis.cspBypasser.init();
/* Object.assign(globalThis, {
importModule,
importModules,
bindHandlers,
getModuleFiles,
importModulesFull
});
Object.assign(globalThis, {
saveModuleSettings,
clearModuleSetting,
clearSettings,
loadSavedModuleSetting,
loadSavedModuleSettings
});
globalThis.moduleStoreAPI = moduleStoreAPI; */
globalThis.saveInterval = setInterval(globalThis.saveModuleSettings, 3000);
globalThis.remove = () => {
clearInterval(globalThis.messageEasterEggs.interval);
clearInterval(globalThis.saveInterval);
clearInterval(globalThis.injectInSettings);
globalThis.clearSettings();
globalThis.moduleStoreAPI.jsCache.purgeCache();
globalThis.removed = true;
for (let p in globalThis.modules) {
if (globalThis.modules.hasOwnProperty(p) && globalThis.modules[p].remove !== undefined) {
globalThis.modules[p].remove();
}
}
};
globalThis.startLoadingScreen();
globalThis.updateLoadingScreen('Getting module index from Module Store...');
await globalThis.moduleStoreAPI.updateModules();
globalThis.moduleStoreAPI.updateStoreSetting();
globalThis.initialImport = true;
let toInstallModules = Object.keys(JSON.parse(localStorage.getItem('goosemodModules')) || {});
let toInstallIsDefault = false;
if (toInstallModules.length === 0) {
toInstallIsDefault = true;
toInstallModules = ['hardcodedColorFixer', 'draculaTheme', 'fucklytics', 'visualTweaks', 'wysiwygMessages', 'customSounds', 'devMode', 'twitchEmotes', 'noMessageDeletion'];
}
toInstallModules = toInstallModules.filter((m) => globalThis.moduleStoreAPI.modules.find((x) => x.filename === m) !== undefined);
let themeModule = toInstallModules.find((x) => x.toLowerCase().includes('theme'));
if (themeModule) {
toInstallModules.unshift(toInstallModules.splice(toInstallModules.indexOf(themeModule), 1)[0]);
}
let hardcodedColorFixerModule = toInstallModules.find((x) => x === 'hardcodedColorFixer');
if (hardcodedColorFixerModule) {
toInstallModules.unshift(toInstallModules.splice(toInstallModules.indexOf(hardcodedColorFixerModule), 1)[0]);
}
globalThis.updateLoadingScreen(`Importing default modules from Module Store... (${toInstallIsDefault ? '(Default)' : '(Last Installed)'})`);
for (let m of toInstallModules) {
globalThis.updateLoadingScreen(`${globalThis.moduleStoreAPI.modules.find((x) => x.filename === m).name} - ${toInstallModules.indexOf(m) + 1}/${toInstallModules.length}`)
//globalThis.updateLoadingScreen(`Importing default modules from Module Store...<br><br>${globalThis.moduleStoreAPI.modules.find((x) => x.filename === m).name}<br>${toInstallModules.indexOf(m) + 1}/${toInstallModules.length}<br>${toInstallIsDefault ? '(Default)' : '(Last Installed)'}`);
await globalThis.moduleStoreAPI.importModule(m);
}
delete globalThis.initialImport;
globalThis.updateLoadingScreen(`Loading saved module settings...`);
await globalThis.loadSavedModuleSettings();
globalThis.stopLoadingScreen();
if (globalThis.isSettingsOpen()) { // If settings are open, reopen to inject new GooseMod options
globalThis.reopenSettings();
} else {
// Only open settings (when not already open) if new user
if (!localStorage.getItem('goosemodModules')) {
globalThis.openSettings();
await sleep(200);
globalThis.openSettingItem('Module Store');
}
}

@ -1,6 +1,4 @@
const ab2str = (buf) => { // ArrayBuffer (UTF-8) -> String
return String.fromCharCode.apply(null, new Uint8Array(buf));
};
import ab2str from './util/ab2str';
export const importModule = async (f) => {
let field = f.filename.split('.').slice(0, -1).join('.'); // Get name of module via filename (taking away the file extension)

@ -1,3 +1,5 @@
import { sha512 } from '../util/hash';
export default {
modules: [],
@ -14,6 +16,14 @@ export default {
const jsCode = await globalThis.moduleStoreAPI.jsCache.getJSForModule(moduleName);
const calculatedHash = await sha512(jsCode);
if (calculatedHash !== moduleInfo.hash) {
globalThis.showToast(`Cancelled importing of ${moduleName} due to hash mismatch`, {timeout: 1000});
console.warn('Hash mismatch', calculatedHash, moduleInfo.hash);
return;
}
await globalThis.importModule({
filename: `${moduleInfo.filename}.js`,
data: jsCode

@ -1,4 +1,5 @@
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
import sleep from '../util/sleep';
import ab2str from '../util/ab2str';
export const removeModuleUI = (field, where) => {
let settingItem = globalThis.settings.items.find((x) => x[1] === 'Manage Modules');

@ -0,0 +1,3 @@
export default (buf) => { // ArrayBuffer (UTF-8) -> String
return String.fromCharCode.apply(null, new Uint8Array(buf));
};

@ -1,5 +1,3 @@
export const debug = (region, ...args) => {
let parentRegion = region.split('.')[0];
console.log(`%cGooseMod%c %c${region}`, 'border: 1px solid white; padding: 2px; background-color: black; color: white', 'background-color: none', `border: 1px solid white; padding: 2px; background-color: ${(globalThis.modules[parentRegion] && globalThis.modules[parentRegion].logRegionColor) || 'rgb(100, 0, 0)'}; color: white`, ...(args));
console.log(`%cGooseMod%c %c${region}`, 'border: 1px solid white; padding: 2px; background-color: black; color: white', 'background-color: none', `border: 1px solid white; padding: 2px; background-color: rgb(100, 0, 0); color: white`, ...(args));
};

@ -0,0 +1 @@
export default (ms) => new Promise(resolve => setTimeout(resolve, ms));
Loading…
Cancel
Save