Creating a Login Manager storage module
出典: MDC
この記事は Firefox 3 の新機能について述べています
ログインマネージャは、ユーザのパスワードを管理、保存する機能です。拡張機能は、組み込みのパスワード保存機構を、独自の実装に置き換えることができます。これは、Firefox のパスワード管理システムを既存のパスワード管理システムと統合したい、あるいは、独自のパスワード保存形式や保存データベースを利用したい、といった場合に便利でしょう。
あなたの拡張機能でログインマネージャを利用したいだけなら、Using nsILoginManager という記事を参照してください。
組み込みのログインマネージャをオーバーライドするには、2 つの作業が必要となります。
-
nsILoginManagerStorageインタフェースを実装する - そのインタフェースを特定のカテゴリに登録する
ログインマネージャを Mac OS X のキーチェーンアクセス (bug 106400) や Gnome Keyring Manager (bug 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++ 実装の例
完全な例は bug 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);
アンロード時にカテゴリの登録を解除することを忘れないでください。