blob: ea919598fef80e8846cfc627dcd1f00eefa391d1 [file] [log] [blame]
// Copyright 2017 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_WEB_PAYMENTS_TABLE_H_
#define COMPONENTS_PAYMENTS_CONTENT_WEB_PAYMENTS_TABLE_H_
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "base/strings/cstring_view.h"
#include "base/time/time.h"
#include "components/payments/content/browser_binding/browser_bound_key_metadata.h"
#include "components/webdata/common/web_database_table.h"
class WebDatabase;
namespace payments {
struct SecurePaymentConfirmationCredential;
// This class manages Web Payment tables in SQLite database. It expects the
// following schema.
//
// payment_method_manifest This table stores WebAppManifestSection.id of the
// supported web app in this payment method manifest.
// Note that a payment method manifest might contain
// multiple supported web apps ids.
//
// expire_date The expire date in seconds from 1601-01-01 00:00:00
// UTC.
// method_name The method name.
// web_app_id The supported web app id.
// (WebAppManifestSection.id).
//
// secure_payment_confirmation_instrument
// This table stores credential information for secure
// payment confirmation method. Historically it also
// stored instrument information, hence the name and
// the (no longer used) label and icon fields.
// This table is only used when credential store APIs
// are unavailable: This is controlled by the
// platform-specific
// SecurePaymentConfirmationUseCredentialStoreAPIs flag:
// On Android, currently, this table is not used.
//
// credential_id The WebAuthn credential identifier blob. Primary key.
// relying_party_id The relying party identifier string.
// label The instrument human-readable label string.
// icon The serialized SkBitmap blob.
// data_created The creation date in micro seconds from 1601-01-01
// 00:00:00 UTC.
//
// secure_payment_confirmation_browser_bound_key
// This table stores browser bound key information for
// payment credentials. The primary key of this table is
// the pair of `credential_id` and `relying_party_id`.
//
// credential_id The WebAuthn credential identifier blob.
// relying_party_id The relying party identifier string.
// browser_bound_key_id The identifier of the browser bound key.
class WebPaymentsTable : public WebDatabaseTable {
public:
WebPaymentsTable();
~WebPaymentsTable() override;
WebPaymentsTable(const WebPaymentsTable& other) = delete;
WebPaymentsTable& operator=(const WebPaymentsTable& other) = delete;
// Retrieves the WebPaymentsTable* owned by `db`.
static WebPaymentsTable* FromWebDatabase(WebDatabase* db);
// WebDatabaseTable:
WebDatabaseTable::TypeKey GetTypeKey() const override;
bool CreateTablesIfNecessary() override;
bool MigrateToVersion(int version, bool* update_compatible_version) override;
// Remove expired data.
void RemoveExpiredData();
// Clears all of the secure payment confirmation credential information
// created in the given time range `begin` and `end`. Return false for
// failure.
bool ClearSecurePaymentConfirmationCredentials(base::Time begin,
base::Time end);
// Adds `payment_method`'s manifest. `web_app_ids` contains supported web apps
// ids.
bool AddManifest(const std::string& payment_method,
const std::vector<std::string>& web_app_ids);
// Gets manifest for `payment_method`. Return empty vector if no manifest
// exists for this method.
std::vector<std::string> GetManifest(const std::string& payment_method);
// Adds a secure payment confirmation `credential`. All existing data for the
// credential's (relying_party_id, credential_id) tuple is erased before the
// new data is added.
//
// Each field in the `credential` should be non-empty and `relying_party_id`
// field should be a valid domain string. See:
// https://url.spec.whatwg.org/#valid-domain-string
//
// Returns false for invalid data, e.g., credential reuse between relying
// parties, or on failure.
bool AddSecurePaymentConfirmationCredential(
const SecurePaymentConfirmationCredential& credential);
// Executes a SQL statement for testing.
//
// Returns true if all statements execute successfully. If a statement fails,
// stops and returns false. Calls should be wrapped in ASSERT_TRUE().
bool ExecuteForTest(const base::cstring_view sql);
// Raze the database to the ground for testing.
//
// false is returned if the database is locked by some other
// process.
bool RazeForTest();
// Returns true if a column with the given name exists in the given table.
bool DoesColumnExistForTest(const base::cstring_view table_name,
const base::cstring_view column_name);
// Gets the list of secure payment confirmation credentials for the given list
// of `credential_ids`.
//
// Returns an empty vector when no data is found or when a read error occurs.
// Does not return invalid credentials.
//
// Please use `std::move()` for `credential_ids` parameter to avoid extra
// copies.
std::vector<std::unique_ptr<SecurePaymentConfirmationCredential>>
GetSecurePaymentConfirmationCredentials(
std::vector<std::vector<uint8_t>> credential_ids,
const std::string& relying_party_id);
// Sets a browser bound key identifier for the credential id, relying party id
// pair. If a browser bound key exists, no updates are performed and false is
// returned.
//
// Returns whether the browser bound key id was set.
bool SetBrowserBoundKey(std::vector<uint8_t> credential_id,
std::string_view relying_party_id,
std::vector<uint8_t> browser_bound_key_id);
// Gets the browser bound key id for the given credential id, relying party id
// pair.
//
// Returns the browser bound key id or nullopt when not found (or error
// occurred during retrieval).
std::optional<std::vector<uint8_t>> GetBrowserBoundKey(
std::vector<uint8_t> credential_id,
std::string_view relying_party_id);
// Gets all browser bound key entries.
//
// Returns the possibly empty vector of entries or an empty vector when a read
// error occurs.
std::vector<BrowserBoundKeyMetadata> GetAllBrowserBoundKeys();
// Deletes the given browser bound key entries by relying_party_id and
// credential_id.
bool DeleteBrowserBoundKeys(
std::vector<BrowserBoundKeyMetadata::RelyingPartyAndCredentialId>
passkeys);
};
} // namespace payments
#endif // COMPONENTS_PAYMENTS_CONTENT_WEB_PAYMENTS_TABLE_H_