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

Side by Side Diff: extensions/browser/api/device_permissions_prompt.cc

Issue 1034333002: Check USB device path access when prompting users to select a device. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Move MockPermissionBrokerClient into its own header. Created 5 years, 8 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/browser/api/device_permissions_prompt.h" 5 #include "extensions/browser/api/device_permissions_prompt.h"
6 6
7 #include "base/barrier_closure.h"
7 #include "base/strings/stringprintf.h" 8 #include "base/strings/stringprintf.h"
8 #include "base/strings/utf_string_conversions.h" 9 #include "base/strings/utf_string_conversions.h"
9 #include "content/public/browser/browser_thread.h" 10 #include "content/public/browser/browser_thread.h"
10 #include "device/core/device_client.h" 11 #include "device/core/device_client.h"
11 #include "device/usb/usb_device.h" 12 #include "device/usb/usb_device.h"
12 #include "device/usb/usb_device_filter.h" 13 #include "device/usb/usb_device_filter.h"
13 #include "device/usb/usb_ids.h" 14 #include "device/usb/usb_ids.h"
14 #include "device/usb/usb_service.h" 15 #include "device/usb/usb_service.h"
15 #include "extensions/browser/api/device_permissions_manager.h" 16 #include "extensions/browser/api/device_permissions_manager.h"
16 #include "extensions/common/extension.h" 17 #include "extensions/common/extension.h"
17 #include "extensions/strings/grit/extensions_strings.h" 18 #include "extensions/strings/grit/extensions_strings.h"
18 #include "ui/base/l10n/l10n_util.h" 19 #include "ui/base/l10n/l10n_util.h"
19 20
21 using content::BrowserThread;
20 using device::UsbDevice; 22 using device::UsbDevice;
21 using device::UsbDeviceFilter; 23 using device::UsbDeviceFilter;
22 using device::UsbService; 24 using device::UsbService;
23 25
24 namespace extensions { 26 namespace extensions {
25 27
26 DevicePermissionsPrompt::Prompt::DeviceInfo::DeviceInfo( 28 DevicePermissionsPrompt::Prompt::DeviceInfo::DeviceInfo(
27 scoped_refptr<UsbDevice> device) 29 scoped_refptr<UsbDevice> device)
28 : device(device) { 30 : device(device) {
29 base::string16 manufacturer_string; 31 base::string16 manufacturer_string;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 browser_context_(nullptr), 76 browser_context_(nullptr),
75 multiple_(false), 77 multiple_(false),
76 observer_(nullptr), 78 observer_(nullptr),
77 usb_service_observer_(this) { 79 usb_service_observer_(this) {
78 } 80 }
79 81
80 void DevicePermissionsPrompt::Prompt::SetObserver(Observer* observer) { 82 void DevicePermissionsPrompt::Prompt::SetObserver(Observer* observer) {
81 observer_ = observer; 83 observer_ = observer;
82 84
83 if (observer_) { 85 if (observer_) {
84 content::BrowserThread::PostTask( 86 BrowserThread::PostTask(
85 content::BrowserThread::FILE, FROM_HERE, 87 BrowserThread::FILE, FROM_HERE,
86 base::Bind(&DevicePermissionsPrompt::Prompt::DoDeviceQuery, this)); 88 base::Bind(&DevicePermissionsPrompt::Prompt::DoDeviceQuery, this));
87 } 89 }
88 } 90 }
89 91
90 base::string16 DevicePermissionsPrompt::Prompt::GetHeading() const { 92 base::string16 DevicePermissionsPrompt::Prompt::GetHeading() const {
91 return l10n_util::GetStringUTF16( 93 return l10n_util::GetStringUTF16(
92 multiple_ ? IDS_DEVICE_PERMISSIONS_PROMPT_TITLE_MULTIPLE 94 multiple_ ? IDS_DEVICE_PERMISSIONS_PROMPT_TITLE_MULTIPLE
93 : IDS_DEVICE_PERMISSIONS_PROMPT_TITLE_SINGLE); 95 : IDS_DEVICE_PERMISSIONS_PROMPT_TITLE_SINGLE);
94 } 96 }
95 97
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 131
130 void DevicePermissionsPrompt::Prompt::DoDeviceQuery() { 132 void DevicePermissionsPrompt::Prompt::DoDeviceQuery() {
131 UsbService* service = device::DeviceClient::Get()->GetUsbService(); 133 UsbService* service = device::DeviceClient::Get()->GetUsbService();
132 if (!service) { 134 if (!service) {
133 return; 135 return;
134 } 136 }
135 137
136 std::vector<scoped_refptr<UsbDevice>> devices; 138 std::vector<scoped_refptr<UsbDevice>> devices;
137 service->GetDevices(&devices); 139 service->GetDevices(&devices);
138 140
139 std::vector<DeviceInfo> device_info;
140 for (const auto& device : devices) {
141 if (!(filters_.empty() || UsbDeviceFilter::MatchesAny(device, filters_))) {
142 continue;
143 }
144
145 device_info.push_back(DeviceInfo(device));
146 }
147
148 if (!usb_service_observer_.IsObserving(service)) { 141 if (!usb_service_observer_.IsObserving(service)) {
149 usb_service_observer_.Add(service); 142 usb_service_observer_.Add(service);
150 } 143 }
151 144
152 content::BrowserThread::PostTask( 145 std::vector<DeviceInfo>* device_info = new std::vector<DeviceInfo>();
153 content::BrowserThread::UI, 146 base::Closure barrier = base::BarrierClosure(
154 FROM_HERE, 147 devices.size(),
155 base::Bind( 148 base::Bind(&DevicePermissionsPrompt::Prompt::DeviceQueryComplete, this,
156 &DevicePermissionsPrompt::Prompt::SetDevices, this, device_info)); 149 base::Owned(device_info)));
150
151 for (const auto& device : devices) {
152 if (filters_.empty() || UsbDeviceFilter::MatchesAny(device, filters_)) {
153 device->CheckUsbAccess(
154 base::Bind(&DevicePermissionsPrompt::Prompt::AppendCheckedUsbDevice,
155 this, device_info, device, barrier));
156 } else {
157 barrier.Run();
158 }
159 }
160 }
161
162 void DevicePermissionsPrompt::Prompt::AppendCheckedUsbDevice(
163 std::vector<DeviceInfo>* device_info,
164 scoped_refptr<UsbDevice> device,
165 const base::Closure& callback,
166 bool allowed) {
167 if (allowed) {
168 device_info->push_back(DeviceInfo(device));
169 }
170 callback.Run();
171 }
172
173 void DevicePermissionsPrompt::Prompt::AddCheckedUsbDevice(
174 scoped_refptr<UsbDevice> device,
175 bool allowed) {
176 if (allowed) {
177 BrowserThread::PostTask(
178 BrowserThread::UI, FROM_HERE,
179 base::Bind(&DevicePermissionsPrompt::Prompt::AddDevice, this,
180 DeviceInfo(device)));
181 }
182 }
183
184 void DevicePermissionsPrompt::Prompt::DeviceQueryComplete(
185 std::vector<DeviceInfo>* device_info) {
186 BrowserThread::PostTask(
187 BrowserThread::UI, FROM_HERE,
188 base::Bind(&DevicePermissionsPrompt::Prompt::SetDevices, this,
189 *device_info));
157 } 190 }
158 191
159 void DevicePermissionsPrompt::Prompt::SetDevices( 192 void DevicePermissionsPrompt::Prompt::SetDevices(
160 const std::vector<DeviceInfo>& devices) { 193 const std::vector<DeviceInfo>& devices) {
161 devices_ = devices; 194 devices_ = devices;
162 if (observer_) { 195 if (observer_) {
163 observer_->OnDevicesChanged(); 196 observer_->OnDevicesChanged();
164 } 197 }
165 } 198 }
166 199
(...skipping 19 matching lines...) Expand all
186 observer_->OnDevicesChanged(); 219 observer_->OnDevicesChanged();
187 } 220 }
188 } 221 }
189 222
190 void DevicePermissionsPrompt::Prompt::OnDeviceAdded( 223 void DevicePermissionsPrompt::Prompt::OnDeviceAdded(
191 scoped_refptr<UsbDevice> device) { 224 scoped_refptr<UsbDevice> device) {
192 if (!(filters_.empty() || UsbDeviceFilter::MatchesAny(device, filters_))) { 225 if (!(filters_.empty() || UsbDeviceFilter::MatchesAny(device, filters_))) {
193 return; 226 return;
194 } 227 }
195 228
196 content::BrowserThread::PostTask( 229 device->CheckUsbAccess(base::Bind(
197 content::BrowserThread::UI, FROM_HERE, 230 &DevicePermissionsPrompt::Prompt::AddCheckedUsbDevice, this, device));
198 base::Bind(&DevicePermissionsPrompt::Prompt::AddDevice, this,
199 DeviceInfo(device)));
200 } 231 }
201 232
202 void DevicePermissionsPrompt::Prompt::OnDeviceRemoved( 233 void DevicePermissionsPrompt::Prompt::OnDeviceRemoved(
203 scoped_refptr<UsbDevice> device) { 234 scoped_refptr<UsbDevice> device) {
204 content::BrowserThread::PostTask( 235 BrowserThread::PostTask(
205 content::BrowserThread::UI, FROM_HERE, 236 BrowserThread::UI, FROM_HERE,
206 base::Bind(&DevicePermissionsPrompt::Prompt::RemoveDevice, this, device)); 237 base::Bind(&DevicePermissionsPrompt::Prompt::RemoveDevice, this, device));
207 } 238 }
208 239
209 DevicePermissionsPrompt::DevicePermissionsPrompt( 240 DevicePermissionsPrompt::DevicePermissionsPrompt(
210 content::WebContents* web_contents) 241 content::WebContents* web_contents)
211 : web_contents_(web_contents), delegate_(nullptr) { 242 : web_contents_(web_contents), delegate_(nullptr) {
212 } 243 }
213 244
214 DevicePermissionsPrompt::~DevicePermissionsPrompt() { 245 DevicePermissionsPrompt::~DevicePermissionsPrompt() {
215 } 246 }
216 247
217 void DevicePermissionsPrompt::AskForUsbDevices( 248 void DevicePermissionsPrompt::AskForUsbDevices(
218 Delegate* delegate, 249 Delegate* delegate,
219 const Extension* extension, 250 const Extension* extension,
220 content::BrowserContext* context, 251 content::BrowserContext* context,
221 bool multiple, 252 bool multiple,
222 const std::vector<UsbDeviceFilter>& filters) { 253 const std::vector<UsbDeviceFilter>& filters) {
223 prompt_ = new Prompt(); 254 prompt_ = new Prompt();
224 prompt_->set_extension(extension); 255 prompt_->set_extension(extension);
225 prompt_->set_browser_context(context); 256 prompt_->set_browser_context(context);
226 prompt_->set_multiple(multiple); 257 prompt_->set_multiple(multiple);
227 prompt_->set_filters(filters); 258 prompt_->set_filters(filters);
228 delegate_ = delegate; 259 delegate_ = delegate;
229 260
230 ShowDialog(); 261 ShowDialog();
231 } 262 }
232 263
233 } // namespace extensions 264 } // namespace extensions
OLDNEW
« no previous file with comments | « extensions/browser/api/device_permissions_prompt.h ('k') | extensions/browser/api/usb/usb_api.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698