javascript - 从 firefox 扩展替换 nsICertificateDialogs

标签 javascript firefox-addon certificate xpcom nss

我正在尝试用我自己的实现替换 nsICertificateDialogs 对话框。我已经有一个扩展程序可以处理来自网络邮件的 smime 邮件。我希望能够在我的扩展中使用 Mozilla 证书商店。我发现导出 smime 证书/ key (在我的扩展中使用它)的唯一可能性是通过导出 pfx 文件。

我注销了原始的 certifica tedialog 并按照此处所述注册了我的 Failure while calling nsIX509CertDB.nsIX509CertDB from command line (取消注册旧工厂并使用正确的 contractID 注册我的)。当我调用 Cc[@mozilla.org/nsCertificateDialogs;1].getService(Ci.nsICertificateDialogs); 时,我的类被实例化了。调用 certDB.importPKCS12File(null, certfile) 时,我得到一个 NS_ERROR_FAILURE 并且我的对话框类没有被实例化。

FF实例化证书对话框有什么区别。我怎样才能测试它?我错过了什么?

编辑:我的证书对话框类不会被 ff 实例化 - 即使使用有效 token certDB.importPKCS12File(token, certfile) 调用时也是如此;在更改调用 var certdialogInterface = Cc[sMimeCertificateDialog.mozillaContractID] .getService(Ci.nsICertificateDialogs);正确实例化我的类(随后是一些 QueryInterface 调用)

编辑:我上传了一个(希望)简单的复制器到http://www.sodgeit.de/dialog_reproducer.zip查看 src/chrome/components/smime_certificate_dialog.js 和 src/tests/smime_certificate_dialog_test.js

最佳答案

What is the difference when FF instantiates the certificate dialog.

实际上没有区别。当 Firefox 需要文件密码时,它将 call getNSSDialogs() function那一个就可以了the moral equivalent of your getService() call .但是,getService() 仅在第一次实例化组件,后续调用不会导致再次实例化 - 这可能是您看不到任何来自 Firefox 代码的原因。

另一个潜在的问题是您没有将任何 token 传递给该函数。这意味着 Firefox 将 try to determine the token itself并调用GetSlotWithMechanism() .如果有多个可用 token ,它将显示一个选择对话框,它基本上会调用 Cc["@mozilla.org/nsTokenDialogs;1"].getService(Ci.nsITokenDialogs).ChooseToken()。因此,它可能会出错,因为该组件在您的 xpcshell 中不可用——这意味着您也必须替换它或明确指定一个标记。

关于javascript - 从 firefox 扩展替换 nsICertificateDialogs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11988107/

相关文章:

javascript - 检查 <form> 文本元素是否为空

javascript - 在具有循环依赖的大对象上调用 JSON.stringify 时出现 "too much recursion"错误

ios - 是否可以在测试的iPhone上安装我的App

ubuntu - Nginx/Certbot - 来自域/.well-known 的无效响应

javascript - 如何在 d3.js 中从上到下更改 X 轴线

javascript - 使用 Node Passport 和 Google Auth 限制登录到特定域

javascript - 从制表器中的 json 加载数据?

javascript - 引用错误 : browser is not defined

javascript - 火狐插件 : Access Variable in other File

android - 在 Android 上以编程方式安装/访问 VPN/WIFI 证书