// Copyright 2017 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 "virtual_file_provider/util.h"

#include <memory>
#include <string>

#include <sys/capability.h>
#include <sys/prctl.h>

#include <base/files/file_path.h>
#include <base/files/file_util.h>
#include <base/strings/string_number_conversions.h>
#include <base/strings/string_util.h>
#include <base/logging.h>

namespace virtual_file_provider {

// Clears all capabilities.
bool ClearCapabilities() {
  // Read cap_last_cap.
  const base::FilePath last_cap_path(FILE_PATH_LITERAL(
      "/proc/sys/kernel/cap_last_cap"));
  std::string contents;
  int last_cap = 0;
  if (!base::ReadFileToString(last_cap_path, &contents) ||
      !base::StringToInt(base::TrimWhitespaceASCII(contents,
                                                   base::TRIM_TRAILING),
                         &last_cap)) {
    LOG(ERROR) << "Failed to read cap_last_cap";
    return false;
  }
  // Drop cap bset.
  for (int i = 0; i <= last_cap; ++i) {
    if (prctl(PR_CAPBSET_DROP, i)) {
      PLOG(ERROR) << "Failed to drop bset " << i;
      return false;
    }
  }
  // Drop capabilities.
  std::unique_ptr<std::remove_pointer<cap_t>::type, decltype(&cap_free)> cap(
      cap_init(), cap_free);
  if (!cap) {
    PLOG(ERROR) << "Failed to cap_init()";
    return false;
  }
  if (cap_set_proc(cap.get())) {
    PLOG(ERROR) << "Failed to cap_set_proc()";
    return false;
  }
  return true;
}

}  // namespace virtual_file_provider
