mozilla
Your Search Results

    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);
    

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


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

    タグ: 
    Contributors to this page: Kohei, Mgjbot
    最終更新者: Mgjbot,