// 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 <base/logging.h>
#include <base/strings/string_util.h>

#include "init/usermode-helper.h"

namespace usermode_helper {

namespace {

bool IsTestCaseFlag(const char* arg) {
  return std::string_view(arg) == "--core2md_failure" ||
         std::string_view(arg) == "--directory_failure";
}

bool IsFilterIn(const char* arg) {
  return base::StartsWith(arg, "--filter_in=", base::CompareCase::SENSITIVE);
}

// Processes core dumps from the kernel when a crash is detected.
// Controlled via /proc/sys/kernel/core_pattern.
bool ValidateCrashReporter(int argc, const char* argv[]) {
  // Allow normal crash reporting.  Most invocations will be this.
  if (argc == 2 &&
      base::StartsWith(argv[1], "--user=", base::CompareCase::SENSITIVE)) {
    return true;
  }

  // Allow early crash reporting invocation.
  if (argc == 4 && std::string_view(argv[1]) == "--early" &&
      std::string_view(argv[2]) == "--log_to_stderr" &&
      base::StartsWith(argv[3], "--user=", base::CompareCase::SENSITIVE)) {
    return true;
  }

  // Allow for testing invocations.
  if (argc == 3 &&
      base::StartsWith(argv[1], "--user=", base::CompareCase::SENSITIVE) &&
      IsFilterIn(argv[2])) {
    return true;
  }

  // Allow for crash-reporter crash testing invocations.
  if (argc == 3 &&
      base::StartsWith(argv[1], "--user=", base::CompareCase::SENSITIVE) &&
      std::string_view(argv[2]) == "--crash_test") {
    return true;
  }

  // Allow for log-collection-failure tests. Currently the test is being
  // transitioned from autotest to Tast, having 2 different versions.
  // TODO(crbug.com/1040335): Remove the former one after removing the
  // logging_UserCrash autotest.
  if (argc == 4 &&
      base::StartsWith(argv[1], "--user=", base::CompareCase::SENSITIVE) &&
      ((IsTestCaseFlag(argv[2]) && IsFilterIn(argv[3])) ||
       (IsFilterIn(argv[2]) && IsTestCaseFlag(argv[3])))) {
    return true;
  }

  // crrev.comc/c/2043542 applies the verbose logging flag.
  // TODO(crbug.com/1043801) Remove this after finishing investigation.
  if (argc == 4 &&
      base::StartsWith(argv[1], "--user=", base::CompareCase::SENSITIVE) &&
      IsFilterIn(argv[2]) && std::string_view(argv[3]) == "-v=2") {
    return true;
  }

  // Disallow all other invocations.
  LOG(ERROR) << "crash_reporter: unknown invocation";
  return false;
}

// Automatic module loading when kernel code calls request_module().
// Controlled via /proc/sys/kernel/modprobe.
bool ValidateModprobe(int argc, const char* argv[]) {
  // The kernel has loaded modules with the form `modprobe -q -- modname` since
  // at least linux-2.6.12.  We'll enforce that until the kernel changes, but it
  // rarely does, so maybe it's fine to be lazy.
  if (argc != 4) {
    LOG(ERROR) << "modprobe: argc must be 4";
    return false;
  }

  if (strcmp(argv[1], "-q") != 0) {
    LOG(ERROR) << "modprobe: argv[1] must be -q";
    return false;
  }

  if (strcmp(argv[2], "--") != 0) {
    LOG(ERROR) << "modprobe: argv[2] must be --";
    return false;
  }

  // We allow the last arg to be anything since the -- marker told modprobe to
  // parse it exactly as a module name and not an option.

  return true;
}

// When kernel code poweroffs the system by calling orderly_poweroff().
// This is not related to userspace calling `poweroff` or uses the reboot
// syscall.
// Controlled via /proc/sys/kernel/poweroff_cmd.
bool ValidatePoweroff(int argc, const char* argv[]) {
  if (argc != 1) {
    LOG(ERROR) << "poweroff: argc must be 1";
    return false;
  }

  return true;
}

// When kernel code reboots the system by calling orderly_reboot().
// This is not related to userspace calling `reboot` or uses the reboot
// syscall.
bool ValidateReboot(int argc, const char* argv[]) {
  if (argc != 1) {
    LOG(ERROR) << "reboot: argc must be 1";
    return false;
  }

  return true;
}

// When the kernel needs access to a key as part of the kernel keyring.
bool ValidateRequestKey(int argc, const char* argv[]) {
  // The kernel always executes this as:
  // /sbin/request-key <op> <key> <uid> <gid> <keyring> <keyring> <keyring>
  if (argc != 8) {
    LOG(ERROR) << "request-key: argc must be 8";
    return false;
  }

  // Don't allow any command line options.
  for (size_t i = 1; i < argc; ++i) {
    const std::string_view arg(argv[i]);
    if (arg[0] == '-') {
      LOG(ERROR) << "request-key: options not allowed: " << arg;
      return false;
    }
  }

  return true;
}

bool ValidateBridgeStp(int argc, const char* argv[]) {
  if (argc != 3) {
    LOG(ERROR) << "bridge-stp: argc must be 3";
    return false;
  }

  if (strcmp(argv[2], "start") != 0 && strcmp(argv[2], "stop") != 0) {
    LOG(ERROR) << "bridge-stp: argv[2] must be start or stop";
    return false;
  }

  return true;
}

}  // namespace

// Whether the arguments to the program are permitted.
bool ValidateProgramArgs(int argc, const char* argv[]) {
  const std::string_view prog(argv[0]);

  if (prog == "/sbin/crash_reporter")
    return ValidateCrashReporter(argc, argv);
  else if (prog == "/sbin/modprobe")
    return ValidateModprobe(argc, argv);
  else if (prog == "/sbin/poweroff")
    return ValidatePoweroff(argc, argv);
  else if (prog == "/sbin/reboot")
    return ValidateReboot(argc, argv);
  else if (prog == "/sbin/request-key")
    return ValidateRequestKey(argc, argv);
  else if (prog == "/sbin/bridge-stp")
    return ValidateBridgeStp(argc, argv);

  LOG(ERROR) << "program not permitted: " << argv[0];
  return false;
}

}  // namespace usermode_helper
