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

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

Issue 2418353002: Allow interfaceClass USB device permissions (Closed)
Patch Set: . Created 4 years, 1 month 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
77 for (const auto& configuration : device->configurations()) {
78 for (const auto& interface : 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
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
OLDNEW
« no previous file with comments | « extensions/common/permissions/usb_device_permission.h ('k') | extensions/common/permissions/usb_device_permission_data.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698