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 } | |
|
Reilly Grant (use Gerrit)
2016/10/20 23:16:52
nit: No braces around single-line ifs.
tbarzic
2016/10/21 00:05:05
Done.
| |
| 77 if (device->active_configuration()) { | |
| 78 for (const auto& interface : device->active_configuration()->interfaces) { | |
| 79 interface_classes->insert(interface.interface_class); | |
| 80 } | |
|
Reilly Grant (use Gerrit)
2016/10/20 23:16:52
nit: No braces around single-line loops.
tbarzic
2016/10/21 00:05:05
Done.
| |
| 81 } | |
| 82 | |
| 83 return base::MakeUnique<CheckParam>( | |
| 84 extension, device->vendor_id(), device->product_id(), | |
| 85 std::move(interface_classes), interface_id); | |
| 86 } | |
| 87 | |
| 88 // static | |
| 89 std::unique_ptr<UsbDevicePermission::CheckParam> | |
| 90 UsbDevicePermission::CheckParam::ForHidDevice(const Extension* extension, | |
| 91 uint16_t vendor_id, | |
| 92 uint16_t product_id) { | |
| 93 std::unique_ptr<std::set<int>> interface_classes(new std::set<int>()); | |
| 94 interface_classes->insert(kHidInterfaceClass); | |
| 95 return base::MakeUnique<UsbDevicePermission::CheckParam>( | |
| 96 extension, vendor_id, product_id, std::move(interface_classes), | |
| 97 UsbDevicePermissionData::SPECIAL_VALUE_UNSPECIFIED); | |
| 98 } | |
| 99 | |
| 100 UsbDevicePermission::CheckParam::CheckParam( | |
| 101 const Extension* extension, | |
| 102 uint16_t vendor_id, | |
| 103 uint16_t product_id, | |
| 104 std::unique_ptr<std::set<int>> interface_classes, | |
| 105 int interface_id) | |
| 106 : vendor_id(vendor_id), | |
| 107 product_id(product_id), | |
| 108 interface_classes(std::move(interface_classes)), | |
| 109 interface_id(interface_id), | |
| 110 interface_class_allowed(IsInterfaceClassPermissionAlowed(extension)) {} | |
| 111 | |
| 112 UsbDevicePermission::CheckParam::~CheckParam() {} | |
| 113 | |
| 22 UsbDevicePermission::UsbDevicePermission(const APIPermissionInfo* info) | 114 UsbDevicePermission::UsbDevicePermission(const APIPermissionInfo* info) |
| 23 : SetDisjunctionPermission<UsbDevicePermissionData, UsbDevicePermission>( | 115 : SetDisjunctionPermission<UsbDevicePermissionData, UsbDevicePermission>( |
| 24 info) {} | 116 info) {} |
| 25 | 117 |
| 26 UsbDevicePermission::~UsbDevicePermission() {} | 118 UsbDevicePermission::~UsbDevicePermission() {} |
| 27 | 119 |
| 28 bool UsbDevicePermission::FromValue( | 120 bool UsbDevicePermission::FromValue( |
| 29 const base::Value* value, | 121 const base::Value* value, |
| 30 std::string* error, | 122 std::string* error, |
| 31 std::vector<std::string>* unhandled_permissions) { | 123 std::vector<std::string>* unhandled_permissions) { |
| 32 bool parsed_ok = | 124 bool parsed_ok = |
| 33 SetDisjunctionPermission<UsbDevicePermissionData, UsbDevicePermission>:: | 125 SetDisjunctionPermission<UsbDevicePermissionData, UsbDevicePermission>:: |
| 34 FromValue(value, error, unhandled_permissions); | 126 FromValue(value, error, unhandled_permissions); |
| 35 if (parsed_ok && data_set_.empty()) { | 127 if (parsed_ok && data_set_.empty()) { |
| 36 if (error) | 128 if (error) |
| 37 *error = "NULL or empty permission list"; | 129 *error = "NULL or empty permission list"; |
| 38 return false; | 130 return false; |
| 39 } | 131 } |
| 40 return parsed_ok; | 132 return parsed_ok; |
| 41 } | 133 } |
| 42 | 134 |
| 43 PermissionIDSet UsbDevicePermission::GetPermissions() const { | 135 PermissionIDSet UsbDevicePermission::GetPermissions() const { |
| 44 PermissionIDSet ids; | 136 PermissionIDSet ids; |
| 45 | 137 |
| 46 std::set<uint16_t> unknown_product_vendors; | 138 std::set<uint16_t> unknown_product_vendors; |
| 47 bool found_unknown_vendor = false; | 139 bool found_unknown_vendor = false; |
| 48 | 140 |
| 49 for (const UsbDevicePermissionData& data : data_set_) { | 141 for (const UsbDevicePermissionData& data : data_set_) { |
| 142 // Interface class permissions should be only available in kiosk sessions, | |
| 143 // don't include those in installation warning for now. | |
| 144 if (data.interface_class() != UsbDevicePermissionData::SPECIAL_VALUE_ANY) | |
| 145 continue; | |
| 50 const char* vendor = device::UsbIds::GetVendorName(data.vendor_id()); | 146 const char* vendor = device::UsbIds::GetVendorName(data.vendor_id()); |
| 51 if (vendor) { | 147 if (vendor) { |
| 52 const char* product = | 148 const char* product = |
| 53 device::UsbIds::GetProductName(data.vendor_id(), data.product_id()); | 149 device::UsbIds::GetProductName(data.vendor_id(), data.product_id()); |
| 54 if (product) { | 150 if (product) { |
| 55 base::string16 product_name_and_vendor = l10n_util::GetStringFUTF16( | 151 base::string16 product_name_and_vendor = l10n_util::GetStringFUTF16( |
| 56 IDS_EXTENSION_USB_DEVICE_PRODUCT_NAME_AND_VENDOR, | 152 IDS_EXTENSION_USB_DEVICE_PRODUCT_NAME_AND_VENDOR, |
| 57 base::UTF8ToUTF16(product), base::UTF8ToUTF16(vendor)); | 153 base::UTF8ToUTF16(product), base::UTF8ToUTF16(vendor)); |
| 58 ids.insert(APIPermission::kUsbDevice, product_name_and_vendor); | 154 ids.insert(APIPermission::kUsbDevice, product_name_and_vendor); |
| 59 } else { | 155 } else { |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 71 base::UTF8ToUTF16(vendor)); | 167 base::UTF8ToUTF16(vendor)); |
| 72 } | 168 } |
| 73 | 169 |
| 74 if (found_unknown_vendor) | 170 if (found_unknown_vendor) |
| 75 ids.insert(APIPermission::kUsbDeviceUnknownVendor); | 171 ids.insert(APIPermission::kUsbDeviceUnknownVendor); |
| 76 | 172 |
| 77 return ids; | 173 return ids; |
| 78 } | 174 } |
| 79 | 175 |
| 80 } // namespace extensions | 176 } // namespace extensions |
| OLD | NEW |