Skip to content

Commit

Permalink
Parse JSON into intermediate structure
Browse files Browse the repository at this point in the history
We will eventually move this into components/attribution_reporting after
AttributionFilterData and AttributionAggregationKeys are.

Bug: 1379009
Change-Id: I69fd130e213d287eb6eb1ce4c6e03af49f5ee546
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4004737
Reviewed-by: Nan Lin <linnan@chromium.org>
Commit-Queue: Andrew Paseltiner <apaseltiner@chromium.org>
Quick-Run: Andrew Paseltiner <apaseltiner@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1067520}
  • Loading branch information
Andrew Paseltiner authored and Chromium LUCI CQ committed Nov 4, 2022
1 parent d4d917b commit 0afe717
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 36 deletions.
94 changes: 66 additions & 28 deletions content/browser/attribution_reporting/attribution_header_utils.cc
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <string>
#include <utility>

#include "base/check.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_piece.h"
#include "base/time/time.h"
Expand Down Expand Up @@ -62,14 +63,28 @@ absl::optional<base::TimeDelta> ParseTimeDeltaInSeconds(

} // namespace

base::expected<StorableSource, SourceRegistrationError> ParseSourceRegistration(
base::Value::Dict registration,
base::Time source_time,
url::Origin reporting_origin,
url::Origin source_origin,
AttributionSourceType source_type,
bool is_within_fenced_frame) {
url::Origin destination;
SourceRegistration::SourceRegistration() = default;

SourceRegistration::~SourceRegistration() = default;

SourceRegistration::SourceRegistration(const SourceRegistration&) = default;

SourceRegistration& SourceRegistration::operator=(const SourceRegistration&) =
default;

SourceRegistration::SourceRegistration(SourceRegistration&&) = default;

SourceRegistration& SourceRegistration::operator=(SourceRegistration&&) =
default;

// static
base::expected<SourceRegistration, SourceRegistrationError>
SourceRegistration::Parse(base::Value::Dict registration,
url::Origin reporting_origin) {
DCHECK(network::IsOriginPotentiallyTrustworthy(reporting_origin));

SourceRegistration result;

{
const base::Value* v = registration.Find("destination");
if (!v)
Expand All @@ -79,59 +94,82 @@ base::expected<StorableSource, SourceRegistrationError> ParseSourceRegistration(
if (!s)
return base::unexpected(SourceRegistrationError::kDestinationWrongType);

destination = url::Origin::Create(GURL(*s));
if (!network::IsOriginPotentiallyTrustworthy(destination)) {
result.destination = url::Origin::Create(GURL(*s));
if (!network::IsOriginPotentiallyTrustworthy(result.destination)) {
return base::unexpected(
SourceRegistrationError::kDestinationUntrustworthy);
}
}

uint64_t source_event_id =
result.source_event_id =
ParseUint64(registration, "source_event_id").value_or(0);

int64_t priority = ParseInt64(registration, "priority").value_or(0);
result.priority = ParseInt64(registration, "priority").value_or(0);

absl::optional<base::TimeDelta> expiry =
ParseTimeDeltaInSeconds(registration, "expiry");
result.expiry = ParseTimeDeltaInSeconds(registration, "expiry");

absl::optional<base::TimeDelta> event_report_window =
result.event_report_window =
ParseTimeDeltaInSeconds(registration, "event_report_window");

absl::optional<base::TimeDelta> aggregatable_report_window =
result.aggregatable_report_window =
ParseTimeDeltaInSeconds(registration, "aggregatable_report_window");

absl::optional<uint64_t> debug_key = ParseUint64(registration, "debug_key");
result.debug_key = ParseUint64(registration, "debug_key");

base::expected<AttributionFilterData, SourceRegistrationError> filter_data =
AttributionFilterData::FromJSON(registration.Find("filter_data"));
if (!filter_data.has_value())
return base::unexpected(filter_data.error());

result.filter_data = std::move(*filter_data);

base::expected<AttributionAggregationKeys, SourceRegistrationError>
aggregation_keys = AttributionAggregationKeys::FromJSON(
registration.Find("aggregation_keys"));
if (!aggregation_keys.has_value())
return base::unexpected(aggregation_keys.error());

bool debug_reporting =
result.aggregation_keys = std::move(*aggregation_keys);

result.debug_reporting =
registration.FindBool("debug_reporting").value_or(false);

result.reporting_origin = std::move(reporting_origin);
return result;
}

base::expected<StorableSource, SourceRegistrationError> ParseSourceRegistration(
base::Value::Dict registration,
base::Time source_time,
url::Origin reporting_origin,
url::Origin source_origin,
AttributionSourceType source_type,
bool is_within_fenced_frame) {
base::expected<SourceRegistration,
attribution_reporting::mojom::SourceRegistrationError>
reg = SourceRegistration::Parse(std::move(registration),
std::move(reporting_origin));
if (!reg.has_value())
return base::unexpected(reg.error());

return StorableSource(
CommonSourceInfo(
source_event_id, std::move(source_origin), std::move(destination),
std::move(reporting_origin), source_time,
CommonSourceInfo::GetExpiryTime(expiry, source_time, source_type),
event_report_window
reg->source_event_id, std::move(source_origin),
std::move(reg->destination), std::move(reg->reporting_origin),
source_time,
CommonSourceInfo::GetExpiryTime(reg->expiry, source_time,
source_type),
reg->event_report_window
? absl::make_optional(CommonSourceInfo::GetExpiryTime(
event_report_window, source_time, source_type))
reg->event_report_window, source_time, source_type))
: absl::nullopt,
aggregatable_report_window
reg->aggregatable_report_window
? absl::make_optional(CommonSourceInfo::GetExpiryTime(
aggregatable_report_window, source_time, source_type))
reg->aggregatable_report_window, source_time, source_type))
: absl::nullopt,
source_type, priority, std::move(*filter_data), debug_key,
std::move(*aggregation_keys)),
is_within_fenced_frame, debug_reporting);
source_type, reg->priority, std::move(reg->filter_data),
reg->debug_key, std::move(reg->aggregation_keys)),
is_within_fenced_frame, reg->debug_reporting);
}

} // namespace content
43 changes: 35 additions & 8 deletions content/browser/attribution_reporting/attribution_header_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,18 @@
#ifndef CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_HEADER_UTILS_H_
#define CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_HEADER_UTILS_H_

#include <stdint.h>

#include "base/time/time.h"
#include "base/types/expected.h"
#include "base/values.h"
#include "components/attribution_reporting/source_registration_error.mojom-forward.h"
#include "content/browser/attribution_reporting/attribution_aggregation_keys.h"
#include "content/browser/attribution_reporting/attribution_filter_data.h"
#include "content/browser/attribution_reporting/attribution_source_type.h"
#include "content/common/content_export.h"

namespace base {
class Time;
} // namespace base

namespace url {
class Origin;
} // namespace url
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "url/origin.h"

namespace content {

Expand All @@ -33,6 +32,34 @@ ParseSourceRegistration(base::Value::Dict registration,
AttributionSourceType source_type,
bool is_within_fenced_frame);

struct SourceRegistration {
static base::expected<SourceRegistration,
attribution_reporting::mojom::SourceRegistrationError>
Parse(base::Value::Dict, url::Origin reporting_origin);

SourceRegistration();

~SourceRegistration();

SourceRegistration(const SourceRegistration&);
SourceRegistration& operator=(const SourceRegistration&);

SourceRegistration(SourceRegistration&&);
SourceRegistration& operator=(SourceRegistration&&);

uint64_t source_event_id;
url::Origin destination;
url::Origin reporting_origin;
absl::optional<base::TimeDelta> expiry;
absl::optional<base::TimeDelta> event_report_window;
absl::optional<base::TimeDelta> aggregatable_report_window;
int64_t priority;
AttributionFilterData filter_data;
absl::optional<uint64_t> debug_key;
AttributionAggregationKeys aggregation_keys;
bool debug_reporting;
};

} // namespace content

#endif // CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_HEADER_UTILS_H_

0 comments on commit 0afe717

Please sign in to comment.