#ifndef CONTENT_BROWSER_INTEREST_GROUP_ADDITIONAL_BIDS_UTIL_H_
#define CONTENT_BROWSER_INTEREST_GROUP_ADDITIONAL_BIDS_UTIL_H_
#include <stdint.h>
#include <array>
#include <optional>
#include <string>
#include <vector>
#include "base/containers/flat_set.h"
#include "base/types/expected.h"
#include "base/types/optional_ref.h"
#include "base/uuid.h"
#include "base/values.h"
#include "content/browser/interest_group/auction_metrics_recorder.h"
#include "content/browser/interest_group/interest_group_auction.h"
#include "content/common/content_export.h"
#include "third_party/blink/public/common/interest_group/interest_group.h"
#include "url/origin.h"
namespace content {
struct CONTENT_EXPORT AdditionalBidDecodeResult {
AdditionalBidDecodeResult();
AdditionalBidDecodeResult(const AdditionalBidDecodeResult& other) = delete;
AdditionalBidDecodeResult(AdditionalBidDecodeResult&& other);
~AdditionalBidDecodeResult();
AdditionalBidDecodeResult& operator=(const AdditionalBidDecodeResult&) =
delete;
AdditionalBidDecodeResult& operator=(AdditionalBidDecodeResult&&);
std::unique_ptr<InterestGroupAuction::BidState> bid_state;
std::unique_ptr<InterestGroupAuction::Bid> bid;
std::optional<url::Origin> negative_target_joining_origin;
std::vector<std::string> negative_target_interest_group_names;
};
CONTENT_EXPORT base::expected<AdditionalBidDecodeResult, std::string>
DecodeAdditionalBid(
InterestGroupAuction* auction,
const base::Value& bid_in,
const base::Uuid& auction_nonce_from_header,
base::optional_ref<const std::string> seller_nonce_from_header,
const base::flat_set<url::Origin>& interest_group_buyers,
const url::Origin& seller,
base::optional_ref<const url::Origin> top_level_seller);
struct CONTENT_EXPORT SignedAdditionalBidSignature {
blink::InterestGroup::AdditionalBidKey key;
std::array<uint8_t, 64> signature;
};
struct CONTENT_EXPORT SignedAdditionalBid {
SignedAdditionalBid();
SignedAdditionalBid(const SignedAdditionalBid& other) = delete;
SignedAdditionalBid(SignedAdditionalBid&& other);
~SignedAdditionalBid();
SignedAdditionalBid& operator=(const SignedAdditionalBid&) = delete;
SignedAdditionalBid& operator=(SignedAdditionalBid&&);
std::string additional_bid_json;
std::vector<SignedAdditionalBidSignature> signatures;
std::vector<size_t> VerifySignatures();
};
CONTENT_EXPORT base::expected<SignedAdditionalBid, std::string>
DecodeSignedAdditionalBid(base::Value signed_additional_bid_in);
class CONTENT_EXPORT AdAuctionNegativeTargeter {
public:
AdAuctionNegativeTargeter();
~AdAuctionNegativeTargeter();
void AddInterestGroupInfo(const url::Origin& buyer,
const std::string& name,
const url::Origin& joining_origin,
const blink::InterestGroup::AdditionalBidKey& key);
size_t GetNumNegativeInterestGroups();
bool ShouldDropDueToNegativeTargeting(
const url::Origin& buyer,
const std::optional<url::Origin>& negative_target_joining_origin,
const std::vector<std::string>& negative_target_interest_group_names,
const std::vector<SignedAdditionalBidSignature>& signatures,
const std::vector<size_t>& valid_signatures,
const url::Origin& seller,
AuctionMetricsRecorder& auction_metrics_recorder,
std::vector<std::string>& errors_out);
private:
struct NegativeInfo {
NegativeInfo();
NegativeInfo(const NegativeInfo& other) = delete;
NegativeInfo(NegativeInfo&& other) = delete;
~NegativeInfo();
NegativeInfo& operator=(const NegativeInfo&) = delete;
NegativeInfo& operator=(NegativeInfo&&) = delete;
url::Origin joining_origin;
blink::InterestGroup::AdditionalBidKey key;
};
std::map<std::pair<url::Origin, std::string>, NegativeInfo>
negative_interest_groups_;
};
}
#endif