Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Refactored unit tests.
  • Loading branch information
And1sS committed Jan 19, 2026
commit 0e4cc05229093ba962ac730714e369790e8973f1
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.prebid.server.auction.model;
package org.prebid.server.auction;

import com.iab.openrtb.request.Eid;
import org.apache.commons.collections4.CollectionUtils;
Expand All @@ -13,28 +13,28 @@
import java.util.stream.Collectors;
import java.util.stream.Stream;

public final class EidPermissionHolder {
public class EidPermissionResolver {

private static final String WILDCARD_BIDDER = "*";

private static final ExtRequestPrebidDataEidPermissions DEFAULT_RULE = ExtRequestPrebidDataEidPermissions.builder()
.bidders(Collections.singletonList(WILDCARD_BIDDER))
.build();

private static final EidPermissionHolder EMPTY = new EidPermissionHolder(Collections.emptyList());
private static final EidPermissionResolver EMPTY = new EidPermissionResolver(Collections.emptyList());

private final List<ExtRequestPrebidDataEidPermissions> eidPermissions;

private EidPermissionHolder(List<ExtRequestPrebidDataEidPermissions> eidPermissions) {
private EidPermissionResolver(List<ExtRequestPrebidDataEidPermissions> eidPermissions) {
this.eidPermissions = new ArrayList<>(eidPermissions);
this.eidPermissions.add(DEFAULT_RULE);
}

public static EidPermissionHolder of(List<ExtRequestPrebidDataEidPermissions> eidPermissions) {
return new EidPermissionHolder(eidPermissions);
public static EidPermissionResolver of(List<ExtRequestPrebidDataEidPermissions> eidPermissions) {
return new EidPermissionResolver(eidPermissions);
}

public static EidPermissionHolder empty() {
public static EidPermissionResolver empty() {
return EMPTY;
}

Expand Down
19 changes: 9 additions & 10 deletions src/main/java/org/prebid/server/auction/ExchangeService.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@
import org.prebid.server.auction.model.BidderPrivacyResult;
import org.prebid.server.auction.model.BidderRequest;
import org.prebid.server.auction.model.BidderResponse;
import org.prebid.server.auction.model.EidPermissionHolder;
import org.prebid.server.auction.model.MultiBidConfig;
import org.prebid.server.auction.model.StoredResponseResult;
import org.prebid.server.auction.model.TimeoutContext;
Expand Down Expand Up @@ -537,9 +536,9 @@ private Future<List<AuctionParticipation>> makeAuctionParticipation(
final ExtRequest requestExt = bidRequest.getExt();
final ExtRequestPrebid prebid = requestExt != null ? requestExt.getPrebid() : null;
final Map<String, ExtBidderConfigOrtb> biddersToConfigs = getBiddersToConfigs(prebid);
final EidPermissionHolder eidPermissionHolder = getEidPermissions(prebid);
final EidPermissionResolver eidPermissionResolver = getEidPermissions(prebid);
final Map<String, Pair<User, Device>> bidderToUserAndDevice =
prepareUsersAndDevices(bidders, context, aliases, biddersToConfigs, eidPermissionHolder);
prepareUsersAndDevices(bidders, context, aliases, biddersToConfigs, eidPermissionResolver);

return privacyEnforcementService.mask(context, bidderToUserAndDevice, aliases)
.map(bidderToPrivacyResult -> getAuctionParticipation(
Expand Down Expand Up @@ -577,12 +576,12 @@ private Map<String, ExtBidderConfigOrtb> getBiddersToConfigs(ExtRequestPrebid pr
return bidderToConfig;
}

private EidPermissionHolder getEidPermissions(ExtRequestPrebid prebid) {
private EidPermissionResolver getEidPermissions(ExtRequestPrebid prebid) {
return Optional.ofNullable(prebid)
.map(ExtRequestPrebid::getData)
.map(ExtRequestPrebidData::getEidPermissions)
.map(EidPermissionHolder::of)
.orElse(EidPermissionHolder.empty());
.map(EidPermissionResolver::of)
.orElse(EidPermissionResolver.empty());
}

private static List<String> firstPartyDataBidders(ExtRequest requestExt) {
Expand All @@ -596,7 +595,7 @@ private Map<String, Pair<User, Device>> prepareUsersAndDevices(
AuctionContext context,
BidderAliases aliases,
Map<String, ExtBidderConfigOrtb> biddersToConfigs,
EidPermissionHolder eidPermissionHolder) {
EidPermissionResolver eidPermissionResolver) {

final BidRequest bidRequest = context.getBidRequest();
final List<String> firstPartyDataBidders = firstPartyDataBidders(bidRequest.getExt());
Expand All @@ -608,7 +607,7 @@ private Map<String, Pair<User, Device>> prepareUsersAndDevices(
final boolean useFirstPartyData = firstPartyDataBidders == null || firstPartyDataBidders.stream()
.anyMatch(fpdBidder -> StringUtils.equalsIgnoreCase(fpdBidder, bidder));
final User preparedUser = prepareUser(
bidder, context, aliases, useFirstPartyData, fpdConfig, eidPermissionHolder);
bidder, context, aliases, useFirstPartyData, fpdConfig, eidPermissionResolver);
final Device preparedDevice = prepareDevice(
bidRequest.getDevice(), fpdConfig, useFirstPartyData);
bidderToUserAndDevice.put(bidder, Pair.of(preparedUser, preparedDevice));
Expand All @@ -621,13 +620,13 @@ private User prepareUser(String bidder,
BidderAliases aliases,
boolean useFirstPartyData,
ExtBidderConfigOrtb fpdConfig,
EidPermissionHolder eidPermissionHolder) {
EidPermissionResolver eidPermissionResolver) {

final User user = context.getBidRequest().getUser();
final ExtUser extUser = user != null ? user.getExt() : null;
final UpdateResult<String> buyerUidUpdateResult = uidUpdater.updateUid(bidder, context, aliases);
final List<Eid> userEids = extractUserEids(user);
final List<Eid> allowedUserEids = eidPermissionHolder.resolveAllowedEids(userEids, bidder);
final List<Eid> allowedUserEids = eidPermissionResolver.resolveAllowedEids(userEids, bidder);
final boolean shouldUpdateUserEids = allowedUserEids.size() != CollectionUtils.emptyIfNull(userEids).size();
final boolean shouldCleanExtPrebid = extUser != null && extUser.getPrebid() != null;
final boolean shouldCleanExtData = extUser != null && extUser.getData() != null && !useFirstPartyData;
Expand Down
251 changes: 251 additions & 0 deletions src/test/java/org/prebid/server/auction/EidPermissionResolverTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,251 @@
package org.prebid.server.auction;

import com.iab.openrtb.request.Eid;
import org.junit.jupiter.api.Test;
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidDataEidPermissions;

import java.util.List;

import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
import static org.assertj.core.api.Assertions.assertThat;

public class EidPermissionResolverTest {

@Test
public void resolveShouldFilterEidsWhenBidderIsNotAllowedForSourceIgnoringCase() {
// given
final List<Eid> userEids = asList(
Eid.builder().source("source1").build(),
Eid.builder().source("source2").build());

final EidPermissionResolver resolver = EidPermissionResolver.of(
singletonList(ExtRequestPrebidDataEidPermissions.builder()
.source("source1")
.bidders(singletonList("OtHeRbIdDeR"))
.build()));

// when and then
assertThat(resolver.resolveAllowedEids(userEids, "someBidder"))
.containsExactly(Eid.builder().source("source2").build());
}

@Test
void resolveShouldFilterEidsWhenBidderIsNotAllowedForInserterIgnoringCase() {
// given
final List<Eid> userEids = asList(
Eid.builder().inserter("inserter1").build(),
Eid.builder().inserter("inserter2").build());

final EidPermissionResolver resolver = EidPermissionResolver.of(
singletonList(ExtRequestPrebidDataEidPermissions.builder()
.inserter("inserter1")
.bidders(singletonList("OtHeRbIdDeR"))
.build()));

// when and then
assertThat(resolver.resolveAllowedEids(userEids, "someBidder"))
.containsExactly(Eid.builder().inserter("inserter2").build());
}

@Test
public void resolveShouldFilterEidsWhenBidderIsNotAllowedForMatcherIgnoringCase() {
// given
final List<Eid> userEids = asList(
Eid.builder().matcher("matcher1").build(),
Eid.builder().matcher("matcher2").build());

final EidPermissionResolver resolver = EidPermissionResolver.of(
singletonList(ExtRequestPrebidDataEidPermissions.builder()
.matcher("matcher1")
.bidders(singletonList("OtHeRbIdDeR"))
.build()));

// when and then
assertThat(resolver.resolveAllowedEids(userEids, "someBidder"))
.containsExactly(Eid.builder().matcher("matcher2").build());
}

@Test
public void resolveShouldFilterEidsWhenBidderIsNotAllowedForMm() {
// given
final List<Eid> userEids = asList(Eid.builder().mm(1).build(), Eid.builder().mm(2).build());

final EidPermissionResolver resolver = EidPermissionResolver.of(
singletonList(ExtRequestPrebidDataEidPermissions.builder()
.mm(1)
.bidders(singletonList("OtHeRbIdDeR"))
.build()));

// when and then
assertThat(resolver.resolveAllowedEids(userEids, "someBidder"))
.containsExactly(Eid.builder().mm(2).build());
}

@Test
public void resolveShouldFilterEidsWhenBidderIsNotAllowedUsingMultipleCriteria() {
// given
final List<Eid> userEids = asList(
Eid.builder().inserter("inserter1").source("source1").matcher("matcher1").mm(1).build(),
Eid.builder().inserter("inserter2").source("source2").matcher("matcher2").mm(2).build());

final EidPermissionResolver resolver = EidPermissionResolver.of(
singletonList(ExtRequestPrebidDataEidPermissions.builder()
.inserter("inserter1")
.source("source1")
.matcher("matcher1")
.mm(1)
.bidders(singletonList("OtHeRbIdDeR"))
.build()));

// when and then
assertThat(resolver.resolveAllowedEids(userEids, "someBidder")).containsExactly(
Eid.builder().inserter("inserter2").source("source2").matcher("matcher2").mm(2).build());
}

@Test
public void resolveShouldFilterEidsWhenEveryCriteriaMatches() {
// given
final List<Eid> userEids = asList(
Eid.builder().inserter("inserter1").source("source1").matcher("matcher1").mm(1).build(),
Eid.builder().inserter("inserter2").source("source2").matcher("matcher2").mm(2).build());

final EidPermissionResolver resolver = EidPermissionResolver.of(
singletonList(ExtRequestPrebidDataEidPermissions.builder()
.inserter("inserter1")
.source("source2")
.matcher("matcher3")
.mm(4)
.bidders(singletonList("OtHeRbIdDeR"))
.build()));

// when and then
assertThat(resolver.resolveAllowedEids(userEids, "someBidder")).containsExactly(
Eid.builder().inserter("inserter1").source("source1").matcher("matcher1").mm(1).build(),
Eid.builder().inserter("inserter2").source("source2").matcher("matcher2").mm(2).build());
}

@Test
public void resolveShouldFilterEidsWhenBidderIsNotAllowedUsingTheMostSpecificRule() {
// given
final List<Eid> userEids = asList(
Eid.builder().inserter("inserter1").source("source1").matcher("matcher1").mm(1).build(),
Eid.builder().inserter("inserter2").source("source2").matcher("matcher2").mm(2).build());

final EidPermissionResolver resolver = EidPermissionResolver.of(
asList(ExtRequestPrebidDataEidPermissions.builder()
.inserter("inserter1")
.bidders(singletonList("someBidder"))
.build(),
ExtRequestPrebidDataEidPermissions.builder()
.inserter("inserter1")
.source("source1")
.matcher("matcher1")
.mm(1)
.bidders(singletonList("OtHeRbIdDeR"))
.build()));

// when and then
assertThat(resolver.resolveAllowedEids(userEids, "someBidder")).containsExactly(
Eid.builder().inserter("inserter2").source("source2").matcher("matcher2").mm(2).build());
}

@Test
public void resolveShouldNotFilterUserExtEidsWhenBidderIsAllowedUsingTheMostSpecificRule() {
// given
final List<Eid> userEids = asList(
Eid.builder().inserter("inserter1").source("source1").matcher("matcher1").mm(1).build(),
Eid.builder().inserter("inserter2").source("source2").matcher("matcher2").mm(2).build());

final EidPermissionResolver resolver = EidPermissionResolver.of(
asList(ExtRequestPrebidDataEidPermissions.builder()
.inserter("inserter1")
.bidders(singletonList("OtHeRbIdDeR"))
.build(),
ExtRequestPrebidDataEidPermissions.builder()
.inserter("inserter1")
.source("source1")
.matcher("matcher1")
.mm(1)
.bidders(singletonList("someBidder"))
.build()));

// when and then
assertThat(resolver.resolveAllowedEids(userEids, "someBidder")).containsExactly(
Eid.builder().inserter("inserter1").source("source1").matcher("matcher1").mm(1).build(),
Eid.builder().inserter("inserter2").source("source2").matcher("matcher2").mm(2).build());
}

@Test
public void resolveShouldNotFilterUserExtEidsWhenBidderIsAllowedUsingMultipleSameSpecificityRules() {
// given
final List<Eid> userEids = asList(
Eid.builder().inserter("inserter1").source("source1").matcher("matcher1").mm(1).build(),
Eid.builder().inserter("inserter2").source("source2").matcher("matcher2").mm(2).build());

final EidPermissionResolver resolver = EidPermissionResolver.of(
asList(ExtRequestPrebidDataEidPermissions.builder()
.inserter("inserter1")
.source("source1")
.bidders(singletonList("OtHeRbIdDeR"))
.build(),
ExtRequestPrebidDataEidPermissions.builder()
.matcher("matcher1")
.mm(1)
.bidders(singletonList("someBidder"))
.build()));

// when and then
assertThat(resolver.resolveAllowedEids(userEids, "someBidder")).containsExactly(
Eid.builder().inserter("inserter1").source("source1").matcher("matcher1").mm(1).build(),
Eid.builder().inserter("inserter2").source("source2").matcher("matcher2").mm(2).build());
}

@Test
public void resolveShouldNotFilterEidsWhenEidsPermissionDoesNotContainSourceIgnoringCase() {
// given
final List<Eid> userEids = singletonList(Eid.builder().source("source1").build());

final EidPermissionResolver resolver = EidPermissionResolver.of(
singletonList(ExtRequestPrebidDataEidPermissions.builder()
.source("source2")
.bidders(singletonList("OtHeRbIdDeR"))
.build()));

// when and then
assertThat(resolver.resolveAllowedEids(userEids, "someBidder"))
.containsExactly(Eid.builder().source("source1").build());
}

@Test
public void resolveShouldNotFilterEidsWhenSourceAllowedForAllBiddersIgnoringCase() {
// given
final List<Eid> userEids = singletonList(Eid.builder().source("source1").build());

final EidPermissionResolver resolver = EidPermissionResolver.of(
singletonList(ExtRequestPrebidDataEidPermissions.builder()
.source("source1")
.bidders(singletonList("*"))
.build()));

// when and then
assertThat(resolver.resolveAllowedEids(userEids, "someBidder"))
.containsExactly(Eid.builder().source("source1").build());
}

@Test
public void resolveShouldNotFilterEidsWhenSourceAllowedForBidderIgnoringCase() {
// given
final List<Eid> userEids = singletonList(Eid.builder().source("source1").build());

final EidPermissionResolver resolver = EidPermissionResolver.of(
singletonList(ExtRequestPrebidDataEidPermissions.builder()
.source("source1")
.bidders(singletonList("SoMeBiDdEr"))
.build()));

// when and then
assertThat(resolver.resolveAllowedEids(userEids, "someBidder"))
.containsExactly(Eid.builder().source("source1").build());
}
}
Loading
Loading