从firefox扩展名替换nsICertificateDialogs

时间:2012-08-16 13:21:33

标签: javascript firefox-addon certificate xpcom nss

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

我取消注册原始证书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实例化 - 即使用有效的令牌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

1 个答案:

答案 0 :(得分:3)

  

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

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

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