Заменить nsICertificateDialogs из расширения Firefox

Я пытаюсь заменить 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(токен, 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 ответ

В чем разница, когда FF создает диалоговое окно сертификата.

На самом деле нет разницы. Когда Firefox понадобится пароль для файла, он вызовет getNSSDialogs() функция, и что будет делать моральный эквивалент вашего getService() звоните. Тем не мение,getService()Он только создает экземпляр компонента в первый раз, последующие вызовы не вызовут повторное создание экземпляра - это может быть объяснением, почему вы не видите ничего из кода Firefox.

Другая потенциальная проблема заключается в том, что вы не передаете токен функции. Это означает, что Firefox попытается определить сам токен и вызватьGetSlotWithMechanism(), В случае нескольких доступных токенов будет отображаться диалог выбора, в основном он будет вызывать Cc["@mozilla.org/nsTokenDialogs;1"].getService(Ci.nsITokenDialogs).ChooseToken(), Так что, возможно, произойдет ошибка из-за того, что этот компонент не может быть использован в вашей оболочке xpcs - это означает, что вам придется либо заменить его, либо явно указать токен.

Другие вопросы по тегам