// Copyright 2018 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <sysexits.h>

#include <base/command_line.h>
#include <base/posix/eintr_wrapper.h>
#include <base/strings/string_util.h>
#include <brillo/flag_helper.h>
#include <brillo/process/process.h>

#include "policy_utils/policy_tool.h"

namespace {

// Help message to show when the --help command line switch is specified.
constexpr char kHelpMessage[] =
    "\n"
    "Device Policy tool\n"
    "Set or clear device policies on the local device. Setting a local\n"
    "policy overrides the policy set in Chrome. The command format is:\n"
    "\n"
    "    policy [set|clear] PolicyName [value]\n"
    "\n"
    "The tool will try to automatically detect whether Google Chrome or\n"
    "Chromium is used. If that fails, you can use the options to force one\n"
    "or the other.\n"
    "\n"
    "Examples:\n"
    "    policy set ShowHomeButton true\n"
    "    policy clear ShowHomeButton\n\n"
    "Policy names are not case sensitive.";

constexpr char kUsageMessage[] =
    "\n"
    "Usage:\n"
    "    policy [set|clear] PolicyName [value]\n"
    "or\n"
    "    policy --help for more detailed help\n";

constexpr char kPolicyListHeader[] =
    "\n"
    "List of available policies:\n";

// Path to chrome executable in linux.
constexpr char kChromePath[] = "/opt/google/chrome/chrome";

// Return a PolicyTool singleton.
const policy_utils::PolicyTool& GetPolicyTool(bool for_chromium = false) {
  static policy_utils::PolicyTool policy_tool(
      for_chromium ? policy_utils::PolicyTool::kChromiumPolicyDirPath
                   : policy_utils::PolicyTool::kChromePolicyDirPath);
  return policy_tool;
}

// Show a list of all policies this tool can edit.
void ListPolicies() {
  const policy_utils::PolicyTool::PolicyList& policies =
      GetPolicyTool().get_policies();
  std::string name_list;
  for (auto& policy : policies) {
    name_list += "  " + policy + "\n";
  }

  LOG(INFO) << kPolicyListHeader << name_list;
}

// Run |process| and capture its stdout output to |output|.
int RunAndCaptureOutput(brillo::ProcessImpl* process, std::string* output) {
  constexpr size_t kBufferSize = 4096;

  process->RedirectUsingPipe(STDOUT_FILENO, false);
  if (process->Start()) {
    const int out = process->GetPipe(STDOUT_FILENO);
    char buffer[kBufferSize];
    output->clear();

    while (true) {
      const ssize_t count = HANDLE_EINTR(read(out, buffer, kBufferSize));
      if (count < 0) {
        process->Wait();
        break;
      }

      if (count == 0)
        return process->Wait();

      output->append(buffer, count);
    }
  }

  return -1;
}

// Query the chrome version string by running the chrome executable.
// Return whether successful.
bool GetChromeVersion(std::string* version) {
  brillo::ProcessImpl chrome;
  chrome.AddArg(kChromePath);
  chrome.AddArg("--version");

  int exit_code = RunAndCaptureOutput(&chrome, version);
  return (exit_code == EX_OK && !version->empty());
}

}  // namespace

int main(int argc, char** argv) {
  DEFINE_bool(list, false,
              "Show the list of policies this tool can set or clear");
  DEFINE_bool(chromium, false, "Force setting policies for Chromium");
  DEFINE_bool(chrome, false, "Force setting policies for Google Chrome");

  brillo::FlagHelper::Init(argc, argv, kHelpMessage);
  base::CommandLine* cl = base::CommandLine::ForCurrentProcess();

  if (FLAGS_list) {
    ListPolicies();
    return 0;
  }

  const base::CommandLine::StringVector& args = cl->GetArgs();
  if (args.size() < 2) {
    LOG(INFO) << kUsageMessage;
    return 1;
  }

  // Determine whether we should set the policies for Google Chrome or Chromium,
  // either from cmd-line options or automatically.
  bool set_policies_for_chromium = false;
  if (FLAGS_chromium) {
    set_policies_for_chromium = true;
  } else if (FLAGS_chrome) {
    set_policies_for_chromium = false;
  } else {
    std::string chrome_version;
    if (!GetChromeVersion(&chrome_version)) {
      LOG(ERROR) << "Unable to get Chrome version.\n"
                    "You can use cmd-line options '--chrome' or '--chromium'\n"
                    "to force either Google Chrome or Chromium";
      return 1;
    }

    set_policies_for_chromium = base::StartsWith(
        chrome_version, "Chromium", base::CompareCase::INSENSITIVE_ASCII);
  }

  if (!GetPolicyTool(set_policies_for_chromium).DoCommand(args)) {
    LOG(INFO) << "Failed";
    return 1;
  }

  LOG(INFO) << "Done";
  return 0;
}
