Заменить 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 - это означает, что вам придется либо заменить его, либо явно указать токен.