// Copyright (c) 2012 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 "permission_broker/deny_unsafe_hidraw_device_rule.h"

#include <libudev.h>

#include <vector>

namespace permission_broker {

namespace {

bool IsKeyboardUsage(const HidUsage& usage) {
  if (usage.page == HidUsage::PAGE_KEYBOARD)
    return true;

  if (usage.page == HidUsage::PAGE_GENERIC_DESKTOP) {
    return usage.usage == HidUsage::GENERIC_DESKTOP_USAGE_KEYBOARD ||
        usage.usage == HidUsage::GENERIC_DESKTOP_USAGE_KEYPAD;
  }

  return false;
}

bool IsPointerUsage(const HidUsage& usage) {
  if (usage.page == HidUsage::PAGE_GENERIC_DESKTOP) {
    return usage.usage == HidUsage::GENERIC_DESKTOP_USAGE_POINTER ||
        usage.usage == HidUsage::GENERIC_DESKTOP_USAGE_MOUSE;
  }
  return false;
}

bool IsSystemControlUsage(const HidUsage& usage) {
  if (usage.page != HidUsage::PAGE_GENERIC_DESKTOP)
    return false;
  if (usage.usage >= HidUsage::GENERIC_DESKTOP_USAGE_SYSTEM_CONTROL &&
      usage.usage <= HidUsage::GENERIC_DESKTOP_USAGE_SYSTEM_WARM_RESTART) {
    return true;
  }
  if (usage.usage >= HidUsage::GENERIC_DESKTOP_USAGE_SYSTEM_DOCK &&
      usage.usage <= HidUsage::GENERIC_DESKTOP_USAGE_SYSTEM_DISPLAY_SWAP) {
    return true;
  }
  return false;
}

}  // namespace

DenyUnsafeHidrawDeviceRule::DenyUnsafeHidrawDeviceRule()
    : HidrawSubsystemUdevRule("DenyUnsafeHidrawDeviceRule") {}

Rule::Result DenyUnsafeHidrawDeviceRule::ProcessHidrawDevice(
    struct udev_device *device) {
  std::vector<HidUsage> usages;
  if (!GetHidToplevelUsages(device, &usages)) {
    return IGNORE;
  }
  for (std::vector<HidUsage>::const_iterator iter = usages.begin();
       iter != usages.end(); ++iter) {
    if (IsUnsafeUsage(*iter)) {
      return DENY;
    }
  }
  return IGNORE;
}

// static
bool DenyUnsafeHidrawDeviceRule::IsUnsafeUsage(const HidUsage& usage) {
  return IsKeyboardUsage(usage) || IsPointerUsage(usage) ||
      IsSystemControlUsage(usage);
}

}  // namespace permission_broker
