// 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 "crash-reporter/service_failure_collector.h"

#include <base/files/file_util.h>
#include <base/logging.h>
#include <base/strings/stringprintf.h>

namespace {
const char kExecName[] = "service-failure";
const char kSignatureKey[] = "sig";
const char kFailureReportPath[] = "/run/anomaly-collector/service-fail";
}  // namespace

using base::FilePath;
using base::StringPrintf;

ServiceFailureCollector::ServiceFailureCollector()
    : failure_report_path_(kFailureReportPath) {
}

ServiceFailureCollector::~ServiceFailureCollector() {
}

bool ServiceFailureCollector::LoadServiceFailure(std::string *signature) {
  FilePath failure_report_path(failure_report_path_);
  if (!base::ReadFileToString(failure_report_path, signature)) {
    LOG(ERROR) << "Could not open " << failure_report_path_;
    return false;
  }
  // The report is a single line with the signature. Chop off the first newline
  // character and anything that might follow it.
  std::string::size_type end_position = signature->find('\n');
  if (end_position != std::string::npos) {
    signature->resize(end_position);
  }

  return !signature->empty();
}

bool ServiceFailureCollector::Collect() {
  std::string reason = "normal collection";
  bool feedback = true;
  if (IsDeveloperImage()) {
    reason = "always collect from developer builds";
    feedback = true;
  } else if (!is_feedback_allowed_function_()) {
    reason = "no user consent";
    feedback = false;
  }

  LOG(INFO) << "Processing service failure: " << reason;

  if (!feedback) {
    return true;
  }

  std::string failure_signature;
  if (!LoadServiceFailure(&failure_signature)) {
    return true;
  }

  FilePath crash_directory;
  if (!GetCreatedCrashDirectoryByEuid(kRootUid, &crash_directory,
                                      nullptr)) {
    return true;
  }

  std::string dump_basename = FormatDumpBasename(kExecName, time(nullptr), 0);
  FilePath log_path = GetCrashPath(crash_directory, dump_basename, "log");
  FilePath meta_path = GetCrashPath(crash_directory, dump_basename, "meta");

  AddCrashMetaData(kSignatureKey, failure_signature);

  bool result = GetLogContents(log_config_path_, kExecName, log_path);
  if (result) {
    WriteCrashMetaData(meta_path, kExecName, log_path.value());
  }

  return true;
}
