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

Side by Side Diff: device/usb/mojo/device_impl.cc

Issue 2815003005: Integrate WebUSB with Feature Policy (Closed)
Patch Set: Add Feature Policy tests that set headers Created 3 years, 7 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/usb/mojo/device_impl.h" 5 #include "device/usb/mojo/device_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <memory> 10 #include <memory>
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 if (permission_provider_) 135 if (permission_provider_)
136 permission_provider_->DecrementConnectionCount(); 136 permission_provider_->DecrementConnectionCount();
137 } 137 }
138 device_handle_ = nullptr; 138 device_handle_ = nullptr;
139 } 139 }
140 140
141 bool DeviceImpl::HasControlTransferPermission( 141 bool DeviceImpl::HasControlTransferPermission(
142 UsbControlTransferRecipient recipient, 142 UsbControlTransferRecipient recipient,
143 uint16_t index) { 143 uint16_t index) {
144 DCHECK(device_handle_); 144 DCHECK(device_handle_);
145
146 if (recipient != UsbControlTransferRecipient::INTERFACE &&
147 recipient != UsbControlTransferRecipient::ENDPOINT) {
148 return true;
149 }
150
145 const UsbConfigDescriptor* config = device_->active_configuration(); 151 const UsbConfigDescriptor* config = device_->active_configuration();
146 152 if (!config)
147 if (!permission_provider_)
148 return false; 153 return false;
149 154
150 if (recipient == UsbControlTransferRecipient::INTERFACE || 155 const UsbInterfaceDescriptor* interface = nullptr;
151 recipient == UsbControlTransferRecipient::ENDPOINT) { 156 if (recipient == UsbControlTransferRecipient::ENDPOINT) {
152 if (!config) 157 interface = device_handle_->FindInterfaceByEndpoint(index & 0xff);
153 return false; 158 } else {
159 auto interface_it =
160 std::find_if(config->interfaces.begin(), config->interfaces.end(),
161 [index](const UsbInterfaceDescriptor& this_iface) {
162 return this_iface.interface_number == (index & 0xff);
163 });
164 if (interface_it != config->interfaces.end())
165 interface = &*interface_it;
166 }
154 167
155 const UsbInterfaceDescriptor* interface = nullptr; 168 return interface;
iclelland 2017/05/04 15:24:08 Returning a pointer from a bool method seems wrong
Reilly Grant (use Gerrit) 2017/05/04 20:34:46 Done.
156 if (recipient == UsbControlTransferRecipient::ENDPOINT) {
157 interface = device_handle_->FindInterfaceByEndpoint(index & 0xff);
158 } else {
159 auto interface_it =
160 std::find_if(config->interfaces.begin(), config->interfaces.end(),
161 [index](const UsbInterfaceDescriptor& this_iface) {
162 return this_iface.interface_number == (index & 0xff);
163 });
164 if (interface_it != config->interfaces.end())
165 interface = &*interface_it;
166 }
167 if (interface == nullptr)
168 return false;
169
170 return permission_provider_->HasFunctionPermission(
171 interface->first_interface, config->configuration_value, device_);
172 } else if (config) {
173 return permission_provider_->HasConfigurationPermission(
174 config->configuration_value, device_);
175 } else {
176 // Client must already have device permission to have gotten this far.
177 return true;
178 }
179 } 169 }
180 170
181 // static 171 // static
182 void DeviceImpl::OnOpen(base::WeakPtr<DeviceImpl> self, 172 void DeviceImpl::OnOpen(base::WeakPtr<DeviceImpl> self,
183 const OpenCallback& callback, 173 const OpenCallback& callback,
184 scoped_refptr<UsbDeviceHandle> handle) { 174 scoped_refptr<UsbDeviceHandle> handle) {
185 if (!self) { 175 if (!self) {
186 handle->Close(); 176 handle->Close();
187 return; 177 return;
188 } 178 }
189 179
190 self->device_handle_ = std::move(handle); 180 self->device_handle_ = std::move(handle);
191 if (self->device_handle_ && self->permission_provider_) 181 if (self->device_handle_ && self->permission_provider_)
192 self->permission_provider_->IncrementConnectionCount(); 182 self->permission_provider_->IncrementConnectionCount();
193 callback.Run(self->device_handle_ ? mojom::UsbOpenDeviceError::OK 183 callback.Run(self->device_handle_ ? mojom::UsbOpenDeviceError::OK
194 : mojom::UsbOpenDeviceError::ACCESS_DENIED); 184 : mojom::UsbOpenDeviceError::ACCESS_DENIED);
195 } 185 }
196 186
197 void DeviceImpl::OnPermissionGrantedForOpen(const OpenCallback& callback, 187 void DeviceImpl::OnPermissionGrantedForOpen(const OpenCallback& callback,
198 bool granted) { 188 bool granted) {
199 if (granted && permission_provider_ && 189 if (granted) {
200 permission_provider_->HasDevicePermission(device_)) {
201 device_->Open( 190 device_->Open(
202 base::Bind(&DeviceImpl::OnOpen, weak_factory_.GetWeakPtr(), callback)); 191 base::Bind(&DeviceImpl::OnOpen, weak_factory_.GetWeakPtr(), callback));
203 } else { 192 } else {
204 callback.Run(mojom::UsbOpenDeviceError::ACCESS_DENIED); 193 callback.Run(mojom::UsbOpenDeviceError::ACCESS_DENIED);
205 } 194 }
206 } 195 }
207 196
208 void DeviceImpl::Open(const OpenCallback& callback) { 197 void DeviceImpl::Open(const OpenCallback& callback) {
209 if (device_handle_) { 198 if (device_handle_) {
210 callback.Run(mojom::UsbOpenDeviceError::ALREADY_OPEN); 199 callback.Run(mojom::UsbOpenDeviceError::ALREADY_OPEN);
211 return; 200 return;
212 } 201 }
213 202
214 if (!device_->permission_granted()) { 203 if (!device_->permission_granted()) {
215 device_->RequestPermission( 204 device_->RequestPermission(
216 base::Bind(&DeviceImpl::OnPermissionGrantedForOpen, 205 base::Bind(&DeviceImpl::OnPermissionGrantedForOpen,
217 weak_factory_.GetWeakPtr(), callback)); 206 weak_factory_.GetWeakPtr(), callback));
218 return; 207 return;
219 } 208 }
220 209
221 if (permission_provider_ && 210 device_->Open(
222 permission_provider_->HasDevicePermission(device_)) { 211 base::Bind(&DeviceImpl::OnOpen, weak_factory_.GetWeakPtr(), callback));
223 device_->Open(
224 base::Bind(&DeviceImpl::OnOpen, weak_factory_.GetWeakPtr(), callback));
225 } else {
226 callback.Run(mojom::UsbOpenDeviceError::ACCESS_DENIED);
227 }
228 } 212 }
229 213
230 void DeviceImpl::Close(const CloseCallback& callback) { 214 void DeviceImpl::Close(const CloseCallback& callback) {
231 CloseHandle(); 215 CloseHandle();
232 callback.Run(); 216 callback.Run();
233 } 217 }
234 218
235 void DeviceImpl::SetConfiguration(uint8_t value, 219 void DeviceImpl::SetConfiguration(uint8_t value,
236 const SetConfigurationCallback& callback) { 220 const SetConfigurationCallback& callback) {
237 if (!device_handle_) { 221 if (!device_handle_) {
238 callback.Run(false); 222 callback.Run(false);
239 return; 223 return;
240 } 224 }
241 225
242 if (permission_provider_ && 226 device_handle_->SetConfiguration(value, callback);
243 permission_provider_->HasConfigurationPermission(value, device_)) {
244 device_handle_->SetConfiguration(value, callback);
245 } else {
246 callback.Run(false);
247 }
248 } 227 }
249 228
250 void DeviceImpl::ClaimInterface(uint8_t interface_number, 229 void DeviceImpl::ClaimInterface(uint8_t interface_number,
251 const ClaimInterfaceCallback& callback) { 230 const ClaimInterfaceCallback& callback) {
252 if (!device_handle_) { 231 if (!device_handle_) {
253 callback.Run(false); 232 callback.Run(false);
254 return; 233 return;
255 } 234 }
256 235
257 const UsbConfigDescriptor* config = device_->active_configuration(); 236 const UsbConfigDescriptor* config = device_->active_configuration();
258 if (!config) { 237 if (!config) {
259 callback.Run(false); 238 callback.Run(false);
260 return; 239 return;
261 } 240 }
262 241
263 auto interface_it = 242 auto interface_it =
264 std::find_if(config->interfaces.begin(), config->interfaces.end(), 243 std::find_if(config->interfaces.begin(), config->interfaces.end(),
265 [interface_number](const UsbInterfaceDescriptor& interface) { 244 [interface_number](const UsbInterfaceDescriptor& interface) {
266 return interface.interface_number == interface_number; 245 return interface.interface_number == interface_number;
267 }); 246 });
268 if (interface_it == config->interfaces.end()) { 247 if (interface_it == config->interfaces.end()) {
269 callback.Run(false); 248 callback.Run(false);
270 return; 249 return;
271 } 250 }
272 251
273 if (permission_provider_ && 252 device_handle_->ClaimInterface(interface_number, callback);
274 permission_provider_->HasFunctionPermission(interface_it->first_interface,
275 config->configuration_value,
276 device_)) {
277 device_handle_->ClaimInterface(interface_number, callback);
278 } else {
279 callback.Run(false);
280 }
281 } 253 }
282 254
283 void DeviceImpl::ReleaseInterface(uint8_t interface_number, 255 void DeviceImpl::ReleaseInterface(uint8_t interface_number,
284 const ReleaseInterfaceCallback& callback) { 256 const ReleaseInterfaceCallback& callback) {
285 if (!device_handle_) { 257 if (!device_handle_) {
286 callback.Run(false); 258 callback.Run(false);
287 return; 259 return;
288 } 260 }
289 261
290 device_handle_->ReleaseInterface(interface_number, callback); 262 device_handle_->ReleaseInterface(interface_number, callback);
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
436 base::Bind(&OnIsochronousTransferOut, callback)); 408 base::Bind(&OnIsochronousTransferOut, callback));
437 } 409 }
438 410
439 void DeviceImpl::OnDeviceRemoved(scoped_refptr<device::UsbDevice> device) { 411 void DeviceImpl::OnDeviceRemoved(scoped_refptr<device::UsbDevice> device) {
440 DCHECK_EQ(device_, device); 412 DCHECK_EQ(device_, device);
441 binding_->Close(); 413 binding_->Close();
442 } 414 }
443 415
444 } // namespace usb 416 } // namespace usb
445 } // namespace device 417 } // namespace device
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698