4

nsICertificateDialogsダイアログを独自の実装に置き換えようとしています。Web メールからの smime メールを処理する拡張機能を既に持っています。拡張機能で Mozilla 証明書ストアを使用できるようにしたいと考えています。smime 証明書/キーをエクスポートする (拡張機能で使用する) 唯一の方法は、pfx ファイルをエクスポートすることです。

コマンドラインから nsIX509CertDB.nsIX509CertDB を呼び出している間にエラーが発生しました (古いファクトリを登録解除し、鉱山を正しい契約 ID で登録します)。私が呼び出すとCc[@mozilla.org/nsCertificateDialogs;1].getService(Ci.nsICertificateDialogs);、クラスがインスタンス化されます。呼び出すcertDB.importPKCS12File(null, certfile)NS_ERROR_FAILURE、ダイアログ クラスがインスタンス化されません。

FF が証明書ダイアログをインスタンス化するときの違いは何ですか。どうすればテストできますか?私は何が欠けていますか?

編集:有効なトークン certDB.importPKCS12File(token, certfile); で呼び出された場合でも、証明書ダイアログ クラスが ff によってインスタンス化されません。変更呼び出し var certdialogInterface = Cc[sMimeCertificateDialog.mozillaContractID] .getService(Ci.nsICertificateDialogs); 私のクラスを正しくインスタンス化します(いくつかの QueryInterface 呼び出しが続きます)

編集: (願わくば) 単純な複製子をhttp://www.sodgeit.de/dialog_reproducer.zipにアップロードしました

4

1 に答える 1

3

FF が証明書ダイアログをインスタンス化するときの違いは何ですか。

実際には違いはありません。Firefox がファイル パスワードを必要とするとき、それはfunctionを呼び出し、それはあなたのgetNSSDialogs()呼び出しと道徳的に同等のgetService()ことを行います。ただし、getService()最初にコンポーネントをインスタンス化するだけで、その後の呼び出しではインスタンス化が再度行われません。これが、Firefox コードからのコンポーネントが表示されない理由の説明である可能性があります。

もう 1 つの潜在的な問題は、関数にトークンを渡していないことです。これは、Firefox がトークン自体を特定してを呼び出そうとすることを意味しますGetSlotWithMechanism()。利用可能なトークンが複数ある場合は、選択ダイアログが表示され、基本的に が呼び出されますCc["@mozilla.org/nsTokenDialogs;1"].getService(Ci.nsITokenDialogs).ChooseToken()。したがって、このコンポーネントは xpcshell で使用できないため、エラーが発生する可能性があります。つまり、コンポーネントも置き換えるか、トークンを明示的に指定する必要があります。

于 2012-08-20T07:46:18.733 に答える