| // 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_ |