[go: nahoru, domu]

blob: 11d311551826bc929318dda7a0483d05f2c5e8ab [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef DEVICE_FIDO_VIRTUAL_FIDO_DEVICE_FACTORY_H_
#define DEVICE_FIDO_VIRTUAL_FIDO_DEVICE_FACTORY_H_
#include <memory>
#include <utility>
#include <vector>
#include "base/memory/scoped_refptr.h"
#include "device/fido/cable/cable_discovery_data.h"
#include "device/fido/fido_constants.h"
#include "device/fido/fido_discovery_base.h"
#include "device/fido/fido_discovery_factory.h"
#include "device/fido/fido_transport_protocol.h"
#include "device/fido/virtual_ctap2_device.h"
#include "device/fido/virtual_fido_device.h"
#include "device/fido/virtual_fido_device_discovery.h"
namespace device::test {
// A |FidoDiscoveryFactory| that always returns |VirtualFidoDevice|s.
//
// If the transport is set to `hybrid` and a client obtains a phone contact
// callback from |get_cable_contact_callback|, authenticators will only be
// created only after the callback is executed.
class VirtualFidoDeviceFactory : public device::FidoDiscoveryFactory {
public:
VirtualFidoDeviceFactory();
VirtualFidoDeviceFactory(const VirtualFidoDeviceFactory&) = delete;
VirtualFidoDeviceFactory& operator=(const VirtualFidoDeviceFactory&) = delete;
~VirtualFidoDeviceFactory() override;
// Sets the FidoTransportProtocol of the FidoDiscovery to be instantiated by
// this VirtualFidoDeviceFactory. The default is
// FidoTransportProtocol::kUsbHumanInterfaceDevice.
//
// The FidoTransportProtocol of the device instantiated by the FidoDiscovery
// must be set separately in mutable_state().
void SetTransport(FidoTransportProtocol transport);
void SetSupportedProtocol(ProtocolVersion supported_protocol);
// SetCtap2Config sets the configuration for |VirtualCtap2Device|s and sets
// the supported protocol to CTAP2.
void SetCtap2Config(const VirtualCtap2Device::Config& config);
VirtualFidoDevice::State* mutable_state();
scoped_refptr<VirtualFidoDeviceDiscovery::Trace> trace();
// set_discover_win_webauthn_api_authenticator controls whether the
// WebWebAuthnApi authenticator will be discovered. Create a
// `WinWebAuthnApi::ScopedOverride` before settings to true.
void set_discover_win_webauthn_api_authenticator(bool on);
#if BUILDFLAG(IS_WIN)
std::unique_ptr<device::FidoDiscoveryBase>
MaybeCreateWinWebAuthnApiDiscovery() override;
#endif
protected:
// device::FidoDiscoveryFactory:
std::vector<std::unique_ptr<FidoDiscoveryBase>> Create(
FidoTransportProtocol transport) override;
bool IsTestOverride() override;
base::RepeatingCallback<void(std::unique_ptr<cablev2::Pairing>)>
get_cable_contact_callback() override;
private:
std::unique_ptr<
FidoDiscoveryBase::EventStream<std::unique_ptr<cablev2::Pairing>>>
contact_device_stream_;
ProtocolVersion supported_protocol_ = ProtocolVersion::kU2f;
FidoTransportProtocol transport_ =
FidoTransportProtocol::kUsbHumanInterfaceDevice;
VirtualCtap2Device::Config ctap2_config_;
scoped_refptr<VirtualFidoDevice::State> state_ = new VirtualFidoDevice::State;
scoped_refptr<VirtualFidoDeviceDiscovery::Trace> trace_ =
new VirtualFidoDeviceDiscovery::Trace;
bool discover_win_webauthn_api_authenticator_ = false;
base::WeakPtrFactory<VirtualFidoDeviceFactory> weak_ptr_factory_{this};
};
} // namespace device::test
#endif // DEVICE_FIDO_VIRTUAL_FIDO_DEVICE_FACTORY_H_