// Copyright 2019 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 "crash-reporter/ephemeral_crash_collector.h"

#include <base/files/file_enumerator.h>
#include <base/files/file_util.h>
#include <brillo/process/process.h>

#include <string>

#include "crash-reporter/paths.h"
#include "crash-reporter/util.h"

EphemeralCrashCollector::EphemeralCrashCollector()
    : CrashCollector("ephemeral_crash_collector"),
      early_(false),
      source_directories_({base::FilePath(paths::kSystemRunCrashDirectory)}) {}

void EphemeralCrashCollector::Initialize(
    IsFeedbackAllowedFunction is_feedback_allowed_function,
    bool preserve_across_clobber) {
  // For preserving crash reports across clobbers, the consent file may not be
  // available. Instead, collect the crashes into the encrypted reboot vault
  // directory and let crash-sender decide how to deal with these reports.
  if (preserve_across_clobber) {
    system_crash_path_ =
        base::FilePath(paths::kEncryptedRebootVaultCrashDirectory);
    is_feedback_allowed_function = []() { return true; };
  } else {
    // In case of powerwash, there is a chance that the powerwash was a result
    // of failure to mount the partition: in such situations, we may have crash
    // reports in the reboot vault to collect. Allow the meta collector to
    // collect such reports into /var/spool. Once OOBE is complete, depending
    // on user consent, either throw away these reports or send them.
    if (!base::PathExists(paths::Get(paths::kOobeCompletePath)))
      is_feedback_allowed_function = []() { return true; };
    source_directories_.push_back(
        base::FilePath(paths::kEncryptedRebootVaultCrashDirectory));
  }

  // Disable early mode.
  CrashCollector::Initialize(is_feedback_allowed_function, false /* early */);
}

bool EphemeralCrashCollector::Collect() {
#if USE_DIRENCRYPTION
  // Join the session keyring, if one exists.
  util::JoinSessionKeyring();
#endif  // USE_DIRENCRYPTION

  if (is_feedback_allowed_function_()) {
    for (auto& dir : source_directories_) {
      base::FileEnumerator source_directory_enumerator(
          dir, false /* recursive */, base::FileEnumerator::FILES);

      LOG(INFO) << "Examining " << dir << " for crashes";

      for (auto source_path = source_directory_enumerator.Next();
           !source_path.empty();
           source_path = source_directory_enumerator.Next()) {
        // Get crash directory to put logs in.
        base::FilePath destination_directory;

        // If the crash reporter directory is already fully occupied, then exit.
        if (!GetCreatedCrashDirectoryByEuid(0, &destination_directory, nullptr))
          break;

        base::FilePath destination_path =
            destination_directory.Append(source_path.BaseName());
        LOG(INFO) << "Copying early crash to: " << destination_path.value();

        if (!base::Move(source_path, destination_path)) {
          PLOG(WARNING) << "Unable to copy " << source_path.value();
          continue;
        }
      }
    }
  } else {
    LOG(INFO) << "Not collecting early crashes: No user consent available.";
  }

  // Cleanup crash directory.
  for (auto& dir : source_directories_)
    base::DeleteFile(dir, true /* recursive */);

  return true;
}
