Me gusta escribir un complemento de Thunderbird que cifre cosas. Para esto, ya extraje todos los datos de la ventana de redacción. Ahora tengo que guardar esto en archivos y ejecutar un ejecutable local para el cifrado. Pero no encontré forma de guardar los archivos y ejecutar un ejecutable en la máquina local. ¿Cómo puedo hacer eso?
Encontré la documentación de la API de entradas de archivos y directorios , pero parece que no funciona. Siempre me queda indefinido al intentar obtener el objeto con este código:
var filesystem = FileSystemEntry.filesystem; console.log(filesystem); // --> undefinedAl menos, ¿hay un complemento que funcione que pueda examinar para averiguar cómo funciona y quizás qué permisos debo solicitar en manifest.json?
NOTA: Debe funcionar multiplataforma (Windows y Linux).
La respuesta es que WebExtensions actualmente no puede ejecutar archivos locales. Además, tampoco es posible guardar en alguna carpeta local del disco.
En su lugar, debe agregar algún Experimento de WebExtension a su proyecto y allí usar las API heredadas. Allí puede usar las extensiones IOUtils y FileUtils para alcanzar su objetivo:
Ejecutar un archivo:
En su archivo JS de fondo:
var ret = await browser.experiment.execute("/usr/bin/executable", [ "-v" ]);En el experimento puedes ejecutar así:
var { ExtensionCommon } = ChromeUtils.import("resource://gre/modules/ExtensionCommon.jsm"); var { FileUtils } = ChromeUtils.import("resource://gre/modules/FileUtils.jsm"); var { XPCOMUtils } = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm"); XPCOMUtils.defineLazyGlobalGetters(this, ["IOUtils"); async execute(executable, arrParams) { var fileExists = await IOUtils.exists(executable); if (!fileExists) { Services.wm.getMostRecentWindow("mail:3pane") .alert("Executable [" + executable + "] not found!"); return false; } var progPath = new FileUtils.File(executable); let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess); process.init(progPath); process.startHidden = false; process.noShell = true; process.run(true, arrParams, arrParams.length); return true; },Guardar un archivo adjunto en el disco:
En su archivo JS de fondo, puede hacer esto:
var f = messenger.compose.getAttachmentFile(attachment.id) var blob = await f.arrayBuffer(); var t = await browser.experiment.writeFileBinary(tempFile, blob);En el experimento, puede escribir el archivo de esta manera:
async writeFileBinary(filename, data) { // first we need to convert the arrayBuffer to some Uint8Array var uint8 = new Uint8Array(data); uint8.reduce((binary, uint8) => binary + uint8.toString(2), ""); // then we can save it var ret = await IOUtils.write(filename, uint8); return ret; },Documentación de IOUtils :
https://searchfox.org/mozilla-central/source/dom/chrome-webidl/IOUtils.webidl
Documentación de FileUtils :
https://searchfox.org/mozilla-central/source/toolkit/modules/FileUtils.jsm