Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "extensions/common/permissions/usb_device_permission.h" | 5 #include "extensions/common/permissions/usb_device_permission.h" |
| 6 | 6 |
| 7 #include <set> | |
| 8 #include <string> | 7 #include <string> |
| 9 | 8 |
| 10 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/memory/ptr_util.h" | |
| 11 #include "base/strings/string16.h" | 11 #include "base/strings/string16.h" |
| 12 #include "base/strings/string_util.h" | 12 #include "base/strings/string_util.h" |
| 13 #include "base/strings/stringprintf.h" | 13 #include "base/strings/stringprintf.h" |
| 14 #include "base/strings/utf_string_conversions.h" | 14 #include "base/strings/utf_string_conversions.h" |
| 15 #include "device/usb/usb_descriptors.h" | |
| 16 #include "device/usb/usb_device.h" | |
| 15 #include "device/usb/usb_ids.h" | 17 #include "device/usb/usb_ids.h" |
| 18 #include "extensions/common/extension.h" | |
| 19 #include "extensions/common/features/behavior_feature.h" | |
| 20 #include "extensions/common/features/feature.h" | |
| 21 #include "extensions/common/features/feature_provider.h" | |
| 16 #include "extensions/common/permissions/permissions_info.h" | 22 #include "extensions/common/permissions/permissions_info.h" |
| 17 #include "grit/extensions_strings.h" | 23 #include "grit/extensions_strings.h" |
| 18 #include "ui/base/l10n/l10n_util.h" | 24 #include "ui/base/l10n/l10n_util.h" |
| 19 | 25 |
| 20 namespace extensions { | 26 namespace extensions { |
| 21 | 27 |
| 28 namespace { | |
| 29 | |
| 30 const int kHidInterfaceClass = 3; | |
| 31 | |
| 32 bool IsInterfaceClassPermissionAlowed(const Extension* extension) { | |
| 33 const Feature* feature = FeatureProvider::GetBehaviorFeature( | |
| 34 BehaviorFeature::kAllowUsbDevicesPermissionInterfaceClass); | |
| 35 if (!feature) | |
| 36 return false; | |
| 37 if (!extension) | |
| 38 return false; | |
| 39 return feature->IsAvailableToExtension(extension).is_available(); | |
| 40 } | |
| 41 | |
| 42 } // namespace | |
| 43 | |
| 44 // static | |
| 45 std::unique_ptr<UsbDevicePermission::CheckParam> | |
| 46 UsbDevicePermission::CheckParam::ForUsbDevice(const Extension* extension, | |
| 47 const device::UsbDevice* device) { | |
| 48 return CheckParam::ForUsbDeviceAndInterface( | |
| 49 extension, device, UsbDevicePermissionData::SPECIAL_VALUE_UNSPECIFIED); | |
| 50 } | |
| 51 | |
| 52 // static | |
| 53 std::unique_ptr<UsbDevicePermission::CheckParam> | |
| 54 UsbDevicePermission::CheckParam::ForDeviceWithAnyInterfaceClass( | |
| 55 const Extension* extension, | |
| 56 uint16_t vendor_id, | |
| 57 uint16_t product_id, | |
| 58 int interface_id) { | |
| 59 return base::MakeUnique<CheckParam>(extension, vendor_id, product_id, | |
| 60 std::unique_ptr<std::set<int>>(), | |
| 61 interface_id); | |
| 62 } | |
| 63 | |
| 64 // static | |
| 65 std::unique_ptr<UsbDevicePermission::CheckParam> | |
| 66 UsbDevicePermission::CheckParam::ForUsbDeviceAndInterface( | |
| 67 const Extension* extension, | |
| 68 const device::UsbDevice* device, | |
| 69 int interface_id) { | |
| 70 std::unique_ptr<std::set<int>> interface_classes(new std::set<int>()); | |
| 71 // If device class is set, match interface class against it as well. This is | |
| 72 // to enable filtering devices by device-only class (for example, hubs), which | |
| 73 // might or might not have an interface with class set to device class value. | |
| 74 if (device->device_class()) | |
| 75 interface_classes->insert(device->device_class()); | |
| 76 | |
| 77 if (device->active_configuration()) { | |
|
Reilly Grant (use Gerrit)
2016/10/25 18:33:08
We probably want to check all of the device's conf
tbarzic
2016/10/25 18:46:01
Done.
| |
| 78 for (const auto& interface : device->active_configuration()->interfaces) | |
| 79 interface_classes->insert(interface.interface_class); | |
| 80 } | |
| 81 | |
| 82 return base::MakeUnique<CheckParam>( | |
| 83 extension, device->vendor_id(), device->product_id(), | |
| 84 std::move(interface_classes), interface_id); | |
| 85 } | |
| 86 | |
| 87 // static | |
| 88 std::unique_ptr<UsbDevicePermission::CheckParam> | |
| 89 UsbDevicePermission::CheckParam::ForHidDevice(const Extension* extension, | |
| 90 uint16_t vendor_id, | |
| 91 uint16_t product_id) { | |
| 92 std::unique_ptr<std::set<int>> interface_classes(new std::set<int>()); | |
| 93 interface_classes->insert(kHidInterfaceClass); | |
| 94 return base::MakeUnique<UsbDevicePermission::CheckParam>( | |
| 95 extension, vendor_id, product_id, std::move(interface_classes), | |
| 96 UsbDevicePermissionData::SPECIAL_VALUE_UNSPECIFIED); | |
| 97 } | |
| 98 | |
| 99 UsbDevicePermission::CheckParam::CheckParam( | |
| 100 const Extension* extension, | |
| 101 uint16_t vendor_id, | |
| 102 uint16_t product_id, | |
| 103 std::unique_ptr<std::set<int>> interface_classes, | |
| 104 int interface_id) | |
| 105 : vendor_id(vendor_id), | |
| 106 product_id(product_id), | |
| 107 interface_classes(std::move(interface_classes)), | |
| 108 interface_id(interface_id), | |
| 109 interface_class_allowed(IsInterfaceClassPermissionAlowed(extension)) {} | |
| 110 | |
| 111 UsbDevicePermission::CheckParam::~CheckParam() {} | |
| 112 | |
| 22 UsbDevicePermission::UsbDevicePermission(const APIPermissionInfo* info) | 113 UsbDevicePermission::UsbDevicePermission(const APIPermissionInfo* info) |
| 23 : SetDisjunctionPermission<UsbDevicePermissionData, UsbDevicePermission>( | 114 : SetDisjunctionPermission<UsbDevicePermissionData, UsbDevicePermission>( |
| 24 info) {} | 115 info) {} |
| 25 | 116 |
| 26 UsbDevicePermission::~UsbDevicePermission() {} | 117 UsbDevicePermission::~UsbDevicePermission() {} |
| 27 | 118 |
| 28 bool UsbDevicePermission::FromValue( | 119 bool UsbDevicePermission::FromValue( |
| 29 const base::Value* value, | 120 const base::Value* value, |
| 30 std::string* error, | 121 std::string* error, |
| 31 std::vector<std::string>* unhandled_permissions) { | 122 std::vector<std::string>* unhandled_permissions) { |
| 32 bool parsed_ok = | 123 bool parsed_ok = |
| 33 SetDisjunctionPermission<UsbDevicePermissionData, UsbDevicePermission>:: | 124 SetDisjunctionPermission<UsbDevicePermissionData, UsbDevicePermission>:: |
| 34 FromValue(value, error, unhandled_permissions); | 125 FromValue(value, error, unhandled_permissions); |
| 35 if (parsed_ok && data_set_.empty()) { | 126 if (parsed_ok && data_set_.empty()) { |
| 36 if (error) | 127 if (error) |
| 37 *error = "NULL or empty permission list"; | 128 *error = "NULL or empty permission list"; |
| 38 return false; | 129 return false; |
| 39 } | 130 } |
| 40 return parsed_ok; | 131 return parsed_ok; |
| 41 } | 132 } |
| 42 | 133 |
| 43 PermissionIDSet UsbDevicePermission::GetPermissions() const { | 134 PermissionIDSet UsbDevicePermission::GetPermissions() const { |
| 44 PermissionIDSet ids; | 135 PermissionIDSet ids; |
| 45 | 136 |
| 46 std::set<uint16_t> unknown_product_vendors; | 137 std::set<uint16_t> unknown_product_vendors; |
| 47 bool found_unknown_vendor = false; | 138 bool found_unknown_vendor = false; |
| 48 | 139 |
| 49 for (const UsbDevicePermissionData& data : data_set_) { | 140 for (const UsbDevicePermissionData& data : data_set_) { |
| 141 // Interface class permissions should be only available in kiosk sessions, | |
| 142 // don't include those in installation warning for now. | |
| 143 if (data.interface_class() != UsbDevicePermissionData::SPECIAL_VALUE_ANY) | |
| 144 continue; | |
| 50 const char* vendor = device::UsbIds::GetVendorName(data.vendor_id()); | 145 const char* vendor = device::UsbIds::GetVendorName(data.vendor_id()); |
| 51 if (vendor) { | 146 if (vendor) { |
| 52 const char* product = | 147 const char* product = |
| 53 device::UsbIds::GetProductName(data.vendor_id(), data.product_id()); | 148 device::UsbIds::GetProductName(data.vendor_id(), data.product_id()); |
| 54 if (product) { | 149 if (product) { |
| 55 base::string16 product_name_and_vendor = l10n_util::GetStringFUTF16( | 150 base::string16 product_name_and_vendor = l10n_util::GetStringFUTF16( |
| 56 IDS_EXTENSION_USB_DEVICE_PRODUCT_NAME_AND_VENDOR, | 151 IDS_EXTENSION_USB_DEVICE_PRODUCT_NAME_AND_VENDOR, |
| 57 base::UTF8ToUTF16(product), base::UTF8ToUTF16(vendor)); | 152 base::UTF8ToUTF16(product), base::UTF8ToUTF16(vendor)); |
| 58 ids.insert(APIPermission::kUsbDevice, product_name_and_vendor); | 153 ids.insert(APIPermission::kUsbDevice, product_name_and_vendor); |
| 59 } else { | 154 } else { |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 71 base::UTF8ToUTF16(vendor)); | 166 base::UTF8ToUTF16(vendor)); |
| 72 } | 167 } |
| 73 | 168 |
| 74 if (found_unknown_vendor) | 169 if (found_unknown_vendor) |
| 75 ids.insert(APIPermission::kUsbDeviceUnknownVendor); | 170 ids.insert(APIPermission::kUsbDeviceUnknownVendor); |
| 76 | 171 |
| 77 return ids; | 172 return ids; |
| 78 } | 173 } |
| 79 | 174 |
| 80 } // namespace extensions | 175 } // namespace extensions |
| OLD | NEW |