// Copyright 2020 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 "pciguard/daemon.h"
#include "pciguard/sysfs_utils.h"

#include <base/check.h>
#include <base/logging.h>
#include <dbus/pciguard/dbus-constants.h>
#include <sysexits.h>

namespace pciguard {

Daemon::Daemon() : DBusServiceDaemon(kPciguardServiceName) {}

int Daemon::OnInit() {
  LOG(INFO) << "pciguard daemon starting...";

  utils_ = std::make_unique<SysfsUtils>();
  int exit_code = utils_->OnInit();
  if (exit_code != EX_OK)
    return exit_code;

  event_handler_ = std::make_unique<EventHandler>(utils_.get());

  exit_code = DBusServiceDaemon::OnInit();
  if (exit_code != EX_OK)
    return exit_code;

  // Begin monitoring the session events
  session_monitor_ =
      std::make_unique<SessionMonitor>(bus_, event_handler_.get());
  // Begin monitoring the thunderbolt udev events
  UdevMonitor::PcidevBlockedFn cb = [this](const std::string& drvr) {
    HandlePCIDeviceBlocked(drvr);
  };
  udev_monitor_ = std::make_unique<UdevMonitor>(event_handler_.get(), cb);

  LOG(INFO) << "pciguard daemon started";

  return EX_OK;
}

void Daemon::RegisterDBusObjectsAsync(
    brillo::dbus_utils::AsyncEventSequencer* sequencer) {
  DCHECK(!dbus_object_);
  dbus_object_ = std::make_unique<brillo::dbus_utils::DBusObject>(
      nullptr, bus_, dbus::ObjectPath(kPciguardServicePath));

  brillo::dbus_utils::DBusInterface* dbus_interface =
      dbus_object_->AddOrGetInterface(kPciguardServiceInterface);
  CHECK(dbus_interface) << "Couldn't get dbus_interface";

  dbus_interface->AddSimpleMethodHandler(kSetExternalPciDevicesPermissionMethod,
                                         base::Unretained(this),
                                         &Daemon::HandleUserPermissionChanged);
  dev_blocked_signal_ =
      dbus_interface->RegisterSignal<std::string>(kPCIDeviceBlockedSignal);
  dbus_object_->RegisterAsync(sequencer->GetHandler(
      "Failed to register D-Bus object", true /* failure_is_fatal */));
}

void Daemon::HandleUserPermissionChanged(bool ext_pci_allowed) {
  DCHECK(event_handler_);
  event_handler_->OnUserPermissionChanged(ext_pci_allowed);
}

void Daemon::HandlePCIDeviceBlocked(const std::string& drvr) {
  auto signal = dev_blocked_signal_.lock();
  if (signal)
    signal->Send(drvr);
}

}  // namespace pciguard
