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/web_usb_permission_provider.h" | 5 #include "chrome/browser/usb/web_usb_permission_provider.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
11 #include "chrome/browser/profiles/profile.h" | 11 #include "chrome/browser/profiles/profile.h" |
12 #include "chrome/browser/usb/usb_chooser_context.h" | 12 #include "chrome/browser/usb/usb_chooser_context.h" |
13 #include "chrome/browser/usb/usb_chooser_context_factory.h" | 13 #include "chrome/browser/usb/usb_chooser_context_factory.h" |
14 #include "chrome/common/chrome_switches.h" | 14 #include "chrome/common/chrome_switches.h" |
15 #include "content/public/browser/browser_thread.h" | 15 #include "content/public/browser/browser_thread.h" |
16 #include "content/public/browser/render_frame_host.h" | 16 #include "content/public/browser/render_frame_host.h" |
17 #include "content/public/browser/web_contents.h" | 17 #include "content/public/browser/web_contents.h" |
18 #include "device/usb/public/interfaces/device.mojom.h" | 18 #include "device/usb/usb_device.h" |
19 #include "device/usb/webusb_descriptors.h" | |
19 | 20 |
20 using content::WebContents; | 21 using content::WebContents; |
21 using device::usb::WebUsbDescriptorSet; | |
22 using device::usb::WebUsbConfigurationSubsetPtr; | |
23 using device::usb::WebUsbFunctionSubsetPtr; | |
24 | 22 |
25 namespace { | 23 namespace { |
26 | 24 |
27 bool FindOriginInDescriptorSet(const WebUsbDescriptorSet* set, | 25 bool FindOriginInDescriptorSet(const device::WebUsbAllowedOrigins* set, |
28 const GURL& origin, | 26 const GURL& origin, |
29 const uint8_t* configuration_value, | 27 const uint8_t* configuration_value, |
30 const uint8_t* first_interface) { | 28 const uint8_t* first_interface) { |
31 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 29 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
32 switches::kDisableWebUsbSecurity)) | 30 switches::kDisableWebUsbSecurity)) |
33 return true; | 31 return true; |
34 | 32 |
35 if (!set) | 33 if (!set) |
36 return false; | 34 return false; |
37 for (size_t i = 0; i < set->origins.size(); ++i) | 35 if (ContainsValue(set->origins, origin)) |
juncai
2016/04/01 17:05:24
add header:
#include "base/stl_util.h"
for using C
Reilly Grant (use Gerrit)
2016/04/01 21:56:33
Done.
| |
38 if (origin.spec() == set->origins[i]) | 36 return true; |
37 for (const auto& configuration : set->configurations) { | |
38 if (configuration_value && | |
39 *configuration_value != configuration.configuration_value) | |
40 continue; | |
41 if (ContainsValue(configuration.origins, origin)) | |
39 return true; | 42 return true; |
40 for (size_t i = 0; i < set->configurations.size(); ++i) { | 43 for (const auto& function : configuration.functions) { |
41 const WebUsbConfigurationSubsetPtr& config = set->configurations[i]; | 44 if (first_interface && *first_interface != function.first_interface) |
42 if (configuration_value && | 45 continue; |
43 *configuration_value != config->configuration_value) | 46 if (ContainsValue(function.origins, origin)) |
44 continue; | |
45 for (size_t j = 0; i < config->origins.size(); ++j) | |
46 if (origin.spec() == config->origins[j]) | |
47 return true; | 47 return true; |
48 for (size_t j = 0; j < config->functions.size(); ++j) { | |
49 const WebUsbFunctionSubsetPtr& function = config->functions[j]; | |
50 if (first_interface && *first_interface != function->first_interface) | |
51 continue; | |
52 for (size_t k = 0; k < function->origins.size(); ++k) | |
53 if (origin.spec() == function->origins[k]) | |
54 return true; | |
55 } | 48 } |
56 } | 49 } |
57 return false; | 50 return false; |
58 } | 51 } |
59 | 52 |
60 } // namespace | 53 } // namespace |
61 | 54 |
62 WebUSBPermissionProvider::WebUSBPermissionProvider( | 55 WebUSBPermissionProvider::WebUSBPermissionProvider( |
63 content::RenderFrameHost* render_frame_host) | 56 content::RenderFrameHost* render_frame_host) |
64 : render_frame_host_(render_frame_host), weak_factory_(this) { | 57 : render_frame_host_(render_frame_host), weak_factory_(this) { |
65 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 58 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
66 DCHECK(render_frame_host_); | 59 DCHECK(render_frame_host_); |
67 } | 60 } |
68 | 61 |
69 WebUSBPermissionProvider::~WebUSBPermissionProvider() {} | 62 WebUSBPermissionProvider::~WebUSBPermissionProvider() {} |
70 | 63 |
71 base::WeakPtr<device::usb::PermissionProvider> | 64 base::WeakPtr<device::usb::PermissionProvider> |
72 WebUSBPermissionProvider::GetWeakPtr() { | 65 WebUSBPermissionProvider::GetWeakPtr() { |
73 return weak_factory_.GetWeakPtr(); | 66 return weak_factory_.GetWeakPtr(); |
74 } | 67 } |
75 | 68 |
76 bool WebUSBPermissionProvider::HasDevicePermission( | 69 bool WebUSBPermissionProvider::HasDevicePermission( |
77 const device::usb::DeviceInfo& device_info) const { | 70 scoped_refptr<const device::UsbDevice> device) const { |
78 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 71 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
79 WebContents* web_contents = | 72 WebContents* web_contents = |
80 WebContents::FromRenderFrameHost(render_frame_host_); | 73 WebContents::FromRenderFrameHost(render_frame_host_); |
81 GURL embedding_origin = | 74 GURL embedding_origin = |
82 web_contents->GetMainFrame()->GetLastCommittedURL().GetOrigin(); | 75 web_contents->GetMainFrame()->GetLastCommittedURL().GetOrigin(); |
83 GURL requesting_origin = | 76 GURL requesting_origin = |
84 render_frame_host_->GetLastCommittedURL().GetOrigin(); | 77 render_frame_host_->GetLastCommittedURL().GetOrigin(); |
85 Profile* profile = | 78 Profile* profile = |
86 Profile::FromBrowserContext(web_contents->GetBrowserContext()); | 79 Profile::FromBrowserContext(web_contents->GetBrowserContext()); |
87 UsbChooserContext* chooser_context = | 80 UsbChooserContext* chooser_context = |
88 UsbChooserContextFactory::GetForProfile(profile); | 81 UsbChooserContextFactory::GetForProfile(profile); |
89 | 82 |
90 return FindOriginInDescriptorSet(device_info.webusb_allowed_origins.get(), | 83 return FindOriginInDescriptorSet(device->webusb_allowed_origins(), |
91 requesting_origin, nullptr, nullptr) && | 84 requesting_origin, nullptr, nullptr) && |
92 chooser_context->HasDevicePermission(requesting_origin, | 85 chooser_context->HasDevicePermission(requesting_origin, |
93 embedding_origin, device_info); | 86 embedding_origin, device); |
94 } | 87 } |
95 | 88 |
96 bool WebUSBPermissionProvider::HasConfigurationPermission( | 89 bool WebUSBPermissionProvider::HasConfigurationPermission( |
97 uint8_t requested_configuration_value, | 90 uint8_t requested_configuration_value, |
98 const device::usb::DeviceInfo& device_info) const { | 91 scoped_refptr<const device::UsbDevice> device) const { |
99 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 92 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
100 return FindOriginInDescriptorSet( | 93 return FindOriginInDescriptorSet( |
101 device_info.webusb_allowed_origins.get(), | 94 device->webusb_allowed_origins(), |
102 render_frame_host_->GetLastCommittedURL().GetOrigin(), | 95 render_frame_host_->GetLastCommittedURL().GetOrigin(), |
103 &requested_configuration_value, nullptr); | 96 &requested_configuration_value, nullptr); |
104 } | 97 } |
105 | 98 |
106 bool WebUSBPermissionProvider::HasFunctionPermission( | 99 bool WebUSBPermissionProvider::HasFunctionPermission( |
107 uint8_t requested_function, | 100 uint8_t requested_function, |
108 uint8_t configuration_value, | 101 uint8_t configuration_value, |
109 const device::usb::DeviceInfo& device_info) const { | 102 scoped_refptr<const device::UsbDevice> device) const { |
110 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 103 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
111 return FindOriginInDescriptorSet( | 104 return FindOriginInDescriptorSet( |
112 device_info.webusb_allowed_origins.get(), | 105 device->webusb_allowed_origins(), |
113 render_frame_host_->GetLastCommittedURL().GetOrigin(), | 106 render_frame_host_->GetLastCommittedURL().GetOrigin(), |
114 &configuration_value, &requested_function); | 107 &configuration_value, &requested_function); |
115 } | 108 } |
OLD | NEW |