"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
  if (from && typeof from === "object" || typeof from === "function") {
    for (let key of __getOwnPropNames(from))
      if (!__hasOwnProp.call(to, key) && key !== except)
        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
  }
  return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var account_login_exports = {};
__export(account_login_exports, {
  AccountLogin: () => AccountLogin,
  AccountLoginCluster: () => AccountLoginCluster
});
module.exports = __toCommonJS(account_login_exports);
var import_MutableCluster = require("../cluster/mutation/MutableCluster.js");
var import_Cluster = require("../cluster/Cluster.js");
var import_TlvObject = require("../tlv/TlvObject.js");
var import_TlvString = require("../tlv/TlvString.js");
var import_model = require("@matter/model");
var import_NodeId = require("../datatype/NodeId.js");
var import_Priority = require("../globals/Priority.js");
var import_ClusterRegistry = require("../cluster/ClusterRegistry.js");
/**
 * @license
 * Copyright 2022-2026 Matter.js Authors
 * SPDX-License-Identifier: Apache-2.0
 */
var AccountLogin;
((AccountLogin2) => {
  AccountLogin2.TlvGetSetupPinRequest = (0, import_TlvObject.TlvObject)({
    /**
     * This field shall specify the client’s Temporary Account Identifier. The length of this field shall be at
     * least 16 characters to protect the account holder against password guessing attacks.
     *
     * @see {@link MatterSpecification.v142.Cluster} § 6.2.4.1.1
     */
    tempAccountIdentifier: (0, import_TlvObject.TlvField)(0, import_TlvString.TlvString.bound({ minLength: 16, maxLength: 100 }))
  });
  AccountLogin2.TlvGetSetupPinResponse = (0, import_TlvObject.TlvObject)({
    /**
     * This field shall provide the Setup PIN as a text string at least 8 characters in length or empty string to
     * indicate that the accounts do not match.
     *
     * > [!NOTE]
     *
     * > Newer cluster clients should be aware that AccountLogin cluster version 1 specified an 11 digit minimum
     *   length.
     *
     * @see {@link MatterSpecification.v142.Cluster} § 6.2.4.2.1
     */
    setupPin: (0, import_TlvObject.TlvField)(0, import_TlvString.TlvString)
  });
  AccountLogin2.TlvLoginRequest = (0, import_TlvObject.TlvObject)({
    /**
     * This field shall specify the client’s temporary account identifier.
     *
     * @see {@link MatterSpecification.v142.Cluster} § 6.2.4.3.1
     */
    tempAccountIdentifier: (0, import_TlvObject.TlvField)(0, import_TlvString.TlvString.bound({ minLength: 16, maxLength: 100 })),
    /**
     * This field shall provide the Setup PIN as a text string at least 8 characters in length.
     *
     * > [!NOTE]
     *
     * > Newer cluster clients should be aware that AccountLogin cluster revision 1 specified an 11 digit minimum
     *   length.
     *
     * @see {@link MatterSpecification.v142.Cluster} § 6.2.4.3.2
     */
    setupPin: (0, import_TlvObject.TlvField)(1, import_TlvString.TlvString.bound({ minLength: 8 })),
    /**
     * This optional field shall provide the Node ID of the Client. This field can be used by the Content App to
     * keep track of Nodes which currently have access to it.
     *
     * @see {@link MatterSpecification.v142.Cluster} § 6.2.4.3.3
     */
    node: (0, import_TlvObject.TlvOptionalField)(2, import_NodeId.TlvNodeId)
  });
  AccountLogin2.TlvLogoutRequest = (0, import_TlvObject.TlvObject)({
    /**
     * This optional field shall provide the Node ID of the Client. This field can be used by the Content App to
     * keep track of Nodes which currently have access to it.
     *
     * @see {@link MatterSpecification.v142.Cluster} § 6.2.4.4.1
     */
    node: (0, import_TlvObject.TlvOptionalField)(0, import_NodeId.TlvNodeId)
  });
  AccountLogin2.TlvLoggedOutEvent = (0, import_TlvObject.TlvObject)({
    /**
     * This field shall provide the Node ID corresponding to the user account that has logged out, if that Node ID
     * is available. If it is NOT available, this field shall NOT be present in the event.
     *
     * @see {@link MatterSpecification.v142.Cluster} § 6.2.5.1.1
     */
    node: (0, import_TlvObject.TlvOptionalField)(0, import_NodeId.TlvNodeId)
  });
  AccountLogin2.ClusterInstance = (0, import_MutableCluster.MutableCluster)({
    id: 1294,
    name: "AccountLogin",
    revision: 2,
    commands: {
      /**
       * The purpose of this command is to determine if the active user account of the given Content App matches
       * the active user account of a given Commissionee, and when it does, return a Setup PIN which can be used
       * for password-authenticated session establishment (PASE) with the Commissionee.
       *
       * For example, a Video Player with a Content App Platform may invoke this command on one of its Content App
       * endpoints to facilitate commissioning of a Phone App made by the same vendor as the Content App. If the
       * accounts match, then the Content App may return a Setup PIN that can be used by the Video Player to
       * commission the Phone App without requiring the user to physically input a Setup PIN.
       *
       * The account match is determined by the Content App using a method which is outside the scope of this
       * specification and will typically involve a central service which is in communication with both the
       * Content App and the Commissionee. The GetSetupPIN command is needed in order to provide the
       * Commissioner/Admin with a Setup PIN when this Commissioner/Admin is operated by a different vendor from
       * the Content App.
       *
       * This method is used to facilitate Setup PIN exchange (for PASE) between Commissioner and Commissionee
       * when the same user account is active on both nodes. With this method, the Content App satisfies proof of
       * possession related to commissioning by requiring the same user account to be active on both Commissionee
       * and Content App, while the Commissioner/Admin ensures user consent by prompting the user prior to
       * invocation of the command.
       *
       * Upon receipt of this command, the Content App checks if the account associated with the Temporary Account
       * Identifier sent by the client is the same account that is active on itself. If the accounts are the same,
       * then the Content App returns the GetSetupPIN Response which includes a Setup PIN that may be used for
       * PASE with the Commissionee.
       *
       * The Temporary Account Identifier for a Commissionee may be populated with the Rotating ID field of the
       * client’s commissionable node advertisement (see Rotating Device Identifier section in [MatterCore])
       * encoded as an octet string where the octets of the Rotating Device Identifier are encoded as 2-character
       * sequences by representing each octet’s value as a 2-digit hexadecimal number, using uppercase letters.
       *
       * The Setup PIN is a character string so that it can accommodate different future formats, including
       * alpha-numeric encodings. For a Commissionee it shall be populated with the Manual Pairing Code (see
       * Manual Pairing Code section in [MatterCore]) encoded as a string (11 characters) or the Passcode portion
       * of the Manual Pairing Code (when less than 11 characters).
       *
       * The server shall implement rate limiting to prevent brute force attacks. No more than 10 unique requests
       * in a 10 minute period shall be allowed; a command response status of FAILURE should sent for additional
       * commands received within the 10 minute period. Because access to this command is limited to nodes with
       * Admin-level access, and the user is prompted for consent prior to Commissioning, there are in place
       * multiple obstacles to successfully mounting a brute force attack. A Content App that supports this
       * command shall ensure that the Temporary Account Identifier used by its clients is not valid for more than
       * 10 minutes.
       *
       * @see {@link MatterSpecification.v142.Cluster} § 6.2.4.1
       */
      getSetupPin: (0, import_Cluster.Command)(
        0,
        AccountLogin2.TlvGetSetupPinRequest,
        1,
        AccountLogin2.TlvGetSetupPinResponse,
        { invokeAcl: import_model.AccessLevel.Administer, timed: true }
      ),
      /**
       * The purpose of this command is to allow the Content App to assume the user account of a given
       * Commissionee by leveraging the Setup PIN input by the user during the commissioning process.
       *
       * For example, a Video Player with a Content App Platform may invoke this command on one of its Content App
       * endpoints after the commissioning has completed of a Phone App made by the same vendor as the Content
       * App. The Content App may determine whether the Temporary Account Identifier maps to an account with a
       * corresponding Setup PIN and, if so, it may automatically login to the account for the corresponding user.
       * The end result is that a user performs commissioning of a Phone App to a Video Player by inputting the
       * Setup PIN for the Phone App into the Video Player UX. Once commissioning has completed, the Video Player
       * invokes this command to allow the corresponding Content App to assume the same user account as the Phone
       * App.
       *
       * The verification of Setup PIN for the given Temporary Account Identifier is determined by the Content App
       * using a method which is outside the scope of this specification and will typically involve a central
       * service which is in communication with both the Content App and the Commissionee. Implementations of such
       * a service should impose aggressive time outs for any mapping of Temporary Account Identifier to Setup PIN
       * in order to prevent accidental login due to delayed invocation.
       *
       * Upon receipt, the Content App checks if the account associated with the client’s Temp Account Identifier
       * has a current active Setup PIN with the given value. If the Setup PIN is valid for the user account
       * associated with the Temp Account Identifier, then the Content App may make that user account active.
       *
       * The Temporary Account Identifier for a Commissionee may be populated with the Rotating ID field of the
       * client’s commissionable node advertisement encoded as an octet string where the octets of the Rotating
       * Device Identifier are encoded as 2-character sequences by representing each octet’s value as a 2-digit
       * hexadecimal number, using uppercase letters.
       *
       * The Setup PIN for a Commissionee may be populated with the Manual Pairing Code encoded as a string of
       * decimal numbers (11 characters) or the Passcode portion of the Manual Pairing Code encoded as a string of
       * decimal numbers (8 characters).
       *
       * The server shall implement rate limiting to prevent brute force attacks. No more than 10 unique requests
       * in a 10 minute period shall be allowed; a command response status of FAILURE should sent for additional
       * commands received within the 10 minute period. Because access to this command is limited to nodes with
       * Admin-level access, and the user is involved when obtaining the Setup PIN, there are in place multiple
       * obstacles to successfully mounting a brute force attack. A Content App that supports this command shall
       * ensure that the Temporary Account Identifier used by its clients is not valid for more than 10 minutes.
       *
       * @see {@link MatterSpecification.v142.Cluster} § 6.2.4.3
       */
      login: (0, import_Cluster.Command)(
        2,
        AccountLogin2.TlvLoginRequest,
        2,
        import_Cluster.TlvNoResponse,
        { invokeAcl: import_model.AccessLevel.Administer, timed: true }
      ),
      /**
       * The purpose of this command is to instruct the Content App to clear the current user account. This
       * command SHOULD be used by clients of a Content App to indicate the end of a user session.
       *
       * @see {@link MatterSpecification.v142.Cluster} § 6.2.4.4
       */
      logout: (0, import_Cluster.Command)(3, AccountLogin2.TlvLogoutRequest, 3, import_Cluster.TlvNoResponse, { timed: true })
    },
    events: {
      /**
       * This event can be used by the Content App to indicate that the current user has logged out. In response
       * to this event, the Fabric Admin shall remove access to this Content App by the specified Node. If no Node
       * is provided, then the Fabric Admin shall remove access to all non-Admin Nodes.
       *
       * @see {@link MatterSpecification.v142.Cluster} § 6.2.5.1
       */
      loggedOut: (0, import_Cluster.OptionalEvent)(0, import_Priority.Priority.Critical, AccountLogin2.TlvLoggedOutEvent, { readAcl: import_model.AccessLevel.Administer })
    }
  });
  AccountLogin2.Cluster = AccountLogin2.ClusterInstance;
  AccountLogin2.Complete = AccountLogin2.Cluster;
})(AccountLogin || (AccountLogin = {}));
const AccountLoginCluster = AccountLogin.Cluster;
import_ClusterRegistry.ClusterRegistry.register(AccountLogin.Complete);
//# sourceMappingURL=account-login.js.map
