blob: f31356069b7ce033a201d8816d293356c19abbb5 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_WEBAUTHN_CHROME_WEB_AUTHENTICATION_DELEGATE_H_
#define CHROME_BROWSER_WEBAUTHN_CHROME_WEB_AUTHENTICATION_DELEGATE_H_
#include <cstdint>
#include <optional>
#include <string>
#include <vector>
#include "base/functional/callback_forward.h"
#include "base/memory/weak_ptr.h"
#include "build/buildflag.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/webauthn/chrome_web_authentication_delegate_base.h"
#include "content/public/browser/authenticator_request_client_delegate.h"
#include "content/public/browser/web_authentication_request_proxy.h"
#include "url/origin.h"
// ChromeWebAuthenticationDelegate is the //chrome layer implementation
// of content::WebAuthenticationDelegate.
class ChromeWebAuthenticationDelegate final
: public ChromeWebAuthenticationDelegateBase {
public:
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
//
// LINT.IfChange(SignalUnknownCredentialResult)
enum class SignalUnknownCredentialResult {
kPasskeyNotFound = 0,
kPasskeyRemoved = 1,
kPasskeyHidden = 2,
kQuotaExceeded = 3,
kPasskeyAlreadyHidden = 4,
kMaxValue = kPasskeyAlreadyHidden,
};
// LINT.ThenChange(//tools/metrics/histograms/metadata/webauthn/enums.xml:SignalUnknownCredentialResultEnum)
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
//
// LINT.IfChange(SignalAllAcceptedCredentialsResult)
enum class SignalAllAcceptedCredentialsResult {
kNoPasskeyChanged = 0,
kPasskeyRemoved = 1,
kPasskeyHidden = 2,
kPasskeyRestored = 3,
kQuotaExceeded = 4,
kMaxValue = kQuotaExceeded,
};
// LINT.ThenChange(//tools/metrics/histograms/metadata/webauthn/enums.xml:SignalAllAcceptedCredentialsResultEnum)
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
//
// LINT.IfChange(SignalCurrentUserDetailsResult)
enum class SignalCurrentUserDetailsResult {
kQuotaExceeded = 0,
kPasskeyUpdated = 1,
kPasskeyNotUpdated = 2,
kMaxValue = kPasskeyNotUpdated,
};
// LINT.ThenChange(//tools/metrics/histograms/metadata/webauthn/enums.xml:SignalCurrentUserDetailsResultEnum)
#if BUILDFLAG(IS_MAC)
// Returns a configuration struct for instantiating the macOS WebAuthn
// platform authenticator for the given Profile.
static TouchIdAuthenticatorConfig TouchIdAuthenticatorConfigForProfile(
Profile* profile);
#endif // BUILDFLAG(IS_MAC)
ChromeWebAuthenticationDelegate();
~ChromeWebAuthenticationDelegate() override;
// content::WebAuthenticationDelegate:
bool OverrideCallerOriginAndRelyingPartyIdValidation(
content::BrowserContext* browser_context,
const url::Origin& caller_origin,
const std::string& relying_party_id) override;
std::optional<std::string> MaybeGetRelyingPartyIdOverride(
const std::string& claimed_relying_party_id,
const url::Origin& caller_origin) override;
bool ShouldPermitIndividualAttestation(
content::BrowserContext* browser_context,
const url::Origin& caller_origin,
const std::string& relying_party_id) override;
bool SupportsResidentKeys(
content::RenderFrameHost* render_frame_host) override;
bool IsFocused(content::WebContents* web_contents) override;
void IsUserVerifyingPlatformAuthenticatorAvailableOverride(
content::RenderFrameHost* render_frame_host,
base::OnceCallback<void(std::optional<bool>)> callback) override;
content::WebAuthenticationRequestProxy* MaybeGetRequestProxy(
content::BrowserContext* browser_context,
const url::Origin& caller_origin) override;
void PasskeyUnrecognized(content::WebContents* web_contents,
const url::Origin& origin,
const std::vector<uint8_t>& passkey_credential_id,
const std::string& relying_party_id) override;
void SignalAllAcceptedCredentials(content::WebContents* web_contents,
const url::Origin& origin,
const std::string& relying_party_id,
const std::vector<uint8_t>& user_id,
const std::vector<std::vector<uint8_t>>&
all_accepted_credentials_ids) override;
void UpdateUserPasskeys(content::WebContents* web_contents,
const url::Origin& origin,
const std::string& relying_party_id,
std::vector<uint8_t>& user_id,
const std::string& name,
const std::string& display_name) override;
void BrowserProvidedPasskeysAvailable(
content::BrowserContext* browser_context,
base::OnceCallback<void(bool)> callback) override;
#if BUILDFLAG(IS_MAC)
std::optional<TouchIdAuthenticatorConfig> GetTouchIdAuthenticatorConfig(
content::BrowserContext* browser_context) override;
#endif // BUILDFLAG(IS_MAC)
#if BUILDFLAG(IS_CHROMEOS)
ChromeOSGenerateRequestIdCallback GetGenerateRequestIdCallback(
content::RenderFrameHost* render_frame_host) override;
#endif // BUILDFLAG(IS_CHROMEOS)
private:
// Caches the result from looking up whether a TPM is available for Enclave
// requests.
std::optional<bool> tpm_available_;
base::WeakPtrFactory<ChromeWebAuthenticationDelegate> weak_ptr_factory_{this};
};
#endif // CHROME_BROWSER_WEBAUTHN_CHROME_WEB_AUTHENTICATION_DELEGATE_H_