diff --git a/src/main/java/org/prebid/server/auction/ExchangeService.java b/src/main/java/org/prebid/server/auction/ExchangeService.java index c4ae087d205..0affdbf8741 100644 --- a/src/main/java/org/prebid/server/auction/ExchangeService.java +++ b/src/main/java/org/prebid/server/auction/ExchangeService.java @@ -42,6 +42,7 @@ 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; @@ -86,7 +87,6 @@ import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidBidderConfig; import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidCache; import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidData; -import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidDataEidPermissions; import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidMultiBid; import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidSchain; import org.prebid.server.proto.openrtb.ext.request.ExtRequestTargeting; @@ -129,7 +129,6 @@ public class ExchangeService { private static final String ALL_BIDDERS_CONFIG = "*"; private static final Integer DEFAULT_MULTIBID_LIMIT_MIN = 1; private static final Integer DEFAULT_MULTIBID_LIMIT_MAX = 9; - private static final String EID_ALLOWED_FOR_ALL_BIDDERS = "*"; private static final BigDecimal THOUSAND = BigDecimal.valueOf(1000); private static final Set BIDDER_FIELDS_EXCEPTION_LIST = Set.of( "adunitcode", "storedrequest", "options", "is_rewarded_inventory"); @@ -538,9 +537,9 @@ private Future> makeAuctionParticipation( final ExtRequest requestExt = bidRequest.getExt(); final ExtRequestPrebid prebid = requestExt != null ? requestExt.getPrebid() : null; final Map biddersToConfigs = getBiddersToConfigs(prebid); - final Map> eidPermissions = getEidPermissions(prebid); + final EidPermissionHolder eidPermissionHolder = getEidPermissions(prebid); final Map> bidderToUserAndDevice = - prepareUsersAndDevices(bidders, context, aliases, biddersToConfigs, eidPermissions); + prepareUsersAndDevices(bidders, context, aliases, biddersToConfigs, eidPermissionHolder); return privacyEnforcementService.mask(context, bidderToUserAndDevice, aliases) .map(bidderToPrivacyResult -> getAuctionParticipation( @@ -578,14 +577,12 @@ private Map getBiddersToConfigs(ExtRequestPrebid pr return bidderToConfig; } - private Map> getEidPermissions(ExtRequestPrebid prebid) { - final ExtRequestPrebidData prebidData = prebid != null ? prebid.getData() : null; - final List eidPermissions = prebidData != null - ? prebidData.getEidPermissions() - : null; - return CollectionUtils.emptyIfNull(eidPermissions).stream() - .collect(Collectors.toMap(ExtRequestPrebidDataEidPermissions::getSource, - ExtRequestPrebidDataEidPermissions::getBidders)); + private EidPermissionHolder getEidPermissions(ExtRequestPrebid prebid) { + return Optional.ofNullable(prebid) + .map(ExtRequestPrebid::getData) + .map(ExtRequestPrebidData::getEidPermissions) + .map(EidPermissionHolder::of) + .orElse(EidPermissionHolder.empty()); } private static List firstPartyDataBidders(ExtRequest requestExt) { @@ -594,11 +591,12 @@ private static List firstPartyDataBidders(ExtRequest requestExt) { return data == null ? null : data.getBidders(); } - private Map> prepareUsersAndDevices(List bidders, - AuctionContext context, - BidderAliases aliases, - Map biddersToConfigs, - Map> eidPermissions) { + private Map> prepareUsersAndDevices( + List bidders, + AuctionContext context, + BidderAliases aliases, + Map biddersToConfigs, + EidPermissionHolder eidPermissionHolder) { final BidRequest bidRequest = context.getBidRequest(); final List firstPartyDataBidders = firstPartyDataBidders(bidRequest.getExt()); @@ -610,7 +608,7 @@ private Map> prepareUsersAndDevices(List bidd final boolean useFirstPartyData = firstPartyDataBidders == null || firstPartyDataBidders.stream() .anyMatch(fpdBidder -> StringUtils.equalsIgnoreCase(fpdBidder, bidder)); final User preparedUser = prepareUser( - bidder, context, aliases, useFirstPartyData, fpdConfig, eidPermissions); + bidder, context, aliases, useFirstPartyData, fpdConfig, eidPermissionHolder); final Device preparedDevice = prepareDevice( bidRequest.getDevice(), fpdConfig, useFirstPartyData); bidderToUserAndDevice.put(bidder, Pair.of(preparedUser, preparedDevice)); @@ -623,13 +621,13 @@ private User prepareUser(String bidder, BidderAliases aliases, boolean useFirstPartyData, ExtBidderConfigOrtb fpdConfig, - Map> eidPermissions) { + EidPermissionHolder eidPermissionHolder) { final User user = context.getBidRequest().getUser(); final ExtUser extUser = user != null ? user.getExt() : null; final UpdateResult buyerUidUpdateResult = uidUpdater.updateUid(bidder, context, aliases); final List userEids = extractUserEids(user); - final List allowedUserEids = resolveAllowedEids(userEids, bidder, eidPermissions); + final List allowedUserEids = resolveAllowedEids(userEids, bidder, eidPermissionHolder); 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; @@ -669,20 +667,13 @@ private List extractUserEids(User user) { return user != null ? user.getEids() : null; } - private List resolveAllowedEids(List userEids, String bidder, Map> eidPermissions) { + private List resolveAllowedEids(List userEids, String bidder, EidPermissionHolder eidPermissionHolder) { return CollectionUtils.emptyIfNull(userEids) .stream() - .filter(userEid -> isUserEidAllowed(userEid.getSource(), eidPermissions, bidder)) + .filter(userEid -> eidPermissionHolder.isAllowed(userEid, bidder)) .toList(); } - private boolean isUserEidAllowed(String source, Map> eidPermissions, String bidder) { - final List allowedBidders = eidPermissions.get(source); - return CollectionUtils.isEmpty(allowedBidders) || allowedBidders.stream() - .anyMatch(allowedBidder -> StringUtils.equalsIgnoreCase(allowedBidder, bidder) - || EID_ALLOWED_FOR_ALL_BIDDERS.equals(allowedBidder)); - } - private List getAuctionParticipation( List bidderPrivacyResults, BidRequest bidRequest, diff --git a/src/main/java/org/prebid/server/auction/model/EidPermissionHolder.java b/src/main/java/org/prebid/server/auction/model/EidPermissionHolder.java new file mode 100644 index 00000000000..9f03d017d37 --- /dev/null +++ b/src/main/java/org/prebid/server/auction/model/EidPermissionHolder.java @@ -0,0 +1,72 @@ +package org.prebid.server.auction.model; + +import com.iab.openrtb.request.Eid; +import org.apache.commons.lang3.StringUtils; +import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidDataEidPermissions; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public final class EidPermissionHolder { + + 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 final List eidPermissions; + + private EidPermissionHolder(List eidPermissions) { + this.eidPermissions = new ArrayList<>(eidPermissions); + this.eidPermissions.add(DEFAULT_RULE); + } + + public static EidPermissionHolder of(List eidPermissions) { + return new EidPermissionHolder(eidPermissions); + } + + public static EidPermissionHolder empty() { + return EMPTY; + } + + public boolean isAllowed(Eid eid, String bidder) { + final Map> matchingRulesBySpecificity = eidPermissions + .stream() + .filter(rule -> isRuleMatched(eid, rule)) + .collect(Collectors.groupingBy(this::getRuleSpecificity)); + + final int highestSpecificityMatchingRules = Collections.max(matchingRulesBySpecificity.keySet()); + return matchingRulesBySpecificity.get(highestSpecificityMatchingRules).stream() + .anyMatch(eidPermission -> isBidderAllowed(bidder, eidPermission.getBidders())); + } + + private int getRuleSpecificity(ExtRequestPrebidDataEidPermissions eidPermission) { + return (int) Stream.of(eidPermission.getInserter(), + eidPermission.getSource(), + eidPermission.getMatcher(), + eidPermission.getMm()) + .filter(Objects::nonNull) + .count(); + } + + private boolean isRuleMatched(Eid eid, ExtRequestPrebidDataEidPermissions eidPermission) { + return (eidPermission.getInserter() == null || eidPermission.getInserter().equals(eid.getInserter())) + && (eidPermission.getSource() == null || eidPermission.getSource().equals(eid.getSource())) + && (eidPermission.getMatcher() == null || eidPermission.getMatcher().equals(eid.getMatcher())) + && (eidPermission.getMm() == null || eidPermission.getMm().equals(eid.getMm())); + } + + private boolean isBidderAllowed(String bidder, List ruleBidders) { + return ruleBidders == null || ruleBidders.stream() + .anyMatch(allowedBidder -> StringUtils.equalsIgnoreCase(allowedBidder, bidder) + || WILDCARD_BIDDER.equals(allowedBidder)); + } +} diff --git a/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtRequestPrebidDataEidPermissions.java b/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtRequestPrebidDataEidPermissions.java index 82b2e6007a1..2373c40e886 100644 --- a/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtRequestPrebidDataEidPermissions.java +++ b/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtRequestPrebidDataEidPermissions.java @@ -1,24 +1,43 @@ package org.prebid.server.proto.openrtb.ext.request; import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Builder; import lombok.Value; import java.util.List; -/** - * Defines the contract for bidrequest.ext.prebid.data.eidPermissions - */ -@Value(staticConstructor = "of") +@Value +@Builder public class ExtRequestPrebidDataEidPermissions { + /** + * Defines the contract for bidrequest.ext.prebid.data.eidPermissions.inserter + */ + String inserter; + /** * Defines the contract for bidrequest.ext.prebid.data.eidPermissions.source */ String source; + /** + * Defines the contract for bidrequest.ext.prebid.data.eidPermissions.matcher + */ + String matcher; + + /** + * Defines the contract for bidrequest.ext.prebid.data.eidPermissions.mm + */ + Integer mm; + /** * Defines the contract for bidrequest.ext.prebid.data.eidPermissions.bidders */ @JsonFormat(without = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) List bidders; + + @Deprecated + public static ExtRequestPrebidDataEidPermissions of(String source, List bidders) { + return new ExtRequestPrebidDataEidPermissions(null, source, null, null, bidders); + } } diff --git a/src/main/java/org/prebid/server/validation/RequestValidator.java b/src/main/java/org/prebid/server/validation/RequestValidator.java index d4b9fb06726..a0d1f749cc7 100644 --- a/src/main/java/org/prebid/server/validation/RequestValidator.java +++ b/src/main/java/org/prebid/server/validation/RequestValidator.java @@ -376,7 +376,7 @@ private void validateEidPermissions(List eid boolean isDebugEnabled, List warnings) throws ValidationException { - if (eidPermissions == null) { + if (ObjectUtils.isEmpty(eidPermissions)) { return; } @@ -385,14 +385,24 @@ private void validateEidPermissions(List eid throw new ValidationException("request.ext.prebid.data.eidpermissions[i] can't be null"); } - validateEidPermissionSource(eidPermission.getSource()); + validateEidPermissionCriteria(eidPermission.getInserter(), + eidPermission.getSource(), + eidPermission.getMatcher(), + eidPermission.getMm()); validateEidPermissionBidders(eidPermission.getBidders(), aliases, isDebugEnabled, warnings); } } - private void validateEidPermissionSource(String source) throws ValidationException { - if (StringUtils.isEmpty(source)) { - throw new ValidationException("Missing required value request.ext.prebid.data.eidPermissions[].source"); + private void validateEidPermissionCriteria(String inserter, + String source, + String matcher, + Integer mm) throws ValidationException { + if (StringUtils.isEmpty(inserter) + && StringUtils.isEmpty(source) + && StringUtils.isEmpty(matcher) + && mm == null) { + throw new ValidationException("Missing required parameter(s) in request.ext.prebid.data.eidPermissions[]. " + + "Either one or a combination of inserter, source, matcher, or mm should be defined."); } } diff --git a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java index 8e5291b4c1c..808cf5781b5 100644 --- a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java +++ b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java @@ -168,7 +168,6 @@ import java.time.ZoneId; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.EnumMap; import java.util.HashMap; import java.util.List; @@ -1243,7 +1242,7 @@ public void shouldReturnSeparateSeatBidsForTheSameBidderIfBiddersAliasAndBidderW builder -> builder.ext(ExtRequest.of(ExtRequestPrebid.builder() .auctiontimestamp(1000L) .build())))) - .originalPriceFloors(Collections.emptyMap()) + .originalPriceFloors(emptyMap()) .build()), any(), any(), @@ -1266,7 +1265,7 @@ public void shouldReturnSeparateSeatBidsForTheSameBidderIfBiddersAliasAndBidderW builder -> builder.ext(ExtRequest.of(ExtRequestPrebid.builder() .auctiontimestamp(1000L) .build())))) - .originalPriceFloors(Collections.emptyMap()) + .originalPriceFloors(emptyMap()) .build()), any(), any(), @@ -1506,7 +1505,7 @@ public void shouldCallBidResponseCreatorWithExpectedParamsAndUpdateDebugErrors() final ExtRequestPrebidMultiBid multiBid5 = ExtRequestPrebidMultiBid.of("bidder6", Arrays.asList("bidder4", "bidder5"), 0, "bi6"); final ExtRequestPrebidMultiBid multiBid6 = ExtRequestPrebidMultiBid.of(null, - Collections.emptyList(), 0, "bi7"); + emptyList(), 0, "bi7"); final ExtRequestTargeting targeting = givenTargeting(true); final ObjectNode events = mapper.createObjectNode(); @@ -2136,7 +2135,7 @@ public void shouldAddMultibidInfoOnlyAboutRequestedBidder() { // given final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap("someBidder", 1)), builder -> builder.ext(ExtRequest.of(ExtRequestPrebid.builder() - .multibid(Collections.singletonList( + .multibid(singletonList( ExtRequestPrebidMultiBid.of(null, asList("someBidder", "anotherBidder"), 3, null))) .build()))); @@ -2235,18 +2234,170 @@ public void shouldFilterUserExtEidsWhenBidderIsNotAllowedForSourceIgnoringCase() testUserEidsPermissionFiltering( // given asList(Eid.builder().source("source1").build(), Eid.builder().source("source2").build()), - singletonList(ExtRequestPrebidDataEidPermissions.of("source1", singletonList("OtHeRbIdDeR"))), + singletonList(ExtRequestPrebidDataEidPermissions.builder() + .source("source1") + .bidders(singletonList("OtHeRbIdDeR")) + .build()), emptyMap(), // expected singletonList(Eid.builder().source("source2").build())); } + @Test + public void shouldFilterUserExtEidsWhenBidderIsNotAllowedForInserterIgnoringCase() { + testUserEidsPermissionFiltering( + // given + asList(Eid.builder().inserter("inserter1").build(), Eid.builder().inserter("inserter2").build()), + singletonList(ExtRequestPrebidDataEidPermissions.builder() + .inserter("inserter1") + .bidders(singletonList("OtHeRbIdDeR")) + .build()), + emptyMap(), + // expected + singletonList(Eid.builder().inserter("inserter2").build())); + } + + @Test + public void shouldFilterUserExtEidsWhenBidderIsNotAllowedForMatcherIgnoringCase() { + testUserEidsPermissionFiltering( + // given + asList(Eid.builder().matcher("matcher1").build(), Eid.builder().matcher("matcher2").build()), + singletonList(ExtRequestPrebidDataEidPermissions.builder() + .matcher("matcher1") + .bidders(singletonList("OtHeRbIdDeR")) + .build()), + emptyMap(), + // expected + singletonList(Eid.builder().matcher("matcher2").build())); + } + + @Test + public void shouldFilterUserExtEidsWhenBidderIsNotAllowedForMm() { + testUserEidsPermissionFiltering( + // given + asList(Eid.builder().mm(1).build(), Eid.builder().mm(2).build()), + singletonList(ExtRequestPrebidDataEidPermissions.builder() + .mm(1) + .bidders(singletonList("OtHeRbIdDeR")) + .build()), + emptyMap(), + // expected + singletonList(Eid.builder().mm(2).build())); + } + + @Test + public void shouldFilterUserExtEidsWhenBidderIsNotAllowedUsingMultipleCriteria() { + testUserEidsPermissionFiltering( + // given + asList(Eid.builder().inserter("inserter1").source("source1").matcher("matcher1").mm(1).build(), + Eid.builder().inserter("inserter2").source("source2").matcher("matcher2").mm(2).build()), + singletonList(ExtRequestPrebidDataEidPermissions.builder() + .inserter("inserter1") + .source("source1") + .matcher("matcher1") + .mm(1) + .bidders(singletonList("OtHeRbIdDeR")) + .build()), + emptyMap(), + // expected + singletonList(Eid.builder().inserter("inserter2").source("source2").matcher("matcher2").mm(2).build())); + } + + @Test + public void shouldFilterUserExtEidsWhenEveryCriteriaMatches() { + testUserEidsPermissionFiltering( + // given + asList(Eid.builder().inserter("inserter1").source("source1").matcher("matcher1").mm(1).build(), + Eid.builder().inserter("inserter2").source("source2").matcher("matcher2").mm(2).build()), + singletonList(ExtRequestPrebidDataEidPermissions.builder() + .inserter("inserter1") + .source("source2") + .matcher("matcher3") + .mm(4) + .bidders(singletonList("OtHeRbIdDeR")) + .build()), + emptyMap(), + // expected + asList(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 shouldFilterUserExtEidsWhenBidderIsNotAllowedUsingTheMostSpecificRule() { + testUserEidsPermissionFiltering( + // given + asList(Eid.builder().inserter("inserter1").source("source1").matcher("matcher1").mm(1).build(), + Eid.builder().inserter("inserter2").source("source2").matcher("matcher2").mm(2).build()), + asList(ExtRequestPrebidDataEidPermissions.builder() + .inserter("inserter1") + .bidders(singletonList("someBidder")) + .build(), + ExtRequestPrebidDataEidPermissions.builder() + .inserter("inserter1") + .source("source1") + .matcher("matcher1") + .mm(1) + .bidders(singletonList("OtHeRbIdDeR")) + .build()), + emptyMap(), + // expected + singletonList(Eid.builder().inserter("inserter2").source("source2").matcher("matcher2").mm(2).build())); + } + + @Test + public void shouldNotFilterUserExtEidsWhenBidderIsAllowedUsingTheMostSpecificRule() { + testUserEidsPermissionFiltering( + // given + asList(Eid.builder().inserter("inserter1").source("source1").matcher("matcher1").mm(1).build(), + Eid.builder().inserter("inserter2").source("source2").matcher("matcher2").mm(2).build()), + asList(ExtRequestPrebidDataEidPermissions.builder() + .inserter("inserter1") + .bidders(singletonList("OtHeRbIdDeR")) + .build(), + ExtRequestPrebidDataEidPermissions.builder() + .inserter("inserter1") + .source("source1") + .matcher("matcher1") + .mm(1) + .bidders(singletonList("someBidder")) + .build()), + emptyMap(), + // expected + asList(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 shouldNotFilterUserExtEidsWhenBidderIsAllowedUsingMultipleSameSpecificityRules() { + testUserEidsPermissionFiltering( + // given + asList(Eid.builder().inserter("inserter1").source("source1").matcher("matcher1").mm(1).build(), + Eid.builder().inserter("inserter2").source("source2").matcher("matcher2").mm(2).build()), + asList(ExtRequestPrebidDataEidPermissions.builder() + .inserter("inserter1") + .source("source1") + .bidders(singletonList("OtHeRbIdDeR")) + .build(), + ExtRequestPrebidDataEidPermissions.builder() + .matcher("matcher1") + .mm(1) + .bidders(singletonList("someBidder")) + .build()), + emptyMap(), + // expected + asList(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 shouldNotFilterUserExtEidsWhenEidsPermissionDoesNotContainSourceIgnoringCase() { testUserEidsPermissionFiltering( // given singletonList(Eid.builder().source("source1").build()), - singletonList(ExtRequestPrebidDataEidPermissions.of("source2", singletonList("OtHeRbIdDeR"))), + singletonList(ExtRequestPrebidDataEidPermissions.builder() + .source("source2") + .bidders(singletonList("OtHeRbIdDeR")) + .build()), emptyMap(), // expected singletonList(Eid.builder().source("source1").build())); @@ -2257,7 +2408,10 @@ public void shouldNotFilterUserExtEidsWhenSourceAllowedForAllBiddersIgnoringCase testUserEidsPermissionFiltering( // given singletonList(Eid.builder().source("source1").build()), - singletonList(ExtRequestPrebidDataEidPermissions.of("source1", singletonList("*"))), + singletonList(ExtRequestPrebidDataEidPermissions.builder() + .source("source1") + .bidders(singletonList("*")) + .build()), emptyMap(), // expected singletonList(Eid.builder().source("source1").build())); @@ -2268,7 +2422,10 @@ public void shouldNotFilterUserExtEidsWhenSourceAllowedForBidderIgnoringCase() { testUserEidsPermissionFiltering( // given singletonList(Eid.builder().source("source1").build()), - singletonList(ExtRequestPrebidDataEidPermissions.of("source1", singletonList("SoMeBiDdEr"))), + singletonList(ExtRequestPrebidDataEidPermissions.builder() + .source("source1") + .bidders(singletonList("SoMeBiDdEr")) + .build()), emptyMap(), // expected singletonList(Eid.builder().source("source1").build())); @@ -2285,8 +2442,10 @@ public void shouldFilterUserExtEidsWhenBidderIsNotAllowedForSourceAndSetNullIfNo builder -> builder .ext(ExtRequest.of(ExtRequestPrebid.builder() .data(ExtRequestPrebidData.of(null, singletonList( - ExtRequestPrebidDataEidPermissions.of("source1", - singletonList("otherBidder"))))) + ExtRequestPrebidDataEidPermissions.builder() + .source("source1") + .bidders(singletonList("otherBidder")) + .build()))) .build())) .user(User.builder() .eids(singletonList(Eid.builder().source("source1").build())) @@ -2321,8 +2480,10 @@ public void shouldFilterUserExtEidsWhenBidderPermissionsGivenToBidderAliasOnly() .ext(ExtRequest.of(ExtRequestPrebid.builder() .aliases(singletonMap("someBidder", "someBidderAlias")) .data(ExtRequestPrebidData.of(null, singletonList( - ExtRequestPrebidDataEidPermissions.of("source1", - singletonList("someBidderAlias"))))) + ExtRequestPrebidDataEidPermissions.builder() + .source("source1") + .bidders(singletonList("someBidderAlias")) + .build()))) .build())) .user(User.builder() .eids(singletonList(Eid.builder().source("source1").build())) @@ -2357,8 +2518,10 @@ public void shouldFilterUserExtEidsWhenPermissionsGivenToBidderButNotForAlias() .ext(ExtRequest.of(ExtRequestPrebid.builder() .aliases(singletonMap("someBidder", "someBidderAlias")) .data(ExtRequestPrebidData.of(null, singletonList( - ExtRequestPrebidDataEidPermissions.of("source1", - singletonList("someBidder"))))) + ExtRequestPrebidDataEidPermissions.builder() + .source("source1") + .bidders(singletonList("someBidder")) + .build()))) .build())) .user(User.builder() .eids(singletonList(Eid.builder().source("source1").build())) diff --git a/src/test/java/org/prebid/server/auction/requestfactory/AuctionRequestFactoryTest.java b/src/test/java/org/prebid/server/auction/requestfactory/AuctionRequestFactoryTest.java index 2e30e8d1bc4..59615bdbaab 100644 --- a/src/test/java/org/prebid/server/auction/requestfactory/AuctionRequestFactoryTest.java +++ b/src/test/java/org/prebid/server/auction/requestfactory/AuctionRequestFactoryTest.java @@ -487,7 +487,11 @@ public void shouldReturnFailedFutureIfEidsPermissionsContainsWrongDataType() { final ObjectNode requestNode = mapper.convertValue(bidRequest, ObjectNode.class); final JsonNode eidPermissionNode = mapper.convertValue( - ExtRequestPrebidDataEidPermissions.of("source", emptyList()), JsonNode.class); + ExtRequestPrebidDataEidPermissions.builder() + .source("source") + .bidders(emptyList()) + .build(), + JsonNode.class); requestNode .putObject("ext") @@ -520,7 +524,11 @@ public void shouldReturnFailedFutureIfEidsPermissionsBiddersContainsWrongDataTyp final ObjectNode requestNode = mapper.convertValue(bidRequest, ObjectNode.class); final ObjectNode eidPermissionNode = mapper.convertValue( - ExtRequestPrebidDataEidPermissions.of("source", emptyList()), ObjectNode.class); + ExtRequestPrebidDataEidPermissions.builder() + .source("source") + .bidders(emptyList()) + .build(), + ObjectNode.class); eidPermissionNode.put("bidders", "notArrayValue"); diff --git a/src/test/java/org/prebid/server/validation/RequestValidatorTest.java b/src/test/java/org/prebid/server/validation/RequestValidatorTest.java index e4efd99feb9..653b7bf6a1d 100644 --- a/src/test/java/org/prebid/server/validation/RequestValidatorTest.java +++ b/src/test/java/org/prebid/server/validation/RequestValidatorTest.java @@ -635,7 +635,9 @@ public void validateShouldReturnValidationMessageWhenEidsPermissionsBiddersIsNul final BidRequest bidRequest = validBidRequestBuilder() .ext(ExtRequest.of(ExtRequestPrebid.builder() .data(ExtRequestPrebidData.of(null, - singletonList(ExtRequestPrebidDataEidPermissions.of("source", null)))) + singletonList(ExtRequestPrebidDataEidPermissions.builder() + .source("source") + .build()))) .build())) .build(); @@ -654,7 +656,10 @@ public void validateShouldReturnValidationMessageWhenEidsPermissionsBiddersIsEmp final BidRequest bidRequest = validBidRequestBuilder() .ext(ExtRequest.of(ExtRequestPrebid.builder() .data(ExtRequestPrebidData.of(null, - singletonList(ExtRequestPrebidDataEidPermissions.of("source", emptyList())))) + singletonList(ExtRequestPrebidDataEidPermissions.builder() + .source("source") + .bidders(Collections.emptyList()) + .build()))) .build())) .build(); @@ -675,7 +680,10 @@ public void validateShouldReturnWarningsMessageWhenEidsPermissionsBidderIsNotRec .ext(ExtRequest.of(ExtRequestPrebid.builder() .data(ExtRequestPrebidData.of(null, singletonList( - ExtRequestPrebidDataEidPermissions.of("source", singletonList("bidder1"))))) + ExtRequestPrebidDataEidPermissions.builder() + .source("source") + .bidders(Collections.singletonList("bidder1")) + .build()))) .build())) .build(); @@ -698,7 +706,10 @@ public void validateShouldNotReturnWarningsMessageWhenEidsPermissionsBidderIsNot .ext(ExtRequest.of(ExtRequestPrebid.builder() .data(ExtRequestPrebidData.of(null, singletonList( - ExtRequestPrebidDataEidPermissions.of("source", singletonList("bidder1"))))) + ExtRequestPrebidDataEidPermissions.builder() + .source("source") + .bidders(Collections.singletonList("bidder1")) + .build()))) .build())) .build(); @@ -718,7 +729,10 @@ public void validateShouldReturnWarningMessageWhenEidsPermissionsBidderHasBlankV .ext(ExtRequest.of(ExtRequestPrebid.builder() .data(ExtRequestPrebidData.of(null, singletonList( - ExtRequestPrebidDataEidPermissions.of("source", singletonList(" "))))) + ExtRequestPrebidDataEidPermissions.builder() + .source("source") + .bidders(Collections.singletonList(" ")) + .build()))) .build())) .build(); @@ -744,7 +758,10 @@ public void validateShouldNotReturnValidationErrorWhenBidderIsAlias() { .aliases(singletonMap("bidder1Alias", "bidder1")) .data(ExtRequestPrebidData.of(null, singletonList( - ExtRequestPrebidDataEidPermissions.of("source", singletonList("bidder1"))))) + ExtRequestPrebidDataEidPermissions.builder() + .source("source") + .bidders(Collections.singletonList("bidder1")) + .build()))) .build())) .build(); @@ -762,7 +779,10 @@ public void validateShouldNotReturnValidationErrorWhenBidderIsAsterisk() { .ext(ExtRequest.of(ExtRequestPrebid.builder() .data(ExtRequestPrebidData.of(null, singletonList( - ExtRequestPrebidDataEidPermissions.of("source", singletonList("*"))))) + ExtRequestPrebidDataEidPermissions.builder() + .source("source") + .bidders(Collections.singletonList("*")) + .build()))) .build())) .build(); @@ -780,7 +800,9 @@ public void validateShouldReturnValidationMessageWhenEidsPermissionsHasMissingSo .ext(ExtRequest.of(ExtRequestPrebid.builder() .data(ExtRequestPrebidData.of(null, singletonList( - ExtRequestPrebidDataEidPermissions.of(null, singletonList("bidder1"))))) + ExtRequestPrebidDataEidPermissions.builder() + .bidders(Collections.singletonList("bidder1")) + .build()))) .build())) .build(); @@ -789,7 +811,8 @@ public void validateShouldReturnValidationMessageWhenEidsPermissionsHasMissingSo // then assertThat(result.getErrors()).hasSize(1) - .containsOnly("Missing required value request.ext.prebid.data.eidPermissions[].source"); + .containsOnly("Missing required parameter(s) in request.ext.prebid.data.eidPermissions[]. " + + "Either one or a combination of inserter, source, matcher, or mm should be defined."); } @Test