File: secure_payment_confirmation_app.h

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (161 lines) | stat: -rw-r--r-- 6,545 bytes parent folder | download | duplicates (3)
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_