# Copyright 2018 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.

import("//common-mk/generate-dbus-adaptors.gni")
import("//common-mk/pkg_config.gni")

group("all") {
  deps = [
    ":permission_broker",
  ]
  if (use.test) {
    deps += [ ":permission_broker_test" ]
  }
  if (use.fuzzer) {
    deps += [
      ":firewall_fuzzer",
      ":port_tracker_fuzzer"
    ]
  }
}

pkg_config("target_defaults_deps") {
  pkg_deps = [
    "dbus-1",
    "libbrillo-${libbase_ver}",
    "libchrome-${libbase_ver}",
    "libudev",
    "libusb-1.0",
  ]
}

config("target_defaults") {
  defines = [ "USE_CFM_ENABLED_DEVICE=${use.cfm_enabled_device}" ]
  configs = [ ":target_defaults_deps" ]
}

generate_dbus_adaptors("permission_broker_adaptors") {
  dbus_service_config = "dbus_bindings/dbus-service-config.json"
  dbus_adaptors_out_dir = "include/permission_broker/dbus_adaptors"
  new_fd_bindings = true
  sources = [
    "dbus_bindings/org.chromium.PermissionBroker.xml",
  ]
}

static_library("libpermission_broker") {
  configs += [ ":target_defaults" ]
  deps = [
    ":permission_broker_adaptors",
  ]
  libs = [ "policy-${libbase_ver}" ]
  sources = [
    "allow_group_tty_device_rule.cc",
    "allow_hidraw_device_rule.cc",
    "allow_tty_device_rule.cc",
    "allow_usb_device_rule.cc",
    "deny_claimed_hidraw_device_rule.cc",
    "deny_claimed_usb_device_rule.cc",
    "deny_fwupdate_hidraw_device_rule.cc",
    "deny_group_tty_device_rule.cc",
    "deny_uninitialized_device_rule.cc",
    "deny_unsafe_hidraw_device_rule.cc",
    "deny_usb_device_class_rule.cc",
    "deny_usb_vendor_id_rule.cc",
    "firewall.cc",
    "hidraw_subsystem_udev_rule.cc",
    "libusb_wrapper.cc",
    "permission_broker.cc",
    "port_tracker.cc",
    "rule.cc",
    "rule_engine.cc",
    "tty_subsystem_udev_rule.cc",
    "udev_scopers.cc",
    "usb_control.cc",
    "usb_driver_tracker.cc",
    "usb_subsystem_udev_rule.cc",
  ]
}

executable("permission_broker") {
  configs += [ ":target_defaults" ]
  deps = [
    ":libpermission_broker",
  ]
  sources = [
    "permission_broker_main.cc",
  ]
}

if (use.test) {
  pkg_config("permission_broker_test_config") {
    pkg_deps = [
      "libbrillo-test-${libbase_ver}",
      "libchrome-test-${libbase_ver}",
    ]
  }
  executable("permission_broker_test") {
    configs += [
      "//common-mk:test",
      ":permission_broker_test_config",
      ":target_defaults",
    ]
    deps = [
      ":libpermission_broker",
      "../common-mk/testrunner:testrunner",
    ]
    sources = [
      "allow_tty_device_rule_test.cc",
      "allow_usb_device_rule_test.cc",
      "deny_claimed_hidraw_device_rule_test.cc",
      "deny_claimed_usb_device_rule_test.cc",
      "deny_fwupdate_hidraw_device_rule_test.cc",
      "deny_unsafe_hidraw_device_rule_test.cc",
      "deny_usb_device_class_rule_test.cc",
      "deny_usb_vendor_id_rule_test.cc",
      "fake_libusb_wrapper.cc",
      "firewall_test.cc",
      "group_tty_device_rule_test.cc",
      "mock_firewall.cc",
      "port_tracker_test.cc",
      "rule_engine_test.cc",
      "rule_test.cc",
      "usb_control_test.cc",
    ]
  }
}

# Fuzzer target.
if (use.fuzzer) {
  pkg_config("permission_broker_fuzzer_config") {
    pkg_deps = [ "libchrome-test-${libbase_ver}" ]
  }
  executable("firewall_fuzzer") {
    configs += [
      "//common-mk/common_fuzzer:common_fuzzer",
      ":permission_broker_fuzzer_config",
      ":target_defaults",
    ]
    deps = [
      ":libpermission_broker",
    ]
    sources = [
      "firewall_fuzzer.cc",
    ]
  }
  executable("port_tracker_fuzzer") {
    configs += [
      "//common-mk/common_fuzzer:common_fuzzer",
      ":permission_broker_fuzzer_config",
      ":target_defaults",
    ]
    deps = [
      ":libpermission_broker",
    ]
    sources = [
      "port_tracker_fuzzer.cc",
    ]
  }
}
