我正在尝试用我自己的实现替换nsICertificateDialogs
对话框。我已经有一个扩展程序来处理来自网络邮件的短信。我希望能够在我的扩展中使用 Mozilla 证书存储。我发现导出 smime 证书/密钥(在我的扩展中使用它)的唯一可能性是通过导出 pfx 文件。
我取消注册了原始证书对话框并注册了我的,如此处所述 从命令行调用 nsIX509CertDB.nsIX509CertDB 时失败(取消注册旧工厂并使用正确的 contractID 注册我的)。当我调用Cc[@mozilla.org/nsCertificateDialogs;1].getService(Ci.nsICertificateDialogs);
时,我的类会被实例化。调用certDB.importPKCS12File(null, certfile)
时,我得到一个NS_ERROR_FAILURE
并且我的对话框类没有实例化。
FF 实例化证书对话框时有什么区别。如何测试?我错过了什么?
编辑:我的证书对话框类不会被 ff 实例化 - 即使使用有效的令牌 certDB.importPKCS12File(token, certfile) 调用;In change call 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
FF 实例化证书对话框时有什么区别。
其实没什么区别。当 Firefox 需要文件密码时,它将调用getNSSDialogs()
函数,并且该函数将执行与您的getService()
调用的道德等效项。但是,getService()
第一次只实例化组件,后续调用不会再次导致实例化 - 这可能是为什么你看不到任何来自 Firefox 代码的原因。
另一个潜在的问题是您没有向函数传递任何令牌。这意味着 Firefox 将尝试确定令牌本身并调用 GetSlotWithMechanism()
。如果有多个可用令牌,它将显示一个选择对话框,它基本上会调用Cc["@mozilla.org/nsTokenDialogs;1"].getService(Ci.nsITokenDialogs).ChooseToken()
。所以也许它出错了,因为这个组件在你的 xpcshell 中不可用 - 这意味着你也必须替换它或显式指定一个令牌。