| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "chrome/browser/usb/usb_chooser_context.h" | 5 #include "chrome/browser/usb/usb_chooser_context.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/metrics/histogram_macros.h" |
| 10 #include "base/stl_util.h" | 11 #include "base/stl_util.h" |
| 11 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
| 12 #include "base/values.h" | 13 #include "base/values.h" |
| 13 #include "chrome/browser/profiles/profile.h" | 14 #include "chrome/browser/profiles/profile.h" |
| 14 #include "device/core/device_client.h" | 15 #include "device/core/device_client.h" |
| 15 #include "device/usb/usb_device.h" | 16 #include "device/usb/usb_device.h" |
| 16 | 17 |
| 17 using device::UsbDevice; | 18 using device::UsbDevice; |
| 18 | 19 |
| 19 namespace { | 20 namespace { |
| 20 | 21 |
| 21 const char kDeviceNameKey[] = "name"; | 22 const char kDeviceNameKey[] = "name"; |
| 22 const char kGuidKey[] = "ephemeral-guid"; | 23 const char kGuidKey[] = "ephemeral-guid"; |
| 23 const char kProductIdKey[] = "product-id"; | 24 const char kProductIdKey[] = "product-id"; |
| 24 const char kSerialNumberKey[] = "serial-number"; | 25 const char kSerialNumberKey[] = "serial-number"; |
| 25 const char kVendorIdKey[] = "vendor-id"; | 26 const char kVendorIdKey[] = "vendor-id"; |
| 26 | 27 |
| 28 enum WebUsbPermissionRevoked { |
| 29 // Permission to access a USB device was revoked by the user. |
| 30 WEBUSB_PERMISSION_REVOKED = 0, |
| 31 // Permission to access an ephemeral USB device was revoked by the user. |
| 32 WEBUSB_PERMISSION_REVOKED_EPHEMERAL, |
| 33 // Maximum value for the enum. |
| 34 WEBUSB_PERMISSION_REVOKED_MAX |
| 35 }; |
| 36 |
| 37 void RecordPermissionRevocation(WebUsbPermissionRevoked kind) { |
| 38 UMA_HISTOGRAM_ENUMERATION("WebUsb.PermissionRevoked", kind, |
| 39 WEBUSB_PERMISSION_REVOKED_MAX); |
| 40 } |
| 41 |
| 27 bool CanStorePersistentEntry(const scoped_refptr<const UsbDevice>& device) { | 42 bool CanStorePersistentEntry(const scoped_refptr<const UsbDevice>& device) { |
| 28 return !device->serial_number().empty(); | 43 return !device->serial_number().empty(); |
| 29 } | 44 } |
| 30 | 45 |
| 31 const base::DictionaryValue* FindForDevice( | 46 const base::DictionaryValue* FindForDevice( |
| 32 const std::vector<scoped_ptr<base::DictionaryValue>>& device_list, | 47 const std::vector<scoped_ptr<base::DictionaryValue>>& device_list, |
| 33 const scoped_refptr<const UsbDevice>& device) { | 48 const scoped_refptr<const UsbDevice>& device) { |
| 34 const std::string utf8_serial_number = | 49 const std::string utf8_serial_number = |
| 35 base::UTF16ToUTF8(device->serial_number()); | 50 base::UTF16ToUTF8(device->serial_number()); |
| 36 | 51 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 return objects; | 124 return objects; |
| 110 } | 125 } |
| 111 | 126 |
| 112 void UsbChooserContext::RevokeObjectPermission( | 127 void UsbChooserContext::RevokeObjectPermission( |
| 113 const GURL& requesting_origin, | 128 const GURL& requesting_origin, |
| 114 const GURL& embedding_origin, | 129 const GURL& embedding_origin, |
| 115 const base::DictionaryValue& object) { | 130 const base::DictionaryValue& object) { |
| 116 std::string guid; | 131 std::string guid; |
| 117 if (object.GetString(kGuidKey, &guid)) { | 132 if (object.GetString(kGuidKey, &guid)) { |
| 118 RevokeDevicePermission(requesting_origin, embedding_origin, guid); | 133 RevokeDevicePermission(requesting_origin, embedding_origin, guid); |
| 134 RecordPermissionRevocation(WEBUSB_PERMISSION_REVOKED_EPHEMERAL); |
| 119 } else { | 135 } else { |
| 120 ChooserContextBase::RevokeObjectPermission(requesting_origin, | 136 ChooserContextBase::RevokeObjectPermission(requesting_origin, |
| 121 embedding_origin, object); | 137 embedding_origin, object); |
| 138 RecordPermissionRevocation(WEBUSB_PERMISSION_REVOKED); |
| 122 } | 139 } |
| 123 } | 140 } |
| 124 | 141 |
| 125 void UsbChooserContext::GrantDevicePermission(const GURL& requesting_origin, | 142 void UsbChooserContext::GrantDevicePermission(const GURL& requesting_origin, |
| 126 const GURL& embedding_origin, | 143 const GURL& embedding_origin, |
| 127 const std::string& guid) { | 144 const std::string& guid) { |
| 128 scoped_refptr<UsbDevice> device = usb_service_->GetDevice(guid); | 145 scoped_refptr<UsbDevice> device = usb_service_->GetDevice(guid); |
| 129 if (!device) | 146 if (!device) |
| 130 return; | 147 return; |
| 131 | 148 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 bool UsbChooserContext::IsValidObject(const base::DictionaryValue& object) { | 202 bool UsbChooserContext::IsValidObject(const base::DictionaryValue& object) { |
| 186 return object.size() == 4 && object.HasKey(kDeviceNameKey) && | 203 return object.size() == 4 && object.HasKey(kDeviceNameKey) && |
| 187 object.HasKey(kVendorIdKey) && object.HasKey(kProductIdKey) && | 204 object.HasKey(kVendorIdKey) && object.HasKey(kProductIdKey) && |
| 188 object.HasKey(kSerialNumberKey); | 205 object.HasKey(kSerialNumberKey); |
| 189 } | 206 } |
| 190 | 207 |
| 191 void UsbChooserContext::OnDeviceRemoved(scoped_refptr<UsbDevice> device) { | 208 void UsbChooserContext::OnDeviceRemoved(scoped_refptr<UsbDevice> device) { |
| 192 for (auto& map_entry : ephemeral_devices_) | 209 for (auto& map_entry : ephemeral_devices_) |
| 193 map_entry.second.erase(device->guid()); | 210 map_entry.second.erase(device->guid()); |
| 194 } | 211 } |
| OLD | NEW |