4

我正在尝试nsICertificateDialogs用我自己的实现替换对话框。我已经有一个扩展来处理来自 webmail 的 smime 邮件。我希望能够将 Mozilla 证书存储与我的扩展一起使用。我发现导出 smime 证书/密钥(在我的扩展中使用它)的唯一可能性是通过导出 pfx 文件。

我从命令行调用 nsIX509CertDB.nsIX509CertDB 时取消了原始证书 teddialog 并按照此处所述注册了我的失败(取消注册旧工厂并使用正确的 contractID 注册我的)。当我打电话时,Cc[@mozilla.org/nsCertificateDialogs;1].getService(Ci.nsICertificateDialogs);我的班级被实例化。调用时certDB.importPKCS12File(null, certfile)我得到一个NS_ERROR_FAILURE并且我的对话框类没有被实例化。

FF 实例化证书对话框有什么区别。我该如何测试它?我错过了什么?

编辑:我的证书对话框类不会被 ff 实例化 - 即使使用有效令牌调用 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

4

1 回答 1

3

FF 实例化证书对话框有什么区别。

其实没有区别。当 Firefox 需要文件密码时,它会调用getNSSDialogs()函数,并且该函数会与您的调用等效getService()。但是,getService()仅在第一次实例化组件时,后续调用不会再次导致实例化 - 这可能是您看不到任何来自 Firefox 代码的原因的解释。

另一个潜在问题是您没有将任何令牌传递给函数。这意味着 Firefox 将尝试确定令牌本身并调用GetSlotWithMechanism(). 如果有多个可用令牌,它将显示一个选择对话框,它基本上会调用Cc["@mozilla.org/nsTokenDialogs;1"].getService(Ci.nsITokenDialogs).ChooseToken(). 所以它可能会出错,因为这个组件在你的 xpcshell 中不可用——这意味着你必须要么替换它,要么明确指定一个令牌。

于 2012-08-20T07:46:18.733 回答