blob: e42096ef93a31ce18454e389a6ab2267ced9b9f5 [file] [log] [blame]
// 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