910e62b5创建于 1月15日历史提交
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CONTENT_BROWSER_BTM_BTM_STORAGE_H_
#define CONTENT_BROWSER_BTM_BTM_STORAGE_H_

#include <cstddef>
#include <map>
#include <string>

#include "base/files/file_path.h"
#include "base/functional/callback_forward.h"
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "base/time/time.h"
#include "content/browser/btm/btm_database.h"
#include "content/browser/btm/btm_state.h"
#include "content/browser/btm/btm_utils.h"
#include "content/common/content_export.h"
#include "services/network/public/mojom/clear_data_filter.mojom-forward.h"

class GURL;

namespace content {

// Manages the storage of `BtmState` values in the BTM database.
//
// This class is not thread-safe and should only be used on the sequence it was
// created on.
class CONTENT_EXPORT BtmStorage {
 public:
  explicit BtmStorage(const std::optional<base::FilePath>& path);
  ~BtmStorage();

  BtmState Read(const GURL& url);

  std::optional<PopupsStateValue> ReadPopup(const std::string& first_party_site,
                                            const std::string& tracking_site);

  std::vector<PopupWithTime> ReadRecentPopupsWithInteraction(
      const base::TimeDelta& lookback);

  bool WritePopup(const std::string& first_party_site,
                  const std::string& tracking_site,
                  const uint64_t access_id,
                  const base::Time& popup_time,
                  bool is_current_interaction,
                  bool is_authentication_interaction);

  void RemoveEvents(base::Time delete_begin,
                    base::Time delete_end,
                    network::mojom::ClearDataFilterPtr filter,
                    const BtmEventRemovalType type);

  // Delete all DB rows for |sites|.
  void RemoveRows(const std::vector<std::string>& sites);
  // Delete all DB rows for |sites| without a protective event. A protective
  // event is a user activation or successful WebAuthn assertion.
  void RemoveRowsWithoutProtectiveEvent(const std::set<std::string>& sites);

  // DIPS Helper Method Impls --------------------------------------------------

  // Record that there was a user activation on `url`.
  void RecordUserActivation(const GURL& url, base::Time time);
  void RecordWebAuthnAssertion(const GURL& url, base::Time time);
  // Record that |url| redirected the user.
  void RecordBounce(const GURL& url, base::Time time);

  // Storage querying Methods --------------------------------------------------

  // Returns two subsets of sites in `sites` with a protective event recorded.
  // A protective event is a user activation or successful WebAuthn assertion.
  //
  // The first item in the return value contains the sites that had a user
  // activation, and the second item contains the sites that had a WebAuthn
  // assertion.
  std::pair<std::set<std::string>, std::set<std::string>>
  FilterSitesWithProtectiveEvent(const std::set<std::string>& sites) const;

  // Returns the subset of sites in |sites| WITHOUT a protective event recorded.
  // A protective event is a user activation or successful WebAuthn assertion.
  std::set<std::string> FilterSitesWithoutProtectiveEvent(
      std::set<std::string> sites) const;

  // Returns all sites that did a bounce that aren't protected from DIPS.
  std::vector<std::string> GetSitesThatBounced(
      base::TimeDelta grace_period) const;

  // Returns the list of sites that should have their state cleared by BTM. How
  // these sites are determined is controlled by the value of
  // `features::kBtmTriggeringAction`. Passing a non-NULL `grace_period`
  // parameter overrides the use of `features::kBtmGracePeriod` when
  // evaluating sites to clear.
  std::vector<std::string> GetSitesToClear(
      std::optional<base::TimeDelta> grace_period) const;

  // Returns true if `url`'s site has had user activation since `bound`.
  bool DidSiteHaveUserActivationSince(const GURL& url, base::Time bound);

  // Returns the timestamp of the last user activation time on `url`, or
  // std::nullopt if there has been no user activation on `url`.
  std::optional<base::Time> LastUserActivationTime(const GURL& url);

  // Returns the timestamp of the last web authentication time on `url`, or
  // std::nullopt if there has been no authentication on `url`.
  std::optional<base::Time> LastWebAuthnAssertionTime(const GURL& url);

  // Returns the timestamp of the most recent of the last user activation or
  // authentication on `url`, or std::nullopt if there has been no user
  // activation or authentication on `url`.
  std::optional<base::Time> LastUserActivationOrAuthnAssertionTime(
      const GURL& url);

  // Returns time and type of the most recent interaction with the given url.
  std::pair<std::optional<base::Time>, BtmInteractionType>
  LastInteractionTimeAndType(const GURL& url);

  std::optional<base::Time> GetTimerLastFired();
  bool SetTimerLastFired(base::Time time);

  // Utility Methods -----------------------------------------------------------

  static void DeleteDatabaseFiles(base::FilePath path,
                                  base::OnceClosure on_complete);

  void SetClockForTesting(base::Clock* clock) {
    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
    db_->SetClockForTesting(clock);
  }

 protected:
  void Write(const BtmState& state);

 private:
  friend class BtmState;
  BtmState ReadSite(std::string site);

  std::unique_ptr<BtmDatabase> db_ GUARDED_BY_CONTEXT(sequence_checker_);
  SEQUENCE_CHECKER(sequence_checker_);

  base::WeakPtrFactory<BtmStorage> weak_factory_{this};
};

}  // namespace content

#endif  // CONTENT_BROWSER_BTM_BTM_STORAGE_H_