Injector v4.3.0: Added changelog, rewrote CSP Bypasser

pull/8/head
Oj18 4 years ago
parent 46e41702b8
commit 7b920178bc

@ -1,10 +1,11 @@
# GooseMod Changelog
## v4.3.0 [2020-10-29] UNRELEASED
## v4.3.0 [2020-10-29]
- ### Features
- Rewrote CSP Bypasser
- Added UserScript support in CSP Bypasser
- Added GooseMod changelog, it appears whenever GooseMod updates with the latest info from Injector repo's CHANGELOG.md
- Rewrote CSP Bypasser, it now uses the object's fetch function directly
- Added UserScript support in CSP Bypasser, thanks to [AAGaming](https://github.com/AAGaming00) for creating a UserScript for web
## v4.2.2

16
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

@ -10,6 +10,9 @@ import cspBypasser from './util/discord/cspBypasser';
import showToast from './ui/toast';
import confirmDialog from './ui/modals/confirm';
import * as Changelog from './ui/modals/changelog';
import * as GoosemodChangelog from './ui/goosemodChangelog';
import { startLoadingScreen, stopLoadingScreen, updateLoadingScreen, setThisScope as setThisScope1 } from './ui/loading';
import * as Settings from './ui/settings';
@ -31,7 +34,10 @@ const scopeSetterFncs = [
moduleStoreAPI.setThisScope,
cspBypasser.setThisScope,
easterEggs.setThisScope
easterEggs.setThisScope,
Changelog.setThisScope,
GoosemodChangelog.setThisScope
];
const importsToAssign = {
@ -68,7 +74,10 @@ const importsToAssign = {
cspBypasser,
showToast,
confirmDialog,
moduleStoreAPI
moduleStoreAPI,
changelog: Changelog,
goosemodChangelog: GoosemodChangelog
};
const init = async function () {
@ -101,8 +110,15 @@ const init = async function () {
this.modules = {};
this.disabledModules = {};
this.version = '4.2.2';
this.versionHash = '<hash>'; // hash of built final js file is inserted here via build script
this.lastVersion = localStorage.getItem('goosemodLastVersion');
this.version = '4.3.0';
this.versionHash = '<hash>'; // Hash of built final js file is inserted here via build script
if (this.lastVersion !== this.version) {
this.goosemodChangelog.show();
}
localStorage.setItem('goosemodLastVersion', this.version);
this.logger.debug('import.version.goosemod', `${this.version} (${this.versionHash})`);
@ -170,6 +186,8 @@ const init = async function () {
clearInterval(this.saveInterval);
clearInterval(this.checkSettingsOpenInterval);
localStorage.removeItem('goosemodLastVersion');
this.clearSettings();
this.moduleStoreAPI.jsCache.purgeCache();
@ -245,4 +263,5 @@ const init = async function () {
}
};
init.bind({})();
window.goosemod = {};
init.bind(window.goosemod)();

@ -17,7 +17,7 @@ export default {
jsCache: JSCache,
updateModules: async () => {
goosemodScope.moduleStoreAPI.modules = (await goosemodScope.cspBypasser.json(`${goosemodScope.moduleStoreAPI.apiBaseURL}/modules.json`, false)).sort((a, b) => a.name.localeCompare(b.name));
goosemodScope.moduleStoreAPI.modules = (await goosemodScope.cspBypasser.json(`${goosemodScope.moduleStoreAPI.apiBaseURL}/modules.json?_=${Date.now()}`, false)).sort((a, b) => a.name.localeCompare(b.name));
},
importModule: async (moduleName) => {

@ -22,7 +22,7 @@ export const getJSForModule = async (moduleName) => {
if (cache[moduleName] && moduleInfo.version === cache[moduleName].version) {
return cache[moduleName].js;
} else {
const js = await goosemodScope.cspBypasser.text(moduleInfo.codeURL, false);
const js = await goosemodScope.cspBypasser.text(`${moduleInfo.codeURL}?_=${Date.now()}`, false);
goosemodScope.moduleStoreAPI.jsCache.updateCache(moduleName, moduleInfo.version, js);

@ -0,0 +1,45 @@
import sleep from '../util/sleep';
const image = 'https://media.discordapp.net/attachments/756146058924392542/771374562184658944/2018-11-14-11-36-30-1200x800.png?width=853&height=569';
const changelogURL = 'https://goosemod-api.netlify.app/latestChangelogRelease.json';
let version, generated;
let goosemodScope = {};
export const setThisScope = (scope) => {
goosemodScope = scope;
};
export const show = async () => {
if (!generated) {
await generate();
}
goosemodScope.changelog.resetChangelog();
goosemodScope.changelog.setChangelog(generated);
goosemodScope.changelog.showChangelog();
await sleep(100);
document.querySelector('.modal-3O0aXp .title-3sZWYQ').textContent = `GooseMod ${version}`; // Set changelog modal title
document.querySelector('.modal-3O0aXp .footer-2gL1pp').remove(); // Remove footer of modal with social media
goosemodScope.changelog.resetChangelog();
};
export const generate = async () => {
const changelog = await goosemodScope.cspBypasser.json(changelogURL, false);
version = changelog.version;
generated = {
image,
date: changelog.date,
body: changelog.body
};
};

@ -0,0 +1,50 @@
let goosemodScope = {};
let showHideMod = {};
let originalChangelog = {};
export const setThisScope = (scope) => {
goosemodScope = scope;
showHideMod = goosemodScope.webpackModules.findByProps('showChangeLog');
const orig = goosemodScope.webpackModules.findByProps('changeLog').changeLog;
originalChangelog = {
body: orig.body,
image: orig.image,
date: orig.date
};
};
export const showChangelog = () => {
showHideMod.showChangeLog();
};
export const hideChangelog = () => {
showHideMod.hideChangeLog();
};
export const resetChangelog = () => {
let mod = goosemodScope.webpackModules.findByProps('changeLog');
mod.changeLog.body = originalChangelog.body;
mod.changeLog.image = originalChangelog.image;
mod.changeLog.date = originalChangelog.date;
}
export const setChangelog = ({body, image, date}) => {
let mod = goosemodScope.webpackModules.findByProps('changeLog');
if (body) {
mod.changeLog.body = body;
}
if (image) {
mod.changeLog.image = image;
}
if (date) {
mod.changeLog.date = date;
}
};

@ -1,113 +1,74 @@
let goosemodScope = {};
let noCSPFetch;
export default {
setThisScope: (scope) => {
goosemodScope = scope;
},
frame: document.createElement('object'),
noCSPFetch: undefined,
init: async () => {
goosemodScope.cspBypasser.frame.data = location.origin;
document.body.appendChild(goosemodScope.cspBypasser.frame);
let script = document.createElement('script');
script.type = 'text/javascript';
if (window.goosemod_noCSPFetch) {
noCSPFetch = window.goosemod_noCSPFetch;
let code = `
window.addEventListener('message', async (e) => {
const {url, type, useCORSProxy} = e.data;
if (!url) return;
delete window.goosemod_noCSPFetch;
const proxyURL = useCORSProxy ? \`https://cors-anywhere.herokuapp.com/\${url}\` : url;
return;
}
if (type === 'img') {
let canvas = document.createElement('canvas');
let ctx = canvas.getContext('2d');
let el = document.createElement('object');
let img = new Image();
img.src = proxyURL;
img.crossOrigin = 'anonymous';
el.data = location.origin;
document.body.appendChild(el);
img.onload = () => {
canvas.width = img.width;
canvas.height = img.height;
/*let script = document.createElement('script');
script.type = 'text/javascript';
ctx.drawImage(img, 0, 0);
let code = `
window.addEventListener('message', async (e) => {
const { url, type, useCORSProxy, useCache } = e.data;
e.source.postMessage({ verify: url, data: canvas.toDataURL("image/png") });
};
if (!url) return;
return;
}
const req = await fetch(proxyURL, {
cache: 'no-store'
});
const req = await fetch(url, {
cache: useCache ? 'default' : 'no-store'
});
e.source.postMessage({ verify: url, data: await req[type]() });
});`;
e.source.postMessage({ verify: url, data: await req[type]() });
});`;
script.appendChild(document.createTextNode(code));
goosemodScope.cspBypasser.frame.contentDocument.head.appendChild(script);
},
runCode: (code) => {
let script = document.createElement('script');
script.type = 'text/javascript';
script.appendChild(document.createTextNode(code));
goosemodScope.cspBypasser.frame.contentDocument.head.appendChild(script);*/
goosemodScope.cspBypasser.frame.contentDocument.head.appendChild(script);
noCSPFetch = el.contentWindow.fetch;
},
json: (url, useCORSProxy = true) => {
return new Promise((res) => {
goosemodScope.cspBypasser.frame.contentWindow.postMessage({url, type: 'json', useCORSProxy});
window.addEventListener('message', async (e) => {
if (e.data.verify !== url) return;
fetch: (url, type, useCORSProxy = true) => {
return new Promise(async (finalRes) => {
const sendURL = useCORSProxy ? `https://cors-anywhere.herokuapp.com/${url}` : url;
res(e.data.data);
});
});
},
const sendType = type === 'img' ? 'blob' : type;
text: (url, useCORSProxy = true) => {
return new Promise((res) => {
goosemodScope.cspBypasser.frame.contentWindow.postMessage({url, type: 'text', useCORSProxy});
const req = await noCSPFetch(sendURL);
const resp = await req[sendType]();
window.addEventListener('message', async (e) => {
if (e.data.verify !== url) return;
if (type === 'img') {
resp = URL.createObjectURL(resp);
}
res(e.data.data);
});
return finalRes(resp);
});
},
blob: (url, useCORSProxy = true) => {
return new Promise((res) => {
goosemodScope.cspBypasser.frame.contentWindow.postMessage({url, type: 'blob', useCORSProxy});
json: (url, useCORSProxy) => goosemodScope.cspBypasser.fetch(url, 'json', useCORSProxy),
window.addEventListener('message', async (e) => {
if (e.data.verify !== url) return;
text: (url, useCORSProxy) => goosemodScope.cspBypasser.fetch(url, 'text', useCORSProxy),
res(e.data.data);
});
});
},
image: (url, useCORSProxy = true) => {
return new Promise((res) => {
goosemodScope.cspBypasser.frame.contentWindow.postMessage({url, type: 'img', useCORSProxy});
window.addEventListener('message', async (e) => {
if (e.data.verify !== url) return;
blob: (url, useCORSProxy) => goosemodScope.cspBypasser.fetch(url, 'blob', useCORSProxy),
res(e.data.data);
});
});
},
image: (url, useCORSProxy) => goosemodScope.cspBypasser.fetch(url, 'img', useCORSProxy),
};
Loading…
Cancel
Save