Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1827)

Side by Side Diff: extensions/common/permissions/usb_device_permission.cc

Issue 2418353002: Allow interfaceClass USB device permissions (Closed)
Patch Set: Allow interfaceClass USB device permissions Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698