Skip to content

Conversation

@Net-burst
Copy link
Collaborator

@Net-burst Net-burst commented Jan 12, 2026

🔧 Type of changes

  • new bid adapter
  • bid adapter update
  • new feature
  • new analytics adapter
  • new module
  • module update
  • bugfix
  • documentation
  • configuration
  • dependency update
  • tech debt (test coverage, refactorings, etc.)

✨ What's the context?

prebid/prebid-server#4623

@Net-burst Net-burst force-pushed the feature/extend-eid-permissions branch from f174bd6 to 9a711eb Compare January 12, 2026 17:59
@Net-burst Net-burst requested a review from Lightwood13 January 14, 2026 14:31
# Conflicts:
#	src/test/java/org/prebid/server/auction/ExchangeServiceTest.java
@Net-burst Net-burst marked this pull request as ready for review January 15, 2026 03:09
@osulzhenko osulzhenko requested a review from And1sS January 15, 2026 08:29
Comment on lines +61 to +64
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()));
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add method nullOrEquals(T permission, T eid)

Comment on lines +39 to +42
@Deprecated
public static ExtRequestPrebidDataEidPermissions of(String source, List<String> bidders) {
return new ExtRequestPrebidDataEidPermissions(null, source, null, null, bidders);
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't like the idea to keep it

List<String> warnings) throws ValidationException {

if (eidPermissions == null) {
if (ObjectUtils.isEmpty(eidPermissions)) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CollectionUtils

validateEidPermissionCriteria(eidPermission.getInserter(),
eidPermission.getSource(),
eidPermission.getMatcher(),
eidPermission.getMm());
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

            validateEidPermissionCriteria(
                    eidPermission.getInserter(),
                    eidPermission.getSource(),
                    eidPermission.getMatcher(),
                    eidPermission.getMm());

String source,
String matcher,
Integer mm) throws ValidationException {
if (StringUtils.isEmpty(inserter)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add empty line after multi-line declaration

if (StringUtils.isEmpty(inserter)
&& StringUtils.isEmpty(source)
&& StringUtils.isEmpty(matcher)
&& mm == null) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about to use StringUtils.isAllEmpty?

Comment on lines +2247 to +2390
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()));
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since you have extracted logic from ExchangeService -> tests should be moved too. Also, please, unwrap tests. This is unreadable.

Comment on lines +670 to 675
private List<Eid> resolveAllowedEids(List<Eid> userEids, String bidder, EidPermissionHolder eidPermissionHolder) {
return CollectionUtils.emptyIfNull(userEids)
.stream()
.filter(userEid -> isUserEidAllowed(userEid.getSource(), eidPermissions, bidder))
.filter(userEid -> eidPermissionHolder.isAllowed(userEid, bidder))
.toList();
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can also be moved to EidPermissionHolder.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants