1 // Copyright 2019 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 
5 #include "content/browser/webauth/virtual_authenticator_request_delegate.h"
6 
7 #include <utility>
8 #include <vector>
9 
10 #include "base/callback.h"
11 #include "content/browser/webauth/authenticator_environment_impl.h"
12 #include "content/browser/webauth/virtual_authenticator.h"
13 #include "content/browser/webauth/virtual_fido_discovery_factory.h"
14 #include "device/fido/authenticator_get_assertion_response.h"
15 #include "device/fido/fido_transport_protocol.h"
16 
17 namespace content {
18 
VirtualAuthenticatorRequestDelegate(FrameTreeNode * frame_tree_node)19 VirtualAuthenticatorRequestDelegate::VirtualAuthenticatorRequestDelegate(
20     FrameTreeNode* frame_tree_node)
21     : frame_tree_node_(frame_tree_node) {}
22 
23 VirtualAuthenticatorRequestDelegate::~VirtualAuthenticatorRequestDelegate() =
24     default;
25 
SupportsResidentKeys()26 bool VirtualAuthenticatorRequestDelegate::SupportsResidentKeys() {
27   return true;
28 }
29 
SelectAccount(std::vector<device::AuthenticatorGetAssertionResponse> responses,base::OnceCallback<void (device::AuthenticatorGetAssertionResponse)> callback)30 void VirtualAuthenticatorRequestDelegate::SelectAccount(
31     std::vector<device::AuthenticatorGetAssertionResponse> responses,
32     base::OnceCallback<void(device::AuthenticatorGetAssertionResponse)>
33         callback) {
34   // TODO(crbug.com/991666): Provide a way to determine which account gets
35   // picked.
36   std::move(callback).Run(std::move(responses[0]));
37 }
38 
39 base::Optional<bool> VirtualAuthenticatorRequestDelegate::
IsUserVerifyingPlatformAuthenticatorAvailableOverride()40     IsUserVerifyingPlatformAuthenticatorAvailableOverride() {
41   auto* virtual_discovery_factory =
42       AuthenticatorEnvironmentImpl::GetInstance()->GetVirtualFactoryFor(
43           frame_tree_node_);
44   if (!virtual_discovery_factory) {
45     return base::nullopt;
46   }
47   const auto& authenticators = virtual_discovery_factory->GetAuthenticators();
48   return std::any_of(authenticators.begin(), authenticators.end(),
49                      [](VirtualAuthenticator* a) {
50                        return a->is_user_verifying_platform_authenticator();
51                      });
52 }
53 
54 }  // namespace content
55