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/stl_util.h" | 10 #include "base/stl_util.h" |
11 #include "chrome/browser/profiles/profile.h" | 11 #include "chrome/browser/profiles/profile.h" |
12 #include "chrome/browser/usb/usb_blocklist.h" | 12 #include "chrome/browser/usb/usb_blocklist.h" |
13 #include "chrome/browser/usb/usb_chooser_context.h" | 13 #include "chrome/browser/usb/usb_chooser_context.h" |
14 #include "chrome/browser/usb/usb_chooser_context_factory.h" | 14 #include "chrome/browser/usb/usb_chooser_context_factory.h" |
15 #include "chrome/browser/usb/usb_tab_helper.h" | 15 #include "chrome/browser/usb/usb_tab_helper.h" |
16 #include "content/public/browser/browser_thread.h" | 16 #include "content/public/browser/browser_thread.h" |
17 #include "content/public/browser/render_frame_host.h" | 17 #include "content/public/browser/render_frame_host.h" |
18 #include "content/public/browser/web_contents.h" | 18 #include "content/public/browser/web_contents.h" |
19 #include "device/usb/usb_device.h" | 19 #include "device/usb/usb_device.h" |
20 #include "device/usb/webusb_descriptors.h" | |
21 | 20 |
22 using content::RenderFrameHost; | 21 using content::RenderFrameHost; |
23 using content::WebContents; | 22 using content::WebContents; |
24 | 23 |
25 // static | 24 // static |
26 bool WebUSBPermissionProvider::HasDevicePermission( | 25 bool WebUSBPermissionProvider::HasDevicePermission( |
27 UsbChooserContext* chooser_context, | 26 UsbChooserContext* chooser_context, |
28 const GURL& requesting_origin, | 27 const GURL& requesting_origin, |
29 const GURL& embedding_origin, | 28 const GURL& embedding_origin, |
30 bool is_embedded_frame, | |
31 scoped_refptr<const device::UsbDevice> device) { | 29 scoped_refptr<const device::UsbDevice> device) { |
32 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 30 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
33 | 31 |
34 if (UsbBlocklist::Get().IsExcluded(device)) | 32 if (UsbBlocklist::Get().IsExcluded(device)) |
35 return false; | 33 return false; |
36 | 34 |
37 if (!chooser_context->HasDevicePermission(requesting_origin, embedding_origin, | 35 return chooser_context->HasDevicePermission(requesting_origin, |
38 device)) { | 36 embedding_origin, device); |
39 return false; | |
40 } | |
41 | |
42 // On Android it is not possible to read the WebUSB descriptors until Chrome | |
43 // has been granted permission to open it. Instead we grant provisional access | |
44 // to the device and perform the allowed origins check when the client tries | |
45 // to open it. | |
46 if (!device->permission_granted()) | |
47 return true; | |
48 | |
49 // Embedded frames must have their origin in the list provided by the device. | |
50 if (is_embedded_frame) { | |
51 return device::FindInWebUsbAllowedOrigins(device->webusb_allowed_origins(), | |
52 requesting_origin, base::nullopt, | |
53 base::nullopt); | |
54 } | |
55 | |
56 return true; | |
57 } | 37 } |
58 | 38 |
59 WebUSBPermissionProvider::WebUSBPermissionProvider( | 39 WebUSBPermissionProvider::WebUSBPermissionProvider( |
60 RenderFrameHost* render_frame_host) | 40 RenderFrameHost* render_frame_host) |
61 : render_frame_host_(render_frame_host), weak_factory_(this) { | 41 : render_frame_host_(render_frame_host), weak_factory_(this) { |
62 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 42 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
63 DCHECK(render_frame_host_); | 43 DCHECK(render_frame_host_); |
64 } | 44 } |
65 | 45 |
66 WebUSBPermissionProvider::~WebUSBPermissionProvider() {} | 46 WebUSBPermissionProvider::~WebUSBPermissionProvider() {} |
67 | 47 |
68 base::WeakPtr<device::usb::PermissionProvider> | 48 base::WeakPtr<device::usb::PermissionProvider> |
69 WebUSBPermissionProvider::GetWeakPtr() { | 49 WebUSBPermissionProvider::GetWeakPtr() { |
70 return weak_factory_.GetWeakPtr(); | 50 return weak_factory_.GetWeakPtr(); |
71 } | 51 } |
72 | 52 |
73 bool WebUSBPermissionProvider::HasDevicePermission( | 53 bool WebUSBPermissionProvider::HasDevicePermission( |
74 scoped_refptr<const device::UsbDevice> device) const { | 54 scoped_refptr<const device::UsbDevice> device) const { |
75 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 55 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
76 | 56 |
77 WebContents* web_contents = | 57 WebContents* web_contents = |
78 WebContents::FromRenderFrameHost(render_frame_host_); | 58 WebContents::FromRenderFrameHost(render_frame_host_); |
79 RenderFrameHost* main_frame = web_contents->GetMainFrame(); | 59 RenderFrameHost* main_frame = web_contents->GetMainFrame(); |
80 Profile* profile = | 60 Profile* profile = |
81 Profile::FromBrowserContext(web_contents->GetBrowserContext()); | 61 Profile::FromBrowserContext(web_contents->GetBrowserContext()); |
82 | 62 |
83 return HasDevicePermission( | 63 return HasDevicePermission( |
84 UsbChooserContextFactory::GetForProfile(profile), | 64 UsbChooserContextFactory::GetForProfile(profile), |
85 render_frame_host_->GetLastCommittedURL().GetOrigin(), | 65 render_frame_host_->GetLastCommittedURL().GetOrigin(), |
86 main_frame->GetLastCommittedURL().GetOrigin(), | 66 main_frame->GetLastCommittedURL().GetOrigin(), device); |
87 render_frame_host_ != main_frame, device); | |
88 } | |
89 | |
90 bool WebUSBPermissionProvider::HasConfigurationPermission( | |
91 uint8_t requested_configuration_value, | |
92 scoped_refptr<const device::UsbDevice> device) const { | |
93 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | |
94 | |
95 // Embedded frames may only access configurations if their origin in the list | |
96 // provided by the device. | |
97 RenderFrameHost* main_frame = | |
98 WebContents::FromRenderFrameHost(render_frame_host_)->GetMainFrame(); | |
99 if (render_frame_host_ != main_frame) { | |
100 return device::FindInWebUsbAllowedOrigins( | |
101 device->webusb_allowed_origins(), | |
102 render_frame_host_->GetLastCommittedURL().GetOrigin(), | |
103 requested_configuration_value, base::nullopt); | |
104 } | |
105 | |
106 return true; | |
107 } | |
108 | |
109 bool WebUSBPermissionProvider::HasFunctionPermission( | |
110 uint8_t requested_function, | |
111 uint8_t configuration_value, | |
112 scoped_refptr<const device::UsbDevice> device) const { | |
113 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | |
114 | |
115 // Embedded frames may only access configurations if their origin in the list | |
116 // provided by the device. | |
117 RenderFrameHost* main_frame = | |
118 WebContents::FromRenderFrameHost(render_frame_host_)->GetMainFrame(); | |
119 if (render_frame_host_ != main_frame) { | |
120 return device::FindInWebUsbAllowedOrigins( | |
121 device->webusb_allowed_origins(), | |
122 render_frame_host_->GetLastCommittedURL().GetOrigin(), | |
123 configuration_value, requested_function); | |
124 } | |
125 | |
126 return true; | |
127 } | 67 } |
128 | 68 |
129 void WebUSBPermissionProvider::IncrementConnectionCount() { | 69 void WebUSBPermissionProvider::IncrementConnectionCount() { |
130 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 70 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
131 WebContents* web_contents = | 71 WebContents* web_contents = |
132 WebContents::FromRenderFrameHost(render_frame_host_); | 72 WebContents::FromRenderFrameHost(render_frame_host_); |
133 UsbTabHelper* tab_helper = UsbTabHelper::FromWebContents(web_contents); | 73 UsbTabHelper* tab_helper = UsbTabHelper::FromWebContents(web_contents); |
134 tab_helper->IncrementConnectionCount(render_frame_host_); | 74 tab_helper->IncrementConnectionCount(render_frame_host_); |
135 } | 75 } |
136 | 76 |
137 void WebUSBPermissionProvider::DecrementConnectionCount() { | 77 void WebUSBPermissionProvider::DecrementConnectionCount() { |
138 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 78 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
139 WebContents* web_contents = | 79 WebContents* web_contents = |
140 WebContents::FromRenderFrameHost(render_frame_host_); | 80 WebContents::FromRenderFrameHost(render_frame_host_); |
141 UsbTabHelper* tab_helper = UsbTabHelper::FromWebContents(web_contents); | 81 UsbTabHelper* tab_helper = UsbTabHelper::FromWebContents(web_contents); |
142 tab_helper->DecrementConnectionCount(render_frame_host_); | 82 tab_helper->DecrementConnectionCount(render_frame_host_); |
143 } | 83 } |
OLD | NEW |