如何从 Thunderbird WebExtension 执行/访问本地文件?
How to execute / access local file from Thunderbird WebExtension?
我喜欢编写一个加密内容的 Thunderbird 插件。为此,我已经从 compose window 中提取了所有数据。现在我必须将其保存到文件 和运行 本地可执行文件 以进行加密。但是我找不到在本地机器上保存文件和执行可执行文件的方法。我该怎么做?
我找到了 File and Directory Entries API 文档,但它似乎不起作用。在尝试使用以下代码获取对象时,我总是得到 undefined:
var filesystem = FileSystemEntry.filesystem;
console.log(filesystem); // --> undefined
至少,是否有一个可以工作的附加组件,我可以检查它是如何工作的,也许我必须在 manifest.json 中请求什么权限?
注意:必须跨平台工作(Windows 和 Linux)。
答案是,WebExtensions 目前无法执行本地文件。此外,也无法保存到磁盘上的某个本地文件夹。
相反,您需要向您的项目添加一些 WebExtension Experiment 并使用遗留 API。在那里你可以使用 IOUtils 和 FileUtils 扩展来达到你的目标:
执行一个文件:
在你的后台JS文件中:
var ret = await browser.experiment.execute("/usr/bin/executable", [ "-v" ]);
在实验中你可以这样执行:
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;
},
将附件保存到磁盘:
在您的后台 JS 文件中,您可以这样做:
var f = messenger.compose.getAttachmentFile(attachment.id)
var blob = await f.arrayBuffer();
var t = await browser.experiment.writeFileBinary(tempFile, blob);
在实验中你可以这样写文件:
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;
},
IOUtils 文档:
https://searchfox.org/mozilla-central/source/dom/chrome-webidl/IOUtils.webidl
FileUtils 文档:
https://searchfox.org/mozilla-central/source/toolkit/modules/FileUtils.jsm
我喜欢编写一个加密内容的 Thunderbird 插件。为此,我已经从 compose window 中提取了所有数据。现在我必须将其保存到文件 和运行 本地可执行文件 以进行加密。但是我找不到在本地机器上保存文件和执行可执行文件的方法。我该怎么做?
我找到了 File and Directory Entries API 文档,但它似乎不起作用。在尝试使用以下代码获取对象时,我总是得到 undefined:
var filesystem = FileSystemEntry.filesystem;
console.log(filesystem); // --> undefined
至少,是否有一个可以工作的附加组件,我可以检查它是如何工作的,也许我必须在 manifest.json 中请求什么权限?
注意:必须跨平台工作(Windows 和 Linux)。
答案是,WebExtensions 目前无法执行本地文件。此外,也无法保存到磁盘上的某个本地文件夹。
相反,您需要向您的项目添加一些 WebExtension Experiment 并使用遗留 API。在那里你可以使用 IOUtils 和 FileUtils 扩展来达到你的目标:
执行一个文件:
在你的后台JS文件中:
var ret = await browser.experiment.execute("/usr/bin/executable", [ "-v" ]);
在实验中你可以这样执行:
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;
},
将附件保存到磁盘:
在您的后台 JS 文件中,您可以这样做:
var f = messenger.compose.getAttachmentFile(attachment.id)
var blob = await f.arrayBuffer();
var t = await browser.experiment.writeFileBinary(tempFile, blob);
在实验中你可以这样写文件:
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;
},
IOUtils 文档:
https://searchfox.org/mozilla-central/source/dom/chrome-webidl/IOUtils.webidl
FileUtils 文档:
https://searchfox.org/mozilla-central/source/toolkit/modules/FileUtils.jsm