1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "extensions/common/permissions/usb_device_permission_data.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "extensions/common/permissions/api_permission.h"
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "extensions/common/permissions/usb_device_permission.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char* kProductIdKey = "productId";
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char* kVendorIdKey = "vendorId";
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const char* kInterfaceIdKey = "interfaceId";
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UsbDevicePermissionData::UsbDevicePermissionData()
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  : vendor_id_(0), product_id_(0), interface_id_(ANY_INTERFACE) {
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UsbDevicePermissionData::UsbDevicePermissionData(uint16 vendor_id,
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 uint16 product_id,
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 int interface_id)
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  : vendor_id_(vendor_id),
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    product_id_(product_id),
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    interface_id_(interface_id) {
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool UsbDevicePermissionData::Check(
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const APIPermission::CheckParam* param) const {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!param)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const UsbDevicePermission::CheckParam& specific_param =
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *static_cast<const UsbDevicePermission::CheckParam*>(param);
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return vendor_id_ == specific_param.vendor_id &&
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         product_id_ == specific_param.product_id &&
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         (specific_param.interface_id == UNSPECIFIED_INTERFACE ||
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          interface_id_ == specific_param.interface_id);
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<base::Value> UsbDevicePermissionData::ToValue() const {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::DictionaryValue* result = new base::DictionaryValue();
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result->SetInteger(kVendorIdKey, vendor_id_);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result->SetInteger(kProductIdKey, product_id_);
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  result->SetInteger(kInterfaceIdKey, interface_id_);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return scoped_ptr<base::Value>(result);
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool UsbDevicePermissionData::FromValue(const base::Value* value) {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!value)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::DictionaryValue* dict_value;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!value->GetAsDictionary(&dict_value))
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int temp;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!dict_value->GetInteger(kVendorIdKey, &temp))
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (temp < 0 || temp > kuint16max)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  vendor_id_ = temp;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!dict_value->GetInteger(kProductIdKey, &temp))
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (temp < 0 || temp > kuint16max)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  product_id_ = temp;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!dict_value->GetInteger(kInterfaceIdKey, &temp))
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    interface_id_ = ANY_INTERFACE;
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  else if (temp < ANY_INTERFACE || temp > kuint8max)
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return false;
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  else
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    interface_id_ = temp;
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool UsbDevicePermissionData::operator<(
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const UsbDevicePermissionData& rhs) const {
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (vendor_id_ == rhs.vendor_id_) {
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (product_id_ == rhs.product_id_)
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return interface_id_ < rhs.interface_id_;
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return product_id_ < rhs.product_id_;
98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return vendor_id_ < rhs.vendor_id_;
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool UsbDevicePermissionData::operator==(
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const UsbDevicePermissionData& rhs) const {
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return vendor_id_ == rhs.vendor_id_ &&
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      product_id_ == rhs.product_id_ &&
106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      interface_id_ == rhs.interface_id_;
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace extensions
110