network_anonymization_key.cc 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // Copyright 2022 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "net/base/network_anonymization_key.h"
  5. #include "base/feature_list.h"
  6. #include "base/unguessable_token.h"
  7. #include "net/base/features.h"
  8. #include "net/base/net_export.h"
  9. #include "net/base/schemeful_site.h"
  10. #include "third_party/abseil-cpp/absl/types/optional.h"
  11. namespace net {
  12. NetworkAnonymizationKey::NetworkAnonymizationKey(
  13. const SchemefulSite& top_frame_site,
  14. const absl::optional<SchemefulSite>& frame_site,
  15. const absl::optional<bool> is_cross_site,
  16. const absl::optional<base::UnguessableToken> nonce)
  17. : top_frame_site_(top_frame_site),
  18. frame_site_(!IsFrameSiteEnabled() ? absl::nullopt : frame_site),
  19. is_cross_site_(IsCrossSiteFlagSchemeEnabled() ? is_cross_site
  20. : absl::nullopt),
  21. nonce_(nonce) {}
  22. NetworkAnonymizationKey::NetworkAnonymizationKey() = default;
  23. NetworkAnonymizationKey::NetworkAnonymizationKey(
  24. const NetworkAnonymizationKey& network_anonymization_key) = default;
  25. NetworkAnonymizationKey::~NetworkAnonymizationKey() = default;
  26. NetworkAnonymizationKey& NetworkAnonymizationKey::operator=(
  27. const NetworkAnonymizationKey& network_anonymization_key) = default;
  28. NetworkAnonymizationKey& NetworkAnonymizationKey::operator=(
  29. NetworkAnonymizationKey&& network_anonymization_key) = default;
  30. std::string NetworkAnonymizationKey::ToDebugString() const {
  31. std::string str = GetSiteDebugString(top_frame_site_);
  32. str += " " + GetSiteDebugString(frame_site_);
  33. std::string cross_site_str =
  34. IsCrossSiteFlagSchemeEnabled()
  35. ? (GetIsCrossSite() ? " cross_site" : " same_site")
  36. : "";
  37. str += cross_site_str;
  38. // Currently, if the NAK has a nonce it will be marked transient. For debug
  39. // purposes we will print the value but if called via
  40. // `NetworkAnonymizationKey::ToString` we will have already returned "".
  41. if (nonce_.has_value()) {
  42. str += " (with nonce " + nonce_->ToString() + ")";
  43. }
  44. return str;
  45. }
  46. bool NetworkAnonymizationKey::IsEmpty() const {
  47. return !top_frame_site_.has_value();
  48. }
  49. bool NetworkAnonymizationKey::IsFullyPopulated() const {
  50. return top_frame_site_.has_value() &&
  51. (!IsFrameSiteEnabled() || frame_site_.has_value()) &&
  52. (!IsCrossSiteFlagSchemeEnabled() || is_cross_site_.has_value());
  53. }
  54. bool NetworkAnonymizationKey::IsTransient() const {
  55. if (!IsFullyPopulated())
  56. return true;
  57. return top_frame_site_->opaque() ||
  58. (IsFrameSiteEnabled() && frame_site_->opaque()) || nonce_.has_value();
  59. }
  60. bool NetworkAnonymizationKey::GetIsCrossSite() const {
  61. DCHECK(IsCrossSiteFlagSchemeEnabled() && is_cross_site_.has_value());
  62. return is_cross_site_.value();
  63. }
  64. bool NetworkAnonymizationKey::IsFrameSiteEnabled() {
  65. return !base::FeatureList::IsEnabled(
  66. net::features::kEnableDoubleKeyNetworkAnonymizationKey) &&
  67. !base::FeatureList::IsEnabled(
  68. net::features::kEnableCrossSiteFlagNetworkAnonymizationKey);
  69. }
  70. bool NetworkAnonymizationKey::IsDoubleKeySchemeEnabled() {
  71. // There's no reason both of these will be enabled simultaneously but if
  72. // someone manually enables both flags, double key with cross site flag scheme
  73. // should take precedence.
  74. return base::FeatureList::IsEnabled(
  75. net::features::kEnableDoubleKeyNetworkAnonymizationKey) &&
  76. !base::FeatureList::IsEnabled(
  77. net::features::kEnableCrossSiteFlagNetworkAnonymizationKey);
  78. }
  79. bool NetworkAnonymizationKey::IsCrossSiteFlagSchemeEnabled() {
  80. return base::FeatureList::IsEnabled(
  81. net::features::kEnableCrossSiteFlagNetworkAnonymizationKey);
  82. }
  83. std::string NetworkAnonymizationKey::GetSiteDebugString(
  84. const absl::optional<SchemefulSite>& site) const {
  85. return site ? site->GetDebugString() : "null";
  86. }
  87. } // namespace net