From 8601193b51f799cc04f3fd66acd97ff90d761087 Mon Sep 17 00:00:00 2001 From: Zack Rauen Date: Mon, 26 Sep 2022 03:01:16 -0400 Subject: [PATCH] Use remote vm for better error messages --- preload/src/api/index.js | 1 + preload/src/api/vm.js | 14 ++++++++++++++ renderer/src/modules/pluginmanager.js | 2 +- renderer/src/polyfill/vm.js | 10 ++++++++-- 4 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 preload/src/api/vm.js diff --git a/preload/src/api/index.js b/preload/src/api/index.js index 5089d87e..c5bc23aa 100644 --- a/preload/src/api/index.js +++ b/preload/src/api/index.js @@ -36,6 +36,7 @@ export * as filesystem from "./filesystem"; export {default as https} from "./https"; export * as electron from "./electron"; export * as crypto from "./crypto"; +export * as vm from "./vm"; // We can expose that without any issues. export * as path from "path"; diff --git a/preload/src/api/vm.js b/preload/src/api/vm.js new file mode 100644 index 00000000..8c62639d --- /dev/null +++ b/preload/src/api/vm.js @@ -0,0 +1,14 @@ +import vm from "vm"; + +export function compileFunction(code, params = [], options = {}) { + try { + return vm.compileFunction(code, params, options); + } + catch (error) { + return { + name: error.name, + message: error.message, + stack: error.stack + }; + } +} \ No newline at end of file diff --git a/renderer/src/modules/pluginmanager.js b/renderer/src/modules/pluginmanager.js index ba823404..451938f4 100644 --- a/renderer/src/modules/pluginmanager.js +++ b/renderer/src/modules/pluginmanager.js @@ -117,7 +117,7 @@ export default new class PluginManager extends AddonManager { try { const module = {filename, exports: {}}; // Test if the code is valid gracefully - vm.compileFunction(addon.fileContent, ["require", "module", "exports", "__filename", "__dirname"]); + vm.compileFunction(addon.fileContent, ["require", "module", "exports", "__filename", "__dirname"], {filename: path.basename(filename)}); addon.fileContent += normalizeExports(addon.exports || addon.name); addon.fileContent += `\n//# sourceURL=betterdiscord://plugins/${addon.filename}`; const wrappedPlugin = new Function(["require", "module", "exports", "__filename", "__dirname"], addon.fileContent); // eslint-disable-line no-new-func diff --git a/renderer/src/polyfill/vm.js b/renderer/src/polyfill/vm.js index 0fdbbe6d..bc89f797 100644 --- a/renderer/src/polyfill/vm.js +++ b/renderer/src/polyfill/vm.js @@ -1,3 +1,9 @@ -export const compileFunction = function (code, params = [], filename = "") { - return window.eval(`(${params.join(", ")}) => {${code}//# sourceURL=${filename.replace(/\\/g, "\\")}\n}`); // eslint-disable-line no-eval +import Remote from "./remote"; + +export const compileFunction = function(code, params = [], options = {}) { + const returned = Remote.vm.compileFunction(code, params, options); + if (typeof(returned) === "function") return returned; + const syntaxError = new SyntaxError(returned.message); + syntaxError.stack = returned.stack; + throw syntaxError; }; \ No newline at end of file