virtual_fido_device_discovery.cc 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "device/fido/virtual_fido_device_discovery.h"
  5. #include <utility>
  6. #include "base/bind.h"
  7. #include "base/location.h"
  8. #include "base/threading/sequenced_task_runner_handle.h"
  9. #include "device/fido/virtual_fido_device_authenticator.h"
  10. #include "device/fido/virtual_u2f_device.h"
  11. namespace device::test {
  12. VirtualFidoDeviceDiscovery::Trace::Trace() = default;
  13. VirtualFidoDeviceDiscovery::Trace::~Trace() = default;
  14. VirtualFidoDeviceDiscovery::VirtualFidoDeviceDiscovery(
  15. scoped_refptr<Trace> trace,
  16. size_t trace_index,
  17. FidoTransportProtocol transport,
  18. scoped_refptr<VirtualFidoDevice::State> state,
  19. ProtocolVersion supported_protocol,
  20. const VirtualCtap2Device::Config& ctap2_config,
  21. std::unique_ptr<FidoDeviceDiscovery::EventStream<bool>> disconnect_events)
  22. : FidoDeviceDiscovery(transport),
  23. trace_(std::move(trace)),
  24. trace_index_(trace_index),
  25. state_(std::move(state)),
  26. supported_protocol_(supported_protocol),
  27. ctap2_config_(ctap2_config),
  28. disconnect_events_(std::move(disconnect_events)) {}
  29. VirtualFidoDeviceDiscovery::~VirtualFidoDeviceDiscovery() {
  30. trace_->discoveries[trace_index_].is_destroyed = true;
  31. }
  32. void VirtualFidoDeviceDiscovery::StartInternal() {
  33. std::unique_ptr<VirtualFidoDevice> device;
  34. if (supported_protocol_ == ProtocolVersion::kCtap2) {
  35. device = std::make_unique<VirtualCtap2Device>(state_, ctap2_config_);
  36. } else {
  37. device = std::make_unique<VirtualU2fDevice>(state_);
  38. }
  39. id_ = device->GetId();
  40. auto authenticator =
  41. std::make_unique<VirtualFidoDeviceAuthenticator>(std::move(device));
  42. AddAuthenticator(std::move(authenticator));
  43. base::SequencedTaskRunnerHandle::Get()->PostTask(
  44. FROM_HERE,
  45. base::BindOnce(&VirtualFidoDeviceDiscovery::NotifyDiscoveryStarted,
  46. AsWeakPtr(), true /* success */));
  47. if (disconnect_events_) {
  48. // |disconnect_events_| is owned by this object therefore, when this object
  49. // is destroyed, no more events can be received. Therefore |Unretained|
  50. // works here.
  51. disconnect_events_->Connect(base::BindRepeating(
  52. &VirtualFidoDeviceDiscovery::Disconnect, base::Unretained(this)));
  53. }
  54. }
  55. void VirtualFidoDeviceDiscovery::Disconnect(bool _) {
  56. CHECK(!id_.empty());
  57. RemoveDevice(id_);
  58. }
  59. bool VirtualFidoDeviceDiscovery::MaybeStop() {
  60. trace_->discoveries[trace_index_].is_stopped = true;
  61. return FidoDeviceDiscovery::MaybeStop();
  62. }
  63. } // namespace device::test