Join MDN and developers like you at Mozilla's View Source conference, 12-14 September in Berlin, Germany. Learn more at https://viewsourceconf.org

Creating a Login Manager storage module

ログインマネージャは、ユーザのパスワードを管理、保存する機能です。拡張機能は、組み込みのパスワード保存機構を、独自の実装に置き換えることができます。これは、Firefox のパスワード管理システムを既存のパスワード管理システムと統合したい、あるいは、独自のパスワード保存形式や保存データベースを利用したい、といった場合に便利でしょう。

あなたの拡張機能でログインマネージャを利用したいだけなら、Using nsILoginManager という記事を参照してください。

組み込みのログインマネージャをオーバーライドするには、2 つの作業が必要となります。

  1. nsILoginManagerStorage インタフェースを実装する
  2. そのインタフェースを特定のカテゴリに登録する
ログインマネージャを 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);

アンロード時にカテゴリの登録を解除することを忘れないでください。


ドキュメントのタグと貢献者

タグ: 
 このページの貢献者: Mgjbot, Kohei
 最終更新者: Mgjbot,