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_ATTRIBUTION_REPORTING_ATTRIBUTION_CONFIG_H_
#define CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_CONFIG_H_

#include <stdint.h>

#include "base/time/time.h"
#include "components/attribution_reporting/constants.h"
#include "components/attribution_reporting/privacy_math.h"
#include "content/common/content_export.h"

namespace content {

// See https://wicg.github.io/attribution-reporting-api/#vendor-specific-values
// for details.
struct CONTENT_EXPORT AttributionConfig {
  // Controls rate limits for the API.
  struct CONTENT_EXPORT RateLimitConfig {
    RateLimitConfig();
    ~RateLimitConfig();

    // Returns true if this config is valid.
    [[nodiscard]] bool Validate() const;

    // Controls the rate-limiting time window for attribution.
    base::TimeDelta time_window = base::Days(30);

    // Maximum number of distinct reporting origins that can register sources
    // for a given <source site, destination site> in `time_window`.
    int64_t max_source_registration_reporting_origins = 100;

    // Maximum number of distinct reporting origins that can create attributions
    // for a given <source site, destination site> in `time_window`.
    int64_t max_attribution_reporting_origins = 10;

    // Maximum number of attributions for a given <source site, destination
    // site, reporting site> in `time_window`.
    int64_t max_attributions = 100;

    // Maximum number of distinct reporting origins for a given <source site,
    // reporting site> in `origins_per_site_window`.
    int max_reporting_origins_per_source_reporting_site = 1;

    // Controls the time window for reporting origins per site limit.
    base::TimeDelta origins_per_site_window = base::Days(1);

    friend bool operator==(const RateLimitConfig&,
                           const RateLimitConfig&) = default;

    // When adding new members, the corresponding `Validate()` definition
    // should also be updated.
  };

  struct CONTENT_EXPORT EventLevelLimit {
    EventLevelLimit();

    EventLevelLimit(const EventLevelLimit&);
    EventLevelLimit(EventLevelLimit&&);
    ~EventLevelLimit();

    EventLevelLimit& operator=(const EventLevelLimit&);
    EventLevelLimit& operator=(EventLevelLimit&&);

    // Returns true if this config is valid.
    [[nodiscard]] bool Validate() const;

    // Controls how many reports can be in the storage per attribution
    // destination.
    int max_reports_per_destination = 1024;

    friend bool operator==(const EventLevelLimit&,
                           const EventLevelLimit&) = default;

    // When adding new members, the corresponding `Validate()` definition
    // should also be updated.
  };

  struct CONTENT_EXPORT AggregateLimit {
    AggregateLimit();

    // Returns true if this config is valid.
    [[nodiscard]] bool Validate() const;

    // Controls how many reports can be in the storage per attribution
    // destination.
    int max_reports_per_destination = 1024;

    // Controls the report delivery time.
    base::TimeDelta min_delay;
    base::TimeDelta delay_span = base::Minutes(10);

    double null_reports_rate_include_source_registration_time =
        attribution_reporting::kNullReportsRateIncludeSourceRegistrationTime;
    double null_reports_rate_exclude_source_registration_time =
        attribution_reporting::kNullReportsRateExcludeSourceRegistrationTime;

    int max_aggregatable_reports_per_source = 20;

    friend bool operator==(const AggregateLimit&,
                           const AggregateLimit&) = default;

    // When adding new members, the corresponding `Validate()` definition
    // should also be updated.
  };

  struct CONTENT_EXPORT DestinationRateLimit {
    // Returns true if this config is valid.
    [[nodiscard]] bool Validate() const;

    static constexpr base::TimeDelta kPerDayRateLimitWindow = base::Days(1);

    int max_total = 200;
    int max_per_reporting_site = 50;
    base::TimeDelta rate_limit_window = base::Minutes(1);

    int max_per_reporting_site_per_day = 100;

    friend bool operator==(const DestinationRateLimit&,
                           const DestinationRateLimit&) = default;

    // When adding new members, the corresponding `Validate()` definition
    // should also be updated.
  };

  struct CONTENT_EXPORT AggregatableDebugRateLimit {
    // Returns true if this config is valid.
    [[nodiscard]] bool Validate() const;

    int max_budget_per_context_site = 1048576;
    int max_budget_per_context_reporting_site = 65536;

    static constexpr base::TimeDelta kRateLimitWindow = base::Days(1);

    int max_reports_per_source = 5;

    friend bool operator==(const AggregatableDebugRateLimit&,
                           const AggregatableDebugRateLimit&) = default;

    // When adding new members, the corresponding `Validate()` definition
    // should also be updated.
  };

  AttributionConfig();

  AttributionConfig(const AttributionConfig&);
  AttributionConfig(AttributionConfig&&);
  ~AttributionConfig();

  AttributionConfig& operator=(const AttributionConfig&);
  AttributionConfig& operator=(AttributionConfig&&);

  // Returns true if this config is valid.
  [[nodiscard]] bool Validate() const;

  // Controls how many sources can be in the storage per source origin.
  int max_sources_per_origin = 4096;

  // Controls the maximum number of distinct attribution destinations that can
  // be in storage at any time for sources with the same <source site, reporting
  // site>.
  int max_destinations_per_source_site_reporting_site = 100;

  RateLimitConfig rate_limit;
  EventLevelLimit event_level_limit;
  AggregateLimit aggregate_limit;
  DestinationRateLimit destination_rate_limit;
  AggregatableDebugRateLimit aggregatable_debug_rate_limit;
  attribution_reporting::PrivacyMathConfig privacy_math_config;

  friend bool operator==(const AttributionConfig&,
                         const AttributionConfig&) = default;

  // When adding new members, the corresponding `Validate()` definition
  // should also be updated.
};

}  // namespace content

#endif  // CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_CONFIG_H_