blob: 472f9d6cd65ae020ed0198ede69a2602895b94f7 [file] [log] [blame]
Rajat Jain8e567e22020-11-03 14:59:28 -08001// Copyright 2020 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "pciguard/daemon.h"
Rajat Jain5bf732b2021-01-22 14:57:59 -08006#include "pciguard/sysfs_utils.h"
Rajat Jain8e567e22020-11-03 14:59:28 -08007
Qijiang Fan713061e2021-03-08 15:45:12 +09008#include <base/check.h>
Rajat Jainbec689a2021-01-07 16:30:55 -08009#include <dbus/pciguard/dbus-constants.h>
Rajat Jain8e567e22020-11-03 14:59:28 -080010#include <sysexits.h>
11
12namespace pciguard {
13
Rajat Jainbec689a2021-01-07 16:30:55 -080014Daemon::Daemon() : DBusServiceDaemon(kPciguardServiceName) {}
15
Rajat Jain8e567e22020-11-03 14:59:28 -080016int Daemon::OnInit() {
17 LOG(INFO) << "pciguard daemon starting...";
18
Rajat Jain5bf732b2021-01-22 14:57:59 -080019 utils_ = std::make_unique<SysfsUtils>();
20 int exit_code = utils_->OnInit();
Rajat Jain8e567e22020-11-03 14:59:28 -080021 if (exit_code != EX_OK)
22 return exit_code;
23
Rajat Jain5bf732b2021-01-22 14:57:59 -080024 event_handler_ = std::make_unique<EventHandler>(utils_.get());
Rajat Jain8e567e22020-11-03 14:59:28 -080025
Rajat Jainbec689a2021-01-07 16:30:55 -080026 exit_code = DBusServiceDaemon::OnInit();
27 if (exit_code != EX_OK)
28 return exit_code;
29
Rajat Jain8e567e22020-11-03 14:59:28 -080030 // Begin monitoring the session events
Rajat Jain5bf732b2021-01-22 14:57:59 -080031 session_monitor_ =
32 std::make_unique<SessionMonitor>(bus_, event_handler_.get());
Rajat Jain8e567e22020-11-03 14:59:28 -080033 // Begin monitoring the thunderbolt udev events
Rajat Jainebe88992021-03-05 10:52:55 -080034 UdevMonitor::PcidevBlockedFn cb = [this](const std::string& drvr) {
35 HandlePCIDeviceBlocked(drvr);
36 };
37 udev_monitor_ = std::make_unique<UdevMonitor>(event_handler_.get(), cb);
Rajat Jain8e567e22020-11-03 14:59:28 -080038
39 LOG(INFO) << "pciguard daemon started";
40
41 return EX_OK;
42}
43
Rajat Jainbec689a2021-01-07 16:30:55 -080044void Daemon::RegisterDBusObjectsAsync(
45 brillo::dbus_utils::AsyncEventSequencer* sequencer) {
46 DCHECK(!dbus_object_);
47 dbus_object_ = std::make_unique<brillo::dbus_utils::DBusObject>(
48 nullptr, bus_, dbus::ObjectPath(kPciguardServicePath));
49
50 brillo::dbus_utils::DBusInterface* dbus_interface =
51 dbus_object_->AddOrGetInterface(kPciguardServiceInterface);
52 CHECK(dbus_interface) << "Couldn't get dbus_interface";
53
54 dbus_interface->AddSimpleMethodHandler(kSetExternalPciDevicesPermissionMethod,
55 base::Unretained(this),
56 &Daemon::HandleUserPermissionChanged);
Rajat Jainebe88992021-03-05 10:52:55 -080057 dev_blocked_signal_ =
58 dbus_interface->RegisterSignal<std::string>(kPCIDeviceBlockedSignal);
Rajat Jainbec689a2021-01-07 16:30:55 -080059 dbus_object_->RegisterAsync(sequencer->GetHandler(
60 "Failed to register D-Bus object", true /* failure_is_fatal */));
61}
62
63void Daemon::HandleUserPermissionChanged(bool ext_pci_allowed) {
64 DCHECK(event_handler_);
65 event_handler_->OnUserPermissionChanged(ext_pci_allowed);
66}
Rajat Jainebe88992021-03-05 10:52:55 -080067
68void Daemon::HandlePCIDeviceBlocked(const std::string& drvr) {
69 auto signal = dev_blocked_signal_.lock();
70 if (signal)
71 signal->Send(drvr);
72}
73
Rajat Jain8e567e22020-11-03 14:59:28 -080074} // namespace pciguard