-->

更换从Firefox扩展nsICertificateDialogs(replace nsICerti

2019-09-21 06:50发布

我试图取代nsICertificateDialogs用我自己的Dialog实现。 我已经从网络邮件处理SMIME邮件的扩展。 我希望能够使用Mozilla的证书存储我的扩充。 唯一的可能性,我发现通过导出PFX文件导出SMIME证书/键(使用它在我的扩展名)。

我注销原certifica tedialog,注册矿此处所述故障而从从命令行调用nsIX509CertDB.nsIX509CertDB (注销旧厂房和正确contractID注册矿)。 当我打电话Cc[@mozilla.org/nsCertificateDialogs;1].getService(Ci.nsICertificateDialogs); 我的课被实例化。 当调用certDB.importPKCS12File(null, certfile)我得到一个NS_ERROR_FAILURE和我的对话类没有实例化。

是什么时,FF实例证书对话框的差异。 如何测试呢? 我在想什么?

编辑:我的证书对话框类不获得通过FF实例化 - 即使与有效令牌certDB.importPKCS12File(令牌,certFile中)调用; 在改变主叫VAR certdialogInterface =抄送[sMimeCertificateDialog.mozillaContractID] .getService(Ci.nsICertificateDialogs); 正确instanciates我的课(许多的QueryInterface调用)

编辑:我上传了(希望)简单的再现,以http://www.sodgeit.de/dialog_reproducer.zip看的src /铬/组件/ smime_certificate_dialog.js并且到src /测试/ smime_certificate_dialog_test.js

Answer 1:

是什么时,FF实例证书对话框的差异。

其实没有什么区别。 当Firefox需要的文件密码,它会调用getNSSDialogs()函数和一个会做你的道德等价getService()调用 。 然而, getService()只实例化组件在第一时间,后续调用将不会再导致实例-这可能是为什么你没有看到Firefox的任何代码来解释。

另一个潜在的问题是,你不传递任何标记的功能。 这意味着,Firefox将尝试确定令牌本身并调用GetSlotWithMechanism() 在多个可用令牌它将显示一个选择对话框的情况下,将基本调用Cc["@mozilla.org/nsTokenDialogs;1"].getService(Ci.nsITokenDialogs).ChooseToken() 因此,也许它错误,因为该组件是不是在你的xpcshell使用 - 这意味着你将不得不要么更换以及或明确指定的令牌。



文章来源: replace nsICertificateDialogs from firefox extension