blob: d349511aaa979a6b45425bd43fc6f78d13bf9f9f [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 Jain5bf732b2021-01-22 14:57:59 -080034 tbt_udev_monitor_ = std::make_unique<TbtUdevMonitor>(event_handler_.get());
Rajat Jain8e567e22020-11-03 14:59:28 -080035
36 LOG(INFO) << "pciguard daemon started";
37
38 return EX_OK;
39}
40
Rajat Jainbec689a2021-01-07 16:30:55 -080041void Daemon::RegisterDBusObjectsAsync(
42 brillo::dbus_utils::AsyncEventSequencer* sequencer) {
43 DCHECK(!dbus_object_);
44 dbus_object_ = std::make_unique<brillo::dbus_utils::DBusObject>(
45 nullptr, bus_, dbus::ObjectPath(kPciguardServicePath));
46
47 brillo::dbus_utils::DBusInterface* dbus_interface =
48 dbus_object_->AddOrGetInterface(kPciguardServiceInterface);
49 CHECK(dbus_interface) << "Couldn't get dbus_interface";
50
51 dbus_interface->AddSimpleMethodHandler(kSetExternalPciDevicesPermissionMethod,
52 base::Unretained(this),
53 &Daemon::HandleUserPermissionChanged);
54 dbus_object_->RegisterAsync(sequencer->GetHandler(
55 "Failed to register D-Bus object", true /* failure_is_fatal */));
56}
57
58void Daemon::HandleUserPermissionChanged(bool ext_pci_allowed) {
59 DCHECK(event_handler_);
60 event_handler_->OnUserPermissionChanged(ext_pci_allowed);
61}
Rajat Jain8e567e22020-11-03 14:59:28 -080062} // namespace pciguard