/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */


#include "nsISupports.idl"

[scriptable, uuid(c41b7dff-6b9b-42fe-b78d-113051facb05)]

/**
 * An object containing information for a login stored by the
 * password manager.
 */
interface nsILoginInfo : nsISupports {
  /**
   * The hostname the login applies to.
   *
   * The hostname should be formatted as an URL. For example,
   * "https://site.com", "http://site.com:1234", "ftp://ftp.site.com".
   */
  attribute AString hostname;

  /**
   * The URL a form-based login was submitted to.
   *
   * For logins obtained from HTML forms, this field is the |action|
   * attribute from the |form| element, with the path removed. For
   * example "http://www.site.com". [Forms with no |action| attribute
   * default to submitting to their origin URL, so we store that.]
   *
   * For logins obtained from a HTTP or FTP protocol authentication,
   * this field is NULL.
   */
  attribute AString formSubmitURL;

  /**
   * The HTTP Realm a login was requested for.
   *
   * When an HTTP server sends a 401 result, the WWW-Authenticate
   * header includes a realm to identify the "protection space." See
   * RFC2617. If the response sent has a missing or blank realm, the
   * hostname is used instead.
   *
   * For logins obtained from HTML forms, this field is NULL.
   */
  attribute AString httpRealm;

  /**
   * The username for the login.
   */
  attribute AString username;

  /**
   * The |name| attribute for the username input field.
   *
   * For logins obtained from a HTTP or FTP protocol authentication,
   * this field is an empty string.
   */
  attribute AString usernameField;

  /**
   * The password for the login.
   */
  attribute AString password;

  /**
   * The |name| attribute for the password input field.
   *
   * For logins obtained from a HTTP or FTP protocol authentication,
   * this field is an empty string.
   */
  attribute AString passwordField;

  /**
   * Initialize a newly created nsLoginInfo object.
   *
   * The arguments are the fields for the new object.
   */
  void init(in AString aHostname,
            in AString aFormSubmitURL, in AString aHttpRealm,
            in AString aUsername,      in AString aPassword,
            in AString aUsernameField, in AString aPasswordField);

  /**
   * Test for strict equality with another nsILoginInfo object.
   *
   * @param aLoginInfo
   *        The other object to test.
   */
  boolean equals(in nsILoginInfo aLoginInfo);

  /**
   * Test for loose equivalency with another nsILoginInfo object. The
   * passwordField and usernameField values are ignored, and the password
   * values may be optionally ignored. If one login's formSubmitURL is an
   * empty string (but not null), it will be treated as a wildcard. [The
   * blank value indicates the login was stored before bug 360493 was fixed.]
   *
   * @param aLoginInfo
   *        The other object to test.
   * @param ignorePassword
   *        If true, ignore the password when checking for match.
   */
  boolean matches(in nsILoginInfo aLoginInfo, in boolean ignorePassword);

  /**
   * Create an identical copy of the login, duplicating all of the login's
   * nsILoginInfo and nsILoginMetaInfo properties.
   *
   * This allows code to be forwards-compatible, when additional properties
   * are added to nsILoginMetaInfo (or nsILoginInfo) in the future.
   */
  nsILoginInfo clone();
};

%{C++

#define NS_LOGININFO_CONTRACTID "@mozilla.org/login-manager/loginInfo;1"

%}