如何从 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。在那里你可以使用 IOUtilsFileUtils 扩展来达到你的目标:

执行一个文件:

在你的后台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