blob: a425c636f29a986e11e330ae8dbd7e38333e31d3 [file] [log] [blame]
// Copyright 2022 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "net/base/network_anonymization_key.h"
#include "base/feature_list.h"
#include "base/unguessable_token.h"
#include "net/base/features.h"
#include "net/base/net_export.h"
#include "net/base/schemeful_site.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace net {
NetworkAnonymizationKey::NetworkAnonymizationKey(
const SchemefulSite& top_frame_site,
const absl::optional<SchemefulSite>& frame_site,
const absl::optional<bool> is_cross_site,
const absl::optional<base::UnguessableToken> nonce)
: top_frame_site_(top_frame_site),
frame_site_(!IsFrameSiteEnabled() ? absl::nullopt : frame_site),
is_cross_site_(IsCrossSiteFlagSchemeEnabled() ? is_cross_site
: absl::nullopt),
nonce_(nonce) {}
NetworkAnonymizationKey::NetworkAnonymizationKey() = default;
NetworkAnonymizationKey::NetworkAnonymizationKey(
const NetworkAnonymizationKey& network_anonymization_key) = default;
NetworkAnonymizationKey::NetworkAnonymizationKey(
NetworkAnonymizationKey&& network_anonymization_key) = default;
NetworkAnonymizationKey::~NetworkAnonymizationKey() = default;
NetworkAnonymizationKey& NetworkAnonymizationKey::operator=(
const NetworkAnonymizationKey& network_anonymization_key) = default;
NetworkAnonymizationKey& NetworkAnonymizationKey::operator=(
NetworkAnonymizationKey&& network_anonymization_key) = default;
std::string NetworkAnonymizationKey::ToDebugString() const {
std::string str = GetSiteDebugString(top_frame_site_);
str += " " + GetSiteDebugString(frame_site_);
std::string cross_site_str =
IsCrossSiteFlagSchemeEnabled()
? (GetIsCrossSite() ? " cross_site" : " same_site")
: "";
str += cross_site_str;
// Currently, if the NAK has a nonce it will be marked transient. For debug
// purposes we will print the value but if called via
// `NetworkAnonymizationKey::ToString` we will have already returned "".
if (nonce_.has_value()) {
str += " (with nonce " + nonce_->ToString() + ")";
}
return str;
}
bool NetworkAnonymizationKey::IsEmpty() const {
return !top_frame_site_.has_value();
}
bool NetworkAnonymizationKey::IsFullyPopulated() const {
return top_frame_site_.has_value() &&
(!IsFrameSiteEnabled() || frame_site_.has_value()) &&
(!IsCrossSiteFlagSchemeEnabled() || is_cross_site_.has_value());
}
bool NetworkAnonymizationKey::IsTransient() const {
if (!IsFullyPopulated())
return true;
return top_frame_site_->opaque() ||
(IsFrameSiteEnabled() && frame_site_->opaque()) || nonce_.has_value();
}
bool NetworkAnonymizationKey::GetIsCrossSite() const {
DCHECK(IsCrossSiteFlagSchemeEnabled() && is_cross_site_.has_value());
return is_cross_site_.value();
}
const absl::optional<SchemefulSite>& NetworkAnonymizationKey::GetFrameSite()
const {
// Frame site will be empty if double-keying is enabled.
CHECK(NetworkAnonymizationKey::IsFrameSiteEnabled());
return frame_site_;
}
bool NetworkAnonymizationKey::IsFrameSiteEnabled() {
return !base::FeatureList::IsEnabled(
net::features::kEnableDoubleKeyNetworkAnonymizationKey) &&
!base::FeatureList::IsEnabled(
net::features::kEnableCrossSiteFlagNetworkAnonymizationKey);
}
bool NetworkAnonymizationKey::IsDoubleKeySchemeEnabled() {
// There's no reason both of these will be enabled simultaneously but if
// someone manually enables both flags, double key with cross site flag scheme
// should take precedence.
return base::FeatureList::IsEnabled(
net::features::kEnableDoubleKeyNetworkAnonymizationKey) &&
!base::FeatureList::IsEnabled(
net::features::kEnableCrossSiteFlagNetworkAnonymizationKey);
}
bool NetworkAnonymizationKey::IsCrossSiteFlagSchemeEnabled() {
return base::FeatureList::IsEnabled(
net::features::kEnableCrossSiteFlagNetworkAnonymizationKey);
}
std::string NetworkAnonymizationKey::GetSiteDebugString(
const absl::optional<SchemefulSite>& site) const {
return site ? site->GetDebugString() : "null";
}
} // namespace net