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

Side by Side Diff: device/devices_app/usb/device_manager_impl.cc

Issue 1345793002: Use complete USB DeviceInfo Mojo object to make permission decisions. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@manager_full_remove
Patch Set: Rebased. Created 5 years, 3 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 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 "device/devices_app/usb/device_manager_impl.h" 5 #include "device/devices_app/usb/device_manager_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/location.h" 8 #include "base/location.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 UsbService* usb_service = DeviceClient::Get()->GetUsbService(); 44 UsbService* usb_service = DeviceClient::Get()->GetUsbService();
45 if (usb_service) { 45 if (usb_service) {
46 usb_service->GetDevices(base::Bind(&OnGetDevicesOnServiceThread, callback, 46 usb_service->GetDevices(base::Bind(&OnGetDevicesOnServiceThread, callback,
47 callback_task_runner)); 47 callback_task_runner));
48 } else { 48 } else {
49 callback_task_runner->PostTask(FROM_HERE, 49 callback_task_runner->PostTask(FROM_HERE,
50 base::Bind(callback, DeviceList())); 50 base::Bind(callback, DeviceList()));
51 } 51 }
52 } 52 }
53 53
54 void GetDeviceOnServiceThread(
55 const mojo::String& guid,
56 const base::Callback<void(DeviceInfoPtr)>& callback,
57 scoped_refptr<base::TaskRunner> callback_task_runner) {
58 DeviceInfoPtr device_info;
59 DCHECK(DeviceClient::Get());
60 UsbService* usb_service = DeviceClient::Get()->GetUsbService();
61 if (usb_service) {
62 scoped_refptr<UsbDevice> device = usb_service->GetDevice(guid);
63 if (device)
64 device_info = DeviceInfo::From(*device);
65 }
66
67 callback_task_runner->PostTask(
68 FROM_HERE, base::Bind(callback, base::Passed(&device_info)));
69 }
70
54 void RunOpenDeviceCallback(const DeviceManager::OpenDeviceCallback& callback, 71 void RunOpenDeviceCallback(const DeviceManager::OpenDeviceCallback& callback,
55 OpenDeviceError error) { 72 OpenDeviceError error) {
56 callback.Run(error); 73 callback.Run(error);
57 } 74 }
58 75
59 void OnOpenDeviceOnServiceThread( 76 void OnOpenDeviceOnServiceThread(
60 mojo::InterfaceRequest<Device> device_request, 77 mojo::InterfaceRequest<Device> device_request,
61 const DeviceManager::OpenDeviceCallback& callback, 78 const DeviceManager::OpenDeviceCallback& callback,
62 scoped_refptr<base::TaskRunner> callback_task_runner, 79 scoped_refptr<base::TaskRunner> callback_task_runner,
63 scoped_refptr<UsbDeviceHandle> device_handle) { 80 scoped_refptr<UsbDeviceHandle> device_handle) {
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 void DeviceManagerImpl::GetDeviceChanges( 221 void DeviceManagerImpl::GetDeviceChanges(
205 const GetDeviceChangesCallback& callback) { 222 const GetDeviceChangesCallback& callback) {
206 device_change_callbacks_.push(callback); 223 device_change_callbacks_.push(callback);
207 MaybeRunDeviceChangesCallback(); 224 MaybeRunDeviceChangesCallback();
208 } 225 }
209 226
210 void DeviceManagerImpl::OpenDevice( 227 void DeviceManagerImpl::OpenDevice(
211 const mojo::String& guid, 228 const mojo::String& guid,
212 mojo::InterfaceRequest<Device> device_request, 229 mojo::InterfaceRequest<Device> device_request,
213 const OpenDeviceCallback& callback) { 230 const OpenDeviceCallback& callback) {
214 mojo::Array<mojo::String> requested_guids(1); 231 auto has_permission_callback = base::Bind(
215 requested_guids[0] = guid; 232 &DeviceManagerImpl::OnGotDeviceInfoForOpen, weak_factory_.GetWeakPtr(),
233 base::Passed(&device_request), callback);
234 service_task_runner_->PostTask(
235 FROM_HERE,
236 base::Bind(&GetDeviceOnServiceThread, guid, has_permission_callback,
237 base::ThreadTaskRunnerHandle::Get()));
238 }
239
240 void DeviceManagerImpl::OnGotDeviceInfoForOpen(
241 mojo::InterfaceRequest<Device> device_request,
242 const OpenDeviceCallback& callback,
243 DeviceInfoPtr device_info) {
244 if (!device_info) {
245 callback.Run(OPEN_DEVICE_ERROR_NOT_FOUND);
246 return;
247 }
248
249 mojo::Array<DeviceInfoPtr> requested_devices(1);
250 requested_devices[0] = device_info.Pass();
216 permission_provider_->HasDevicePermission( 251 permission_provider_->HasDevicePermission(
217 requested_guids.Pass(), 252 requested_devices.Pass(),
218 base::Bind(&DeviceManagerImpl::OnOpenDevicePermissionCheckComplete, 253 base::Bind(&DeviceManagerImpl::OnOpenDevicePermissionCheckComplete,
219 base::Unretained(this), base::Passed(&device_request), 254 base::Unretained(this), base::Passed(&device_request),
220 callback)); 255 callback));
221 } 256 }
222 257
223 void DeviceManagerImpl::OnOpenDevicePermissionCheckComplete( 258 void DeviceManagerImpl::OnOpenDevicePermissionCheckComplete(
224 mojo::InterfaceRequest<Device> device_request, 259 mojo::InterfaceRequest<Device> device_request,
225 const OpenDeviceCallback& callback, 260 const OpenDeviceCallback& callback,
226 mojo::Array<mojo::String> allowed_guids) { 261 mojo::Array<mojo::String> allowed_guids) {
227 if (allowed_guids.size() == 0) { 262 if (allowed_guids.size() == 0) {
228 callback.Run(OPEN_DEVICE_ERROR_ACCESS_DENIED); 263 callback.Run(OPEN_DEVICE_ERROR_ACCESS_DENIED);
229 return; 264 return;
230 } 265 }
231 266
232 DCHECK(allowed_guids.size() == 1); 267 DCHECK(allowed_guids.size() == 1);
233 service_task_runner_->PostTask( 268 service_task_runner_->PostTask(
234 FROM_HERE, base::Bind(&OpenDeviceOnServiceThread, allowed_guids[0], 269 FROM_HERE, base::Bind(&OpenDeviceOnServiceThread, allowed_guids[0],
235 base::Passed(&device_request), callback, 270 base::Passed(&device_request), callback,
236 base::ThreadTaskRunnerHandle::Get())); 271 base::ThreadTaskRunnerHandle::Get()));
237 } 272 }
238 273
239 void DeviceManagerImpl::OnGetDevices(EnumerationOptionsPtr options, 274 void DeviceManagerImpl::OnGetDevices(EnumerationOptionsPtr options,
240 const GetDevicesCallback& callback, 275 const GetDevicesCallback& callback,
241 const DeviceList& devices) { 276 const DeviceList& devices) {
242 std::vector<UsbDeviceFilter> filters; 277 std::vector<UsbDeviceFilter> filters;
243 if (options) 278 if (options)
244 filters = options->filters.To<std::vector<UsbDeviceFilter>>(); 279 filters = options->filters.To<std::vector<UsbDeviceFilter>>();
245 280
246 std::map<std::string, scoped_refptr<UsbDevice>> device_map; 281 std::map<std::string, scoped_refptr<UsbDevice>> device_map;
247 mojo::Array<mojo::String> requested_guids(0); 282 mojo::Array<DeviceInfoPtr> requested_devices(0);
248 for (const auto& device : devices) { 283 for (const auto& device : devices) {
249 if (filters.empty() || UsbDeviceFilter::MatchesAny(device, filters)) { 284 if (filters.empty() || UsbDeviceFilter::MatchesAny(device, filters)) {
250 device_map[device->guid()] = device; 285 device_map[device->guid()] = device;
251 requested_guids.push_back(device->guid()); 286 requested_devices.push_back(DeviceInfo::From(*device));
252 } 287 }
253 } 288 }
254 289
255 permission_provider_->HasDevicePermission( 290 permission_provider_->HasDevicePermission(
256 requested_guids.Pass(), 291 requested_devices.Pass(),
257 base::Bind(&FilterAndConvertDevicesAndThen, device_map, callback)); 292 base::Bind(&FilterAndConvertDevicesAndThen, device_map, callback));
258 } 293 }
259 294
260 void DeviceManagerImpl::OnDeviceAdded(scoped_refptr<UsbDevice> device) { 295 void DeviceManagerImpl::OnDeviceAdded(scoped_refptr<UsbDevice> device) {
261 DCHECK(!ContainsKey(devices_removed_, device->guid())); 296 DCHECK(!ContainsKey(devices_removed_, device->guid()));
262 devices_added_[device->guid()] = device; 297 devices_added_[device->guid()] = device;
263 MaybeRunDeviceChangesCallback(); 298 MaybeRunDeviceChangesCallback();
264 } 299 }
265 300
266 void DeviceManagerImpl::OnDeviceRemoved(scoped_refptr<UsbDevice> device) { 301 void DeviceManagerImpl::OnDeviceRemoved(scoped_refptr<UsbDevice> device) {
267 if (devices_added_.erase(device->guid()) == 0) 302 if (devices_added_.erase(device->guid()) == 0)
268 devices_removed_[device->guid()] = device; 303 devices_removed_[device->guid()] = device;
269 MaybeRunDeviceChangesCallback(); 304 MaybeRunDeviceChangesCallback();
270 } 305 }
271 306
272 void DeviceManagerImpl::MaybeRunDeviceChangesCallback() { 307 void DeviceManagerImpl::MaybeRunDeviceChangesCallback() {
273 if (!permission_request_pending_ && !device_change_callbacks_.empty()) { 308 if (!permission_request_pending_ && !device_change_callbacks_.empty()) {
274 DeviceMap devices_added; 309 DeviceMap devices_added;
275 devices_added.swap(devices_added_); 310 devices_added.swap(devices_added_);
276 DeviceMap devices_removed; 311 DeviceMap devices_removed;
277 devices_removed.swap(devices_removed_); 312 devices_removed.swap(devices_removed_);
278 313
279 mojo::Array<mojo::String> requested_guids(devices_added.size() + 314 mojo::Array<DeviceInfoPtr> requested_devices(devices_added.size() +
280 devices_removed.size()); 315 devices_removed.size());
281 { 316 {
282 size_t i = 0; 317 size_t i = 0;
283 for (const auto& map_entry : devices_added) 318 for (const auto& map_entry : devices_added)
284 requested_guids[i++] = map_entry.first; 319 requested_devices[i++] = DeviceInfo::From(*map_entry.second);
285 for (const auto& map_entry : devices_removed) 320 for (const auto& map_entry : devices_removed)
286 requested_guids[i++] = map_entry.first; 321 requested_devices[i++] = DeviceInfo::From(*map_entry.second);
287 } 322 }
288 323
289 permission_request_pending_ = true; 324 permission_request_pending_ = true;
290 permission_provider_->HasDevicePermission( 325 permission_provider_->HasDevicePermission(
291 requested_guids.Pass(), 326 requested_devices.Pass(),
292 base::Bind(&DeviceManagerImpl::OnEnumerationPermissionCheckComplete, 327 base::Bind(&DeviceManagerImpl::OnEnumerationPermissionCheckComplete,
293 base::Unretained(this), devices_added, devices_removed)); 328 base::Unretained(this), devices_added, devices_removed));
294 } 329 }
295 } 330 }
296 331
297 void DeviceManagerImpl::OnEnumerationPermissionCheckComplete( 332 void DeviceManagerImpl::OnEnumerationPermissionCheckComplete(
298 const DeviceMap& devices_added, 333 const DeviceMap& devices_added,
299 const DeviceMap& devices_removed, 334 const DeviceMap& devices_removed,
300 mojo::Array<mojo::String> allowed_guids) { 335 mojo::Array<mojo::String> allowed_guids) {
301 permission_request_pending_ = false; 336 permission_request_pending_ = false;
(...skipping 21 matching lines...) Expand all
323 callback.Run(notification.Pass()); 358 callback.Run(notification.Pass());
324 device_change_callbacks_.pop(); 359 device_change_callbacks_.pop();
325 } 360 }
326 361
327 if (devices_added_.size() > 0 || !devices_removed_.empty()) 362 if (devices_added_.size() > 0 || !devices_removed_.empty())
328 MaybeRunDeviceChangesCallback(); 363 MaybeRunDeviceChangesCallback();
329 } 364 }
330 365
331 } // namespace usb 366 } // namespace usb
332 } // namespace device 367 } // namespace device
OLDNEW
« no previous file with comments | « device/devices_app/usb/device_manager_impl.h ('k') | device/devices_app/usb/device_manager_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698