/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

const MASTER_PASSWORD = "omgsecret!";
const mpToken = Cc["@mozilla.org/security/pk11tokendb;1"]
  .getService(Ci.nsIPK11TokenDB)
  .getInternalKeyToken();

async function checkDeviceManager({ buttonIsDisabled }) {
  let deviceManagerWindow = window.openDialog(
    "chrome://pippki/content/device_manager.xhtml",
    "",
    ""
  );
  await BrowserTestUtils.waitForEvent(deviceManagerWindow, "load");

  let tree = deviceManagerWindow.document.getElementById("device_tree");
  ok(tree, "The device tree exists");

  // Find and select the item related to the internal key token
  for (let i = 0; i < tree.view.rowCount; i++) {
    tree.view.selection.select(i);

    try {
      let selected_token = deviceManagerWindow.selected_slot.getToken();
      if (selected_token.isInternalKeyToken) {
        break;
      }
    } catch (e) {}
  }

  // Check to see if the button was updated correctly
  let changePwButton = deviceManagerWindow.document.getElementById(
    "change_pw_button"
  );
  is(
    changePwButton.getAttribute("disabled") == "true",
    buttonIsDisabled,
    "Change Password button is in the correct state: " + buttonIsDisabled
  );

  await BrowserTestUtils.closeWindow(deviceManagerWindow);
}

async function checkAboutPreferences({ checkboxIsDisabled }) {
  await BrowserTestUtils.withNewTab(
    "about:preferences#privacy",
    async browser => {
      is(
        browser.contentDocument.getElementById("useMasterPassword").disabled,
        checkboxIsDisabled,
        "Master Password checkbox is in the correct state: " +
          checkboxIsDisabled
      );
    }
  );
}

add_task(async function test_policy_disable_masterpassword() {
  ok(!mpToken.hasPassword, "Starting the test with no password");

  // No password and no policy: access to setting a master password
  // should be enabled.
  await checkDeviceManager({ buttonIsDisabled: false });
  await checkAboutPreferences({ checkboxIsDisabled: false });

  await setupPolicyEngineWithJson({
    policies: {
      DisableMasterPasswordCreation: true,
    },
  });

  // With the `DisableMasterPasswordCreation: true` policy active, the
  // UI entry points for creating a Master Password should be disabled.
  await checkDeviceManager({ buttonIsDisabled: true });
  await checkAboutPreferences({ checkboxIsDisabled: true });

  mpToken.changePassword("", MASTER_PASSWORD);
  ok(mpToken.hasPassword, "Master password was set");

  // If a Master Password is already set, there's no point in disabling
  // the
  await checkDeviceManager({ buttonIsDisabled: false });
  await checkAboutPreferences({ checkboxIsDisabled: false });

  // Clean up
  mpToken.changePassword(MASTER_PASSWORD, "");
  ok(!mpToken.hasPassword, "Master password was cleaned up");
});
