1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_PAYMENTS_CONTENT_SECURE_PAYMENT_CONFIRMATION_APP_H_
#define COMPONENTS_PAYMENTS_CONTENT_SECURE_PAYMENT_CONFIRMATION_APP_H_
#include <stdint.h>
#include <memory>
#include <string>
#include <vector>
#include "base/memory/weak_ptr.h"
#include "components/payments/content/payment_app.h"
#include "components/payments/content/secure_payment_confirmation_controller.h"
#include "content/public/browser/global_routing_id.h"
#include "content/public/browser/web_contents_observer.h"
#include "third_party/blink/public/mojom/payments/payment_request.mojom.h"
#include "third_party/blink/public/mojom/webauthn/authenticator.mojom-forward.h"
#include "url/origin.h"
class SkBitmap;
namespace webauthn {
class InternalAuthenticator;
} // namespace webauthn
namespace content {
class RenderFrameHost;
class WebContents;
} // namespace content
namespace payments {
class BrowserBoundKey;
class PasskeyBrowserBinder;
class PaymentRequestSpec;
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused. Keep in sync with
// src/tools/metrics/histograms/enums.xml.
enum class SecurePaymentConfirmationSystemPromptResult {
kCanceled = 0,
kAccepted = 1,
kMaxValue = kAccepted,
};
class SecurePaymentConfirmationApp : public PaymentApp,
public content::WebContentsObserver {
public:
// Please use `std::move()` for the `credential_id` parameter to avoid extra
// copies.
SecurePaymentConfirmationApp(
content::WebContents* web_contents_to_observe,
const std::string& effective_relying_party_identity,
const std::u16string& payment_instrument_label,
const std::u16string& payment_instrument_details,
std::unique_ptr<SkBitmap> payment_instrument_icon,
std::vector<uint8_t> credential_id,
std::unique_ptr<PasskeyBrowserBinder> passkey_browser_binder,
bool device_supports_browser_bound_keys_in_hardware,
const url::Origin& merchant_origin,
base::WeakPtr<PaymentRequestSpec> spec,
mojom::SecurePaymentConfirmationRequestPtr request,
std::unique_ptr<webauthn::InternalAuthenticator> authenticator,
std::vector<PaymentApp::PaymentEntityLogo> payment_entities_logos);
~SecurePaymentConfirmationApp() override;
SecurePaymentConfirmationApp(const SecurePaymentConfirmationApp& other) =
delete;
SecurePaymentConfirmationApp& operator=(
const SecurePaymentConfirmationApp& other) = delete;
// PaymentApp implementation.
void InvokePaymentApp(base::WeakPtr<Delegate> delegate) override;
bool IsCompleteForPayment() const override;
bool CanPreselect() const override;
std::u16string GetMissingInfoLabel() const override;
bool HasEnrolledInstrument() const override;
bool NeedsInstallation() const override;
std::string GetId() const override;
std::u16string GetLabel() const override;
std::u16string GetSublabel() const override;
const SkBitmap* icon_bitmap() const override;
const SkBitmap* issuer_bitmap() const override;
const SkBitmap* network_bitmap() const override;
std::vector<PaymentEntityLogo*> GetPaymentEntitiesLogos() override;
bool IsValidForModifier(const std::string& method) const override;
base::WeakPtr<PaymentApp> AsWeakPtr() override;
bool HandlesShippingAddress() const override;
bool HandlesPayerName() const override;
bool HandlesPayerEmail() const override;
bool HandlesPayerPhone() const override;
bool IsWaitingForPaymentDetailsUpdate() const override;
void UpdateWith(
mojom::PaymentRequestDetailsUpdatePtr details_update) override;
void OnPaymentDetailsNotUpdated() override;
void AbortPaymentApp(base::OnceCallback<void(bool)> abort_callback) override;
mojom::PaymentResponsePtr SetAppSpecificResponseFields(
mojom::PaymentResponsePtr response) const override;
// WebContentsObserver implementation.
void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override;
// TODO(https://crbug.com/416516287): Remove issuer and network label once
// all callers use GetPaymentEntitiesLogos() instead.
std::u16string network_label() const;
std::u16string issuer_label() const;
PasskeyBrowserBinder* GetPasskeyBrowserBinderForTesting();
private:
void OnGetBrowserBoundKey(
base::WeakPtr<Delegate> delegate,
blink::mojom::PublicKeyCredentialRequestOptionsPtr options,
bool is_new,
std::unique_ptr<BrowserBoundKey> browser_bound_key);
void OnGetAssertion(
base::WeakPtr<Delegate> delegate,
blink::mojom::AuthenticatorStatus status,
blink::mojom::GetAssertionAuthenticatorResponsePtr response,
blink::mojom::WebAuthnDOMExceptionDetailsPtr dom_exception_details);
// Used only for comparison with the RenderFrameHost pointer in
// RenderFrameDeleted() method.
content::GlobalRenderFrameHostId authenticator_frame_routing_id_;
const std::string effective_relying_party_identity_;
const std::u16string payment_instrument_label_;
const std::u16string payment_instrument_details_;
const std::unique_ptr<SkBitmap> payment_instrument_icon_;
const std::vector<uint8_t> credential_id_;
const url::Origin merchant_origin_;
const base::WeakPtr<PaymentRequestSpec> spec_;
const mojom::SecurePaymentConfirmationRequestPtr request_;
std::unique_ptr<webauthn::InternalAuthenticator> authenticator_;
std::unique_ptr<PasskeyBrowserBinder> passkey_browser_binder_;
// `device_supports_browser_bound_keys_in_hardware` is not set if
// passkey_browser_binder was not provided.
const bool device_supports_browser_bound_keys_in_hardware_ = false;
std::unique_ptr<BrowserBoundKey> browser_bound_key_;
std::string challenge_;
blink::mojom::GetAssertionAuthenticatorResponsePtr response_;
// This contains the logos of the entities facilitating the transaction. There
// may be up to 2 logos.
//
// Payment entities can be of any type. However, when the
// SecurePaymentConfirmationNetworkAndIssuerIcons feature flag is enabled and
// network and issuer icons are provided by the page, this list will contain
// the network logo followed by the issuer logo.
std::vector<PaymentEntityLogo> payment_entities_logos_;
base::WeakPtrFactory<SecurePaymentConfirmationApp> weak_ptr_factory_{this};
};
} // namespace payments
#endif // COMPONENTS_PAYMENTS_CONTENT_SECURE_PAYMENT_CONFIRMATION_APP_H_
|