ログインマネージャは、ユーザのパスワードを管理、保存する機能です。拡張機能は、組み込みのパスワード保存機構を、独自の実装に置き換えることができます。これは、Firefox のパスワード管理システムを既存のパスワード管理システムと統合したい、あるいは、独自のパスワード保存形式や保存データベースを利用したい、といった場合に便利でしょう。
あなたの拡張機能でログインマネージャを利用したいだけなら、Using nsILoginManager という記事を参照してください。
組み込みのログインマネージャをオーバーライドするには、2 つの作業が必要となります。
-
nsILoginManagerStorage
インタフェースを実装する - そのインタフェースを特定のカテゴリに登録する
ログインマネージャを Mac OS X のキーチェーンアクセス (バグ 106400) や Gnome Keyring Manager (バグ 309807) と統合させるためのいくつかの作業は既に完了しています。貴方の拡張機能にそれらを実装したい場合は既存のコードを足掛かりにすると良いでしょう。
JavaScript 実装の例
以下のコードサンプルは、ダミーの nsILoginManagerStorage
インタフェースを実装した JavaScript コンポーネントです。JavaScript コンポーネントに関する詳細は How_to_Build_an_XPCOM_Component_in_Javascript をご覧ください。
const Cc = Components.classes; const Ci = Components.interfaces; Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); function SampleLoginManagerStorage() {} SampleLoginManagerStorage.prototype = { classDescription: "Sample nsILoginManagerStorage implementation", contractID: "@example.com/login-manager/storage/sample;1", classID: Components.ID("{364a118c-747a-4f6d-ac63-2d2998e5a5c1}"), QueryInterface: XPCOMUtils.generateQI([Ci.nsILoginManagerStorage]), // ここで、組み込みの nsILoginManagerStorage をオーバーライドするためのカテゴリを登録します _xpcom_categories: [ { category: "login-manager-storage", entry: "nsILoginManagerStorage" } ], // デバッグに使用するコンソールログサービス __logService : null, get _logService() { if (!this.__logService) this.__logService = Cc["@mozilla.org/consoleservice;1"]. getService(Ci.nsIConsoleService); return this.__logService; }, log: function (message) { dump("SampleLoginManager: " + message + "\n"); this._logService.logStringMessage("SampleLoginManager: " + message); }, // デバッグのためのログ関数名と引数 stub: function(arguments) { var args = []; for (let i = 0; i < arguments.length; i++) args.push(arguments[i]) this.log("Called " + arguments.callee.name + "(" + args.join(",") + ")"); }, init: function SLMS_init() { this.stub(arguments); }, initWithFile: function SLMS_initWithFile(aInputFile, aOutputFile) { this.stub(arguments); }, addLogin: function SLMS_addLogin(login) { this.stub(arguments); }, removeLogin: function SLMS_removeLogin(login) { this.stub(arguments); }, modifyLogin: function SLMS_modifyLogin(oldLogin, newLogin) { this.stub(arguments); }, getAllLogins: function SLMS_getAllLogins(count) { this.stub(arguments); }, removeAllLogins: function SLMS_removeAllLogins() { this.stub(arguments); }, getAllDisabledHosts: function SLMS_getAllDisabledHosts(count) { this.stub(arguments); }, getLoginSavingEnabled: function SLMS_getLoginSavingEnabled(hostname) { this.stub(arguments); }, setLoginSavingEnabled: function SLMS_setLoginSavingEnabled(hostname, enabled) { this.stub(arguments); }, findLogins: function SLMS_findLogins(count, hostname, formSubmitURL, httpRealm) { this.stub(arguments); }, countLogins: function SLMS_countLogins(aHostname, aFormSubmitURL, aHttpRealm) { this.stub(arguments); } }; function NSGetModule(compMgr, fileSpec) XPCOMUtils.generateModule([SampleLoginManagerStorage]);
C++ 実装の例
完全な例は バグ 309807 にあります。カテゴリの登録は以下のように行います。
nsCOMPtr<nsICategoryManager> cat = do_GetService(NS_CATEGORYMANAGER_CONTRACTID); NS_ENSURE_STATE(cat); cat->AddCategoryEntry("login-manager-storage", "nsILoginManagerStorage", kYourContractID, PR_TRUE, PR_TRUE, nsnull);
アンロード時にカテゴリの登録を解除することを忘れないでください。