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