From 5d028357c65b75fddac632485bbb4803cb9b3225 Mon Sep 17 00:00:00 2001 From: Peixun Zhang Date: Sun, 26 Apr 2026 23:04:10 +0200 Subject: [PATCH 01/10] DATA-46376 Use matcher to determine when to apply EID permissions, instead of source names, to avoid collisions with unrelated traffic and ensure we only permission IDs we enrich.: --- ...elIdentityProcessedAuctionRequestHook.java | 30 ++++--- ...entityProcessedAuctionRequestHookTest.java | 89 ++++--------------- 2 files changed, 32 insertions(+), 87 deletions(-) diff --git a/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java b/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java index ba5203e5e75..2c83aee652f 100644 --- a/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java +++ b/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java @@ -61,6 +61,8 @@ public class LiveIntentOmniChannelIdentityProcessedAuctionRequestHook implements private static final String INSERTER = "s2s.liveintent.com"; + private static final String MATCHER = "itsLiveintent"; + private final LiveIntentOmniChannelProperties config; private final JacksonMapper mapper; private final HttpClient httpClient; @@ -172,7 +174,7 @@ private IdResResponse processResponse(HttpClientResponse response) { } final List modifiedEids = eids.stream() - .map(eid -> eid.toBuilder().inserter(INSERTER).build()) + .map(eid -> eid.toBuilder().inserter(INSERTER).matcher(MATCHER).build()) .toList(); return IdResResponse.of(modifiedEids); @@ -216,8 +218,8 @@ private BidRequest updateBidRequest(BidRequest bidRequest, List resolvedEid } private ExtRequest updateExtRequest(ExtRequest ext, List resolvedEids) { - final Set uniqueSources = CollectionUtils.emptyIfNull(resolvedEids).stream() - .map(Eid::getSource) + final Set uniqueMatcher = CollectionUtils.emptyIfNull(resolvedEids).stream() + .map(Eid::getMatcher) .filter(StringUtils::isNotEmpty) .collect(Collectors.toSet()); @@ -227,8 +229,8 @@ private ExtRequest updateExtRequest(ExtRequest ext, List resolvedEids) { extPrebidData != null ? extPrebidData.getEidPermissions() : null; final List modifiedEidPermissions = CollectionUtils.isEmpty(eidPermissions) - ? createEidPermissions(uniqueSources) - : modifyEidPermissions(eidPermissions, uniqueSources); + ? createEidPermissions(uniqueMatcher) + : modifyEidPermissions(eidPermissions, uniqueMatcher); final ExtRequestPrebid updatedExtPrebid = Optional.ofNullable(extPrebid) .map(ExtRequestPrebid::toBuilder) @@ -257,10 +259,10 @@ private static User updateUser(User user, List resolvedEids) { .build(); } - private List createEidPermissions(Set sources) { - return sources.stream() - .map(source -> ExtRequestPrebidDataEidPermissions.builder() - .source(source) + private List createEidPermissions(Set matcher) { + return matcher.stream() + .map(liMatcher -> ExtRequestPrebidDataEidPermissions.builder() + .matcher(liMatcher) .inserter(INSERTER) .bidders(targetBidders.stream().toList()) .build()) @@ -269,12 +271,12 @@ private List createEidPermissions(Set modifyEidPermissions( List eidPermissions, - Set sources) { + Set matcher) { final List modifiedEidPermissions = eidPermissions.stream() - .map(it -> updateEidPermission(it, sources)) + .map(it -> updateEidPermission(it, matcher)) .filter(Objects::nonNull) .toList(); - final List defaultEidPermissions = createEidPermissions(sources); + final List defaultEidPermissions = createEidPermissions(matcher); return ListUtils.union(modifiedEidPermissions, defaultEidPermissions); } @@ -287,8 +289,8 @@ private ExtRequestPrebidData updatePrebidData(ExtRequestPrebidData extPrebidData } private ExtRequestPrebidDataEidPermissions updateEidPermission(ExtRequestPrebidDataEidPermissions eidPermission, - Set sources) { - if (!sources.contains(eidPermission.getSource()) || !INSERTER.equals(eidPermission.getInserter())) { + Set matcher) { + if (!matcher.contains(eidPermission.getMatcher()) || !INSERTER.equals(eidPermission.getInserter())) { return eidPermission; } diff --git a/extra/modules/live-intent-omni-channel-identity/src/test/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/LiveIntentOmniChannelIdentityProcessedAuctionRequestHookTest.java b/extra/modules/live-intent-omni-channel-identity/src/test/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/LiveIntentOmniChannelIdentityProcessedAuctionRequestHookTest.java index e89910b02de..53abc06b323 100644 --- a/extra/modules/live-intent-omni-channel-identity/src/test/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/LiveIntentOmniChannelIdentityProcessedAuctionRequestHookTest.java +++ b/extra/modules/live-intent-omni-channel-identity/src/test/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/LiveIntentOmniChannelIdentityProcessedAuctionRequestHookTest.java @@ -91,8 +91,8 @@ public void setUp() { defaultPermissions = ExtRequestPrebidDataEidPermissions.builder() .inserter("s2s.liveintent.com") + .matcher("itsLiveintent") .bidders(configuredBidders.stream().toList()) - .source("liveintent.com") .build(); target = new LiveIntentOmniChannelIdentityProcessedAuctionRequestHook( @@ -257,7 +257,7 @@ public void callShouldEnrichUserEidsWithRequestedEids() { final Eid expectedEid = Eid.builder() .source("liveintent.com") .uids(singletonList(Uid.builder().id("id2").atype(3).build())) - .matcher("liveintent.com") + .matcher("itsLiveintent") .build(); final String responseBody = MAPPER.encodeToString(IdResResponse.of(List.of(expectedEid))); @@ -283,7 +283,10 @@ public void callShouldEnrichUserEidsWithRequestedEids() { .extracting(AuctionRequestPayload::bidRequest) .extracting(BidRequest::getUser) .extracting(User::getEids) - .isEqualTo(List.of(givenEid, expectedEid.toBuilder().inserter("s2s.liveintent.com").build())); + .isEqualTo(List.of(givenEid, expectedEid.toBuilder() + .inserter("s2s.liveintent.com") + .matcher("itsLiveintent") + .build())); verify(httpClient).post( eq("https://test.com/idres"), @@ -300,7 +303,7 @@ public void callShouldCreateUserAndUseRequestedEidsWhenUserIsAbsent() { final Eid expectedEid = Eid.builder() .source("liveintent.com") .uids(singletonList(Uid.builder().id("id2").atype(3).build())) - .matcher("liveintent.com") + .matcher("itsLiveintent") .build(); final String responseBody = MAPPER.encodeToString(IdResResponse.of(List.of(expectedEid))); @@ -326,7 +329,10 @@ public void callShouldCreateUserAndUseRequestedEidsWhenUserIsAbsent() { .extracting(AuctionRequestPayload::bidRequest) .extracting(BidRequest::getUser) .extracting(User::getEids) - .isEqualTo(List.of(expectedEid.toBuilder().inserter("s2s.liveintent.com").build())); + .isEqualTo(List.of(expectedEid.toBuilder() + .inserter("s2s.liveintent.com") + .matcher("itsLiveintent") + .build())); verify(httpClient).post( eq("https://test.com/idres"), @@ -400,12 +406,12 @@ public void shouldRestrictExistingEidPermissionsByIntersectionAndKeepGlobalBidde .build(); final ExtRequestPrebidDataEidPermissions liBidder2 = ExtRequestPrebidDataEidPermissions.builder() - .source("liveintent.com") + .matcher("itsLiveintent") .inserter("s2s.liveintent.com") .bidders(singletonList("bidder2")) .build(); final ExtRequestPrebidDataEidPermissions liBidder23 = ExtRequestPrebidDataEidPermissions.builder() - .source("liveintent.com") + .matcher("itsLiveintent") .inserter("s2s.liveintent.com") .bidders(List.of("bidder2", "bidder3")) .build(); @@ -423,70 +429,7 @@ public void shouldRestrictExistingEidPermissionsByIntersectionAndKeepGlobalBidde List.of("bidderX"), ListUtil.union(List.of(otherBidder, liBidder2), List.of(defaultPermissions))); - final Eid expectedEid = Eid.builder().source("liveintent.com").build(); - - final String responseBody = MAPPER.encodeToString(IdResResponse.of(List.of(expectedEid))); - given(httpClient.post(any(), any(), any(), anyLong())) - .willReturn(Future.succeededFuture(HttpClientResponse.of(200, null, responseBody))); - - given(auctionInvocationContext.auctionContext()).willReturn(auctionContext); - given(auctionContext.getActivityInfrastructure()).willReturn(activityInfrastructure); - given(activityInfrastructure.isAllowed(any(), any())).willReturn(true); - given(userFpdActivityMask.maskUser(any(), eq(false), eq(false))) - .willAnswer(invocation -> invocation.getArgument(0)); - given(userFpdActivityMask.maskDevice(any(), eq(false), eq(false))) - .willAnswer(invocation -> invocation.getArgument(0)); - - // when - final InvocationResult result = - target.call(AuctionRequestPayloadImpl.of(givenBidRequest), auctionInvocationContext).result(); - // then - assertThat(result.status()).isEqualTo(InvocationStatus.success); - assertThat(result.payloadUpdate().apply(AuctionRequestPayloadImpl.of(givenBidRequest))) - .extracting(AuctionRequestPayload::bidRequest) - .extracting(BidRequest::getExt) - .extracting(ExtRequest::getPrebid) - .extracting(ExtRequestPrebid::getData) - .isEqualTo(expectedData); - - verify(httpClient).post( - eq("https://test.com/idres"), - argThat(headers -> headers.contains("Authorization", "Bearer auth_token", true)), - eq(MAPPER.encodeToString(givenBidRequest)), - eq(5L)); - } - - @Test - public void shouldNotAddNewEidPermissionsOrModifyGlobalBiddersWhenSourceNotPresent() { - // given - final Uid givenUid = Uid.builder().id("id1").atype(2).build(); - final Eid givenEid = Eid.builder().source("some.source.com").uids(singletonList(givenUid)).build(); - final User givenUser = User.builder().eids(singletonList(givenEid)).build(); - final ExtRequestPrebidDataEidPermissions bidder1 = ExtRequestPrebidDataEidPermissions.builder() - .source("some.other-source.com") - .inserter("some.other-inserter.com") - .bidders(singletonList("bidder3")) - .build(); - final ExtRequestPrebidDataEidPermissions bidder2 = ExtRequestPrebidDataEidPermissions.builder() - .source("some.source.com") - .inserter("s2s.liveintent.com") - .bidders(singletonList("bidder3")) - .build(); - - final List bidders = List.of(bidder1, bidder2); - - final BidRequest givenBidRequest = BidRequest.builder() - .id("request") - .user(givenUser) - .ext(ExtRequest.of(ExtRequestPrebid.builder() - .data(ExtRequestPrebidData.of(singletonList("bidder3"), bidders)) - .build())) - .build(); - - final ExtRequestPrebidData expectedData = ExtRequestPrebidData.of(List.of("bidder3"), - ListUtil.union(bidders, List.of(defaultPermissions))); - - final Eid expectedEid = Eid.builder().source("liveintent.com").build(); + final Eid expectedEid = Eid.builder().matcher("itsLiveintent").build(); final String responseBody = MAPPER.encodeToString(IdResResponse.of(List.of(expectedEid))); given(httpClient.post(any(), any(), any(), anyLong())) @@ -530,7 +473,7 @@ public void shouldRemovePermissionWhenIntersectionIsEmpty() { List.of("bidderGlobal"), List.of( ExtRequestPrebidDataEidPermissions.builder() - .source("liveintent.com") + .matcher("itsLiveintent") .inserter("s2s.liveintent.com") .bidders(singletonList("not-allowed")) .build(), @@ -545,7 +488,7 @@ public void shouldRemovePermissionWhenIntersectionIsEmpty() { .ext(ExtRequest.of(ExtRequestPrebid.builder().data(givenData).build())) .build(); - final Eid expectedEid = Eid.builder().source("liveintent.com").build(); + final Eid expectedEid = Eid.builder().matcher("itsLiveintent").build(); final String responseBody = MAPPER.encodeToString(IdResResponse.of(List.of(expectedEid))); given(httpClient.post(any(), any(), any(), anyLong())) .willReturn(Future.succeededFuture(HttpClientResponse.of(200, null, responseBody))); From 07bd873f6b3d9a528e309fc65deb70c36b10e7c3 Mon Sep 17 00:00:00 2001 From: Peixun Zhang Date: Mon, 27 Apr 2026 11:55:39 +0200 Subject: [PATCH 02/10] rename --- ...ntOmniChannelIdentityProcessedAuctionRequestHook.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java b/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java index 2c83aee652f..aabdbbe6173 100644 --- a/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java +++ b/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java @@ -218,6 +218,7 @@ private BidRequest updateBidRequest(BidRequest bidRequest, List resolvedEid } private ExtRequest updateExtRequest(ExtRequest ext, List resolvedEids) { + // can just use the constant MATCHER here final Set uniqueMatcher = CollectionUtils.emptyIfNull(resolvedEids).stream() .map(Eid::getMatcher) .filter(StringUtils::isNotEmpty) @@ -259,10 +260,10 @@ private static User updateUser(User user, List resolvedEids) { .build(); } - private List createEidPermissions(Set matcher) { - return matcher.stream() - .map(liMatcher -> ExtRequestPrebidDataEidPermissions.builder() - .matcher(liMatcher) + private List createEidPermissions(Set matchers) { + return matchers.stream() + .map(matcherInEid -> ExtRequestPrebidDataEidPermissions.builder() + .matcher(matcherInEid) .inserter(INSERTER) .bidders(targetBidders.stream().toList()) .build()) From 2b5c693e4b12c19d4d61655ad510565490aed4a9 Mon Sep 17 00:00:00 2001 From: Peixun Zhang Date: Mon, 27 Apr 2026 15:02:33 +0200 Subject: [PATCH 03/10] refactor n test --- ...elIdentityProcessedAuctionRequestHook.java | 493 +++++++++--------- ...entityProcessedAuctionRequestHookTest.java | 30 +- 2 files changed, 261 insertions(+), 262 deletions(-) diff --git a/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java b/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java index aabdbbe6173..0e552a0a3b7 100644 --- a/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java +++ b/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java @@ -10,7 +10,6 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.ListUtils; import org.apache.commons.collections4.SetUtils; -import org.apache.commons.lang3.StringUtils; import org.prebid.server.activity.Activity; import org.prebid.server.activity.ComponentType; import org.prebid.server.activity.infrastructure.ActivityInfrastructure; @@ -50,269 +49,271 @@ import java.util.Optional; import java.util.Set; import java.util.concurrent.ThreadLocalRandom; -import java.util.stream.Collectors; public class LiveIntentOmniChannelIdentityProcessedAuctionRequestHook implements ProcessedAuctionRequestHook { - private static final ConditionalLogger conditionalLogger = new ConditionalLogger(LoggerFactory.getLogger( - LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.class)); - - private static final String CODE = "liveintent-omni-channel-identity-enrichment-hook"; - - private static final String INSERTER = "s2s.liveintent.com"; - - private static final String MATCHER = "itsLiveintent"; - - private final LiveIntentOmniChannelProperties config; - private final JacksonMapper mapper; - private final HttpClient httpClient; - private final UserFpdActivityMask userFpdActivityMask; - private final double logSamplingRate; - private final Set targetBidders; - - public LiveIntentOmniChannelIdentityProcessedAuctionRequestHook(LiveIntentOmniChannelProperties config, - UserFpdActivityMask userFpdActivityMask, - JacksonMapper mapper, - HttpClient httpClient, - double logSamplingRate) { - - this.config = Objects.requireNonNull(config); - HttpUtil.validateUrlSyntax(config.getIdentityResolutionEndpoint()); - this.mapper = Objects.requireNonNull(mapper); - this.httpClient = Objects.requireNonNull(httpClient); - this.logSamplingRate = logSamplingRate; - this.userFpdActivityMask = Objects.requireNonNull(userFpdActivityMask); - this.targetBidders = SetUtils.emptyIfNull(config.getTargetBidders()); - } - - @Override - public Future> call(AuctionRequestPayload auctionRequestPayload, - AuctionInvocationContext invocationContext) { - - return config.getTreatmentRate() > ThreadLocalRandom.current().nextFloat() - ? requestIdentities(auctionRequestPayload.bidRequest(), invocationContext.auctionContext()) - .>map(this::update) - .onFailure(throwable -> conditionalLogger.error( - "Failed enrichment: %s".formatted(throwable.getMessage()), logSamplingRate)) - : noAction(); - } - - private Future requestIdentities(BidRequest bidRequest, AuctionContext auctionContext) { - final BidRequest restrictedBidRequest = applyActivityRestrictions(bidRequest, auctionContext); - return httpClient.post( - config.getIdentityResolutionEndpoint(), - headers(), - mapper.encodeToString(restrictedBidRequest), - config.getRequestTimeoutMs()) - .map(this::processResponse); - } - - private BidRequest applyActivityRestrictions(BidRequest bidRequest, AuctionContext auctionContext) { - final ActivityInvocationPayload activityInvocationPayload = BidRequestActivityInvocationPayload.of( - ActivityInvocationPayloadImpl.of( - ComponentType.GENERAL_MODULE, - LiveIntentOmniChannelIdentityModule.CODE), - bidRequest); - final ActivityInfrastructure activityInfrastructure = auctionContext.getActivityInfrastructure(); - - final boolean disallowTransmitUfpd = !activityInfrastructure.isAllowed( - Activity.TRANSMIT_UFPD, activityInvocationPayload); - final boolean disallowTransmitEids = !activityInfrastructure.isAllowed( - Activity.TRANSMIT_EIDS, activityInvocationPayload); - final boolean disallowTransmitGeo = !activityInfrastructure.isAllowed( - Activity.TRANSMIT_GEO, activityInvocationPayload); - final boolean disallowTransmitTid = !activityInfrastructure.isAllowed( - Activity.TRANSMIT_TID, activityInvocationPayload); - - return maskUserPersonalInfo( - bidRequest, - disallowTransmitUfpd, - disallowTransmitEids, - disallowTransmitGeo, - disallowTransmitTid); - } - - private BidRequest maskUserPersonalInfo(BidRequest bidRequest, - boolean disallowTransmitUfpd, - boolean disallowTransmitEids, - boolean disallowTransmitGeo, - boolean disallowTransmitTid) { - - final User maskedUser = userFpdActivityMask.maskUser( - bidRequest.getUser(), disallowTransmitUfpd, disallowTransmitEids); - final Device maskedDevice = userFpdActivityMask.maskDevice( - bidRequest.getDevice(), disallowTransmitUfpd, disallowTransmitGeo); - - final Source maskedSource = maskSource(bidRequest.getSource(), disallowTransmitUfpd, disallowTransmitTid); - - return bidRequest.toBuilder() - .user(maskedUser) - .device(maskedDevice) - .source(maskedSource) - .build(); - } - - private Source maskSource(Source source, boolean mastUfpd, boolean maskTid) { - if (source == null || !(mastUfpd || maskTid)) { - return source; + private static final ConditionalLogger conditionalLogger = new ConditionalLogger(LoggerFactory.getLogger( + LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.class)); + + private static final String CODE = "liveintent-omni-channel-identity-enrichment-hook"; + + private static final String INSERTER = "s2s.liveintent.com"; + + private static final String MATCHER = "liveintentStamp"; + + private final LiveIntentOmniChannelProperties config; + private final JacksonMapper mapper; + private final HttpClient httpClient; + private final UserFpdActivityMask userFpdActivityMask; + private final double logSamplingRate; + private final Set targetBidders; + + public LiveIntentOmniChannelIdentityProcessedAuctionRequestHook(LiveIntentOmniChannelProperties config, + UserFpdActivityMask userFpdActivityMask, + JacksonMapper mapper, + HttpClient httpClient, + double logSamplingRate) { + + this.config = Objects.requireNonNull(config); + HttpUtil.validateUrlSyntax(config.getIdentityResolutionEndpoint()); + this.mapper = Objects.requireNonNull(mapper); + this.httpClient = Objects.requireNonNull(httpClient); + this.logSamplingRate = logSamplingRate; + this.userFpdActivityMask = Objects.requireNonNull(userFpdActivityMask); + this.targetBidders = SetUtils.emptyIfNull(config.getTargetBidders()); + } + + @Override + public Future> call(AuctionRequestPayload auctionRequestPayload, + AuctionInvocationContext invocationContext) { + + return config.getTreatmentRate() > ThreadLocalRandom.current().nextFloat() + ? requestIdentities(auctionRequestPayload.bidRequest(), + invocationContext.auctionContext()) + .>map(this::update) + .onFailure(throwable -> conditionalLogger.error( + "Failed enrichment: %s" + .formatted(throwable.getMessage()), + logSamplingRate)) + : noAction(); + } + + private Future requestIdentities(BidRequest bidRequest, AuctionContext auctionContext) { + final BidRequest restrictedBidRequest = applyActivityRestrictions(bidRequest, auctionContext); + return httpClient.post( + config.getIdentityResolutionEndpoint(), + headers(), + mapper.encodeToString(restrictedBidRequest), + config.getRequestTimeoutMs()) + .map(this::processResponse); + } + + private BidRequest applyActivityRestrictions(BidRequest bidRequest, AuctionContext auctionContext) { + final ActivityInvocationPayload activityInvocationPayload = BidRequestActivityInvocationPayload.of( + ActivityInvocationPayloadImpl.of( + ComponentType.GENERAL_MODULE, + LiveIntentOmniChannelIdentityModule.CODE), + bidRequest); + final ActivityInfrastructure activityInfrastructure = auctionContext.getActivityInfrastructure(); + + final boolean disallowTransmitUfpd = !activityInfrastructure.isAllowed( + Activity.TRANSMIT_UFPD, activityInvocationPayload); + final boolean disallowTransmitEids = !activityInfrastructure.isAllowed( + Activity.TRANSMIT_EIDS, activityInvocationPayload); + final boolean disallowTransmitGeo = !activityInfrastructure.isAllowed( + Activity.TRANSMIT_GEO, activityInvocationPayload); + final boolean disallowTransmitTid = !activityInfrastructure.isAllowed( + Activity.TRANSMIT_TID, activityInvocationPayload); + + return maskUserPersonalInfo( + bidRequest, + disallowTransmitUfpd, + disallowTransmitEids, + disallowTransmitGeo, + disallowTransmitTid); + } + + private BidRequest maskUserPersonalInfo(BidRequest bidRequest, + boolean disallowTransmitUfpd, + boolean disallowTransmitEids, + boolean disallowTransmitGeo, + boolean disallowTransmitTid) { + + final User maskedUser = userFpdActivityMask.maskUser( + bidRequest.getUser(), disallowTransmitUfpd, disallowTransmitEids); + final Device maskedDevice = userFpdActivityMask.maskDevice( + bidRequest.getDevice(), disallowTransmitUfpd, disallowTransmitGeo); + + final Source maskedSource = maskSource(bidRequest.getSource(), disallowTransmitUfpd, + disallowTransmitTid); + + return bidRequest.toBuilder() + .user(maskedUser) + .device(maskedDevice) + .source(maskedSource) + .build(); + } + + private Source maskSource(Source source, boolean mastUfpd, boolean maskTid) { + if (source == null || !(mastUfpd || maskTid)) { + return source; + } + + return source.toBuilder().tid(null).build(); + } + + private MultiMap headers() { + return MultiMap.caseInsensitiveMultiMap() + .add(HttpUtil.AUTHORIZATION_HEADER, "Bearer " + config.getAuthToken()); } - return source.toBuilder().tid(null).build(); - } + private IdResResponse processResponse(HttpClientResponse response) { + final IdResResponse res = mapper.decodeValue(response.getBody(), IdResResponse.class); + final List eids = res.getEids(); + + if (CollectionUtils.isEmpty(eids)) { + return res; + } - private MultiMap headers() { - return MultiMap.caseInsensitiveMultiMap() - .add(HttpUtil.AUTHORIZATION_HEADER, "Bearer " + config.getAuthToken()); - } + final List modifiedEids = eids.stream() + .map(eid -> eid.toBuilder().inserter(INSERTER).matcher(MATCHER).build()) + .toList(); - private IdResResponse processResponse(HttpClientResponse response) { - final IdResResponse res = mapper.decodeValue(response.getBody(), IdResResponse.class); - final List eids = res.getEids(); + return IdResResponse.of(modifiedEids); + } + + private static Future> noAction() { + return Future.succeededFuture(InvocationResultImpl.builder() + .status(InvocationStatus.success) + .action(InvocationAction.no_action) + .build()); + } + + private InvocationResultImpl update(IdResResponse resolutionResult) { + return InvocationResultImpl.builder() + .status(InvocationStatus.success) + .action(InvocationAction.update) + .payloadUpdate(payload -> updatedPayload(payload, resolutionResult.getEids())) + .analyticsTags(TagsImpl.of(List.of( + ActivityImpl.of( + "liveintent-enriched", "success", + List.of( + ResultImpl.of( + "", + mapper.mapper().createObjectNode() + .put("treatmentRate", + config.getTreatmentRate()), + null)))))) + .build(); + } + + private AuctionRequestPayload updatedPayload(AuctionRequestPayload requestPayload, List resolvedEids) { + return CollectionUtils.isNotEmpty(resolvedEids) + ? AuctionRequestPayloadImpl + .of(updateBidRequest(requestPayload.bidRequest(), resolvedEids)) + : requestPayload; + } - if (CollectionUtils.isEmpty(eids)) { - return res; + private BidRequest updateBidRequest(BidRequest bidRequest, List resolvedEids) { + return bidRequest.toBuilder() + .ext(updateExtRequest(bidRequest.getExt(), resolvedEids)) + .user(updateUser(bidRequest.getUser(), resolvedEids)) + .build(); } - final List modifiedEids = eids.stream() - .map(eid -> eid.toBuilder().inserter(INSERTER).matcher(MATCHER).build()) - .toList(); - - return IdResResponse.of(modifiedEids); - } - - private static Future> noAction() { - return Future.succeededFuture(InvocationResultImpl.builder() - .status(InvocationStatus.success) - .action(InvocationAction.no_action) - .build()); - } - - private InvocationResultImpl update(IdResResponse resolutionResult) { - return InvocationResultImpl.builder() - .status(InvocationStatus.success) - .action(InvocationAction.update) - .payloadUpdate(payload -> updatedPayload(payload, resolutionResult.getEids())) - .analyticsTags(TagsImpl.of(List.of( - ActivityImpl.of( - "liveintent-enriched", "success", - List.of( - ResultImpl.of( - "", - mapper.mapper().createObjectNode() - .put("treatmentRate", config.getTreatmentRate()), - null)))))) - .build(); - } - - private AuctionRequestPayload updatedPayload(AuctionRequestPayload requestPayload, List resolvedEids) { - return CollectionUtils.isNotEmpty(resolvedEids) - ? AuctionRequestPayloadImpl.of(updateBidRequest(requestPayload.bidRequest(), resolvedEids)) - : requestPayload; - } - - private BidRequest updateBidRequest(BidRequest bidRequest, List resolvedEids) { - return bidRequest.toBuilder() - .ext(updateExtRequest(bidRequest.getExt(), resolvedEids)) - .user(updateUser(bidRequest.getUser(), resolvedEids)) - .build(); - } - - private ExtRequest updateExtRequest(ExtRequest ext, List resolvedEids) { - // can just use the constant MATCHER here - final Set uniqueMatcher = CollectionUtils.emptyIfNull(resolvedEids).stream() - .map(Eid::getMatcher) - .filter(StringUtils::isNotEmpty) - .collect(Collectors.toSet()); - - final ExtRequestPrebid extPrebid = ext != null ? ext.getPrebid() : null; - final ExtRequestPrebidData extPrebidData = extPrebid != null ? extPrebid.getData() : null; - final List eidPermissions = - extPrebidData != null ? extPrebidData.getEidPermissions() : null; - - final List modifiedEidPermissions = CollectionUtils.isEmpty(eidPermissions) - ? createEidPermissions(uniqueMatcher) - : modifyEidPermissions(eidPermissions, uniqueMatcher); - - final ExtRequestPrebid updatedExtPrebid = Optional.ofNullable(extPrebid) - .map(ExtRequestPrebid::toBuilder) - .orElseGet(ExtRequestPrebid::builder) - .data(updatePrebidData(extPrebidData, modifiedEidPermissions)) - .build(); - - final ExtRequest updatedExtRequest = ExtRequest.of(updatedExtPrebid); - if (ext != null) { - mapper.fillExtension(updatedExtRequest, ext.getProperties()); + private ExtRequest updateExtRequest(ExtRequest ext, List resolvedEids) { + if (CollectionUtils.isEmpty(resolvedEids)) { + return ext; + } + + final ExtRequestPrebid extPrebid = ext != null ? ext.getPrebid() : null; + final ExtRequestPrebidData extPrebidData = extPrebid != null ? extPrebid.getData() : null; + final List eidPermissions = extPrebidData != null + ? extPrebidData.getEidPermissions() + : null; + + final List modifiedEidPermissions = CollectionUtils + .isEmpty(eidPermissions) + ? createEidPermissions() + : modifyEidPermissions(eidPermissions); + + final ExtRequestPrebid updatedExtPrebid = Optional.ofNullable(extPrebid) + .map(ExtRequestPrebid::toBuilder) + .orElseGet(ExtRequestPrebid::builder) + .data(updatePrebidData(extPrebidData, modifiedEidPermissions)) + .build(); + + final ExtRequest updatedExtRequest = ExtRequest.of(updatedExtPrebid); + if (ext != null) { + mapper.fillExtension(updatedExtRequest, ext.getProperties()); + } + + return updatedExtRequest; } - return updatedExtRequest; - } - - private static User updateUser(User user, List resolvedEids) { - final List updatedEids = Optional.ofNullable(user) - .map(User::getEids) - .map(eids -> ListUtil.union(eids, resolvedEids)) - .orElse(resolvedEids); - - return Optional.ofNullable(user) - .map(User::toBuilder) - .orElseGet(User::builder) - .eids(updatedEids) - .build(); - } - - private List createEidPermissions(Set matchers) { - return matchers.stream() - .map(matcherInEid -> ExtRequestPrebidDataEidPermissions.builder() - .matcher(matcherInEid) - .inserter(INSERTER) - .bidders(targetBidders.stream().toList()) - .build()) - .toList(); - } - - private List modifyEidPermissions( - List eidPermissions, - Set matcher) { - final List modifiedEidPermissions = eidPermissions.stream() - .map(it -> updateEidPermission(it, matcher)) - .filter(Objects::nonNull) - .toList(); - final List defaultEidPermissions = createEidPermissions(matcher); - return ListUtils.union(modifiedEidPermissions, defaultEidPermissions); - } - - private ExtRequestPrebidData updatePrebidData(ExtRequestPrebidData extPrebidData, - List eidPermissions) { - - final List originalBidders = extPrebidData != null ? extPrebidData.getBidders() : null; - - return ExtRequestPrebidData.of(originalBidders, eidPermissions); - } - - private ExtRequestPrebidDataEidPermissions updateEidPermission(ExtRequestPrebidDataEidPermissions eidPermission, - Set matcher) { - if (!matcher.contains(eidPermission.getMatcher()) || !INSERTER.equals(eidPermission.getInserter())) { - return eidPermission; + private static User updateUser(User user, List resolvedEids) { + final List updatedEids = Optional.ofNullable(user) + .map(User::getEids) + .map(eids -> ListUtil.union(eids, resolvedEids)) + .orElse(resolvedEids); + + return Optional.ofNullable(user) + .map(User::toBuilder) + .orElseGet(User::builder) + .eids(updatedEids) + .build(); } - final List allowedBidders = ListUtils.emptyIfNull(eidPermission.getBidders()); - final List finalBidders = allowedBidders.stream() - .filter(targetBidders::contains) - .toList(); + private List createEidPermissions() { + return List.of(ExtRequestPrebidDataEidPermissions.builder() + .matcher(MATCHER) + .inserter(INSERTER) + .bidders(targetBidders.stream().toList()) + .build()); + } - if (CollectionUtils.isEmpty(allowedBidders) || allowedBidders.contains("*")) { - return eidPermission.toBuilder().bidders(targetBidders.stream().toList()).build(); + private List modifyEidPermissions( + List eidPermissions) { + final List modifiedEidPermissions = eidPermissions.stream() + .map(this::updateEidPermission) + .filter(Objects::nonNull) + .toList(); + final List defaultEidPermissions = createEidPermissions(); + return ListUtils.union(modifiedEidPermissions, defaultEidPermissions); } - if (CollectionUtils.isEmpty(finalBidders)) { - return null; + private ExtRequestPrebidData updatePrebidData(ExtRequestPrebidData extPrebidData, + List eidPermissions) { + + final List originalBidders = extPrebidData != null ? extPrebidData.getBidders() : null; + + return ExtRequestPrebidData.of(originalBidders, eidPermissions); } - return eidPermission.toBuilder().bidders(finalBidders).build(); - } + private ExtRequestPrebidDataEidPermissions updateEidPermission( + ExtRequestPrebidDataEidPermissions eidPermission) { + if (!MATCHER.equals(eidPermission.getMatcher()) || !INSERTER.equals(eidPermission.getInserter())) { + return eidPermission; + } + + final List allowedBidders = ListUtils.emptyIfNull(eidPermission.getBidders()); + final List finalBidders = allowedBidders.stream() + .filter(targetBidders::contains) + .toList(); + + if (CollectionUtils.isEmpty(allowedBidders) || allowedBidders.contains("*")) { + return eidPermission.toBuilder().bidders(targetBidders.stream().toList()).build(); + } - @Override - public String code() { - return CODE; - } + if (CollectionUtils.isEmpty(finalBidders)) { + return null; + } + + return eidPermission.toBuilder().bidders(finalBidders).build(); + } + + @Override + public String code() { + return CODE; + } } diff --git a/extra/modules/live-intent-omni-channel-identity/src/test/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/LiveIntentOmniChannelIdentityProcessedAuctionRequestHookTest.java b/extra/modules/live-intent-omni-channel-identity/src/test/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/LiveIntentOmniChannelIdentityProcessedAuctionRequestHookTest.java index 53abc06b323..e93a719c0e3 100644 --- a/extra/modules/live-intent-omni-channel-identity/src/test/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/LiveIntentOmniChannelIdentityProcessedAuctionRequestHookTest.java +++ b/extra/modules/live-intent-omni-channel-identity/src/test/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/LiveIntentOmniChannelIdentityProcessedAuctionRequestHookTest.java @@ -91,7 +91,7 @@ public void setUp() { defaultPermissions = ExtRequestPrebidDataEidPermissions.builder() .inserter("s2s.liveintent.com") - .matcher("itsLiveintent") + .matcher("liveintentStamp") .bidders(configuredBidders.stream().toList()) .build(); @@ -254,13 +254,12 @@ public void callShouldEnrichUserEidsWithRequestedEids() { final User givenUser = User.builder().eids(singletonList(givenEid)).build(); final BidRequest givenBidRequest = BidRequest.builder().id("request").user(givenUser).build(); - final Eid expectedEid = Eid.builder() + final Eid apiResponseEid = Eid.builder() .source("liveintent.com") .uids(singletonList(Uid.builder().id("id2").atype(3).build())) - .matcher("itsLiveintent") .build(); - final String responseBody = MAPPER.encodeToString(IdResResponse.of(List.of(expectedEid))); + final String responseBody = MAPPER.encodeToString(IdResResponse.of(List.of(apiResponseEid))); given(httpClient.post(any(), any(), any(), anyLong())) .willReturn(Future.succeededFuture(HttpClientResponse.of(200, null, responseBody))); @@ -283,9 +282,9 @@ public void callShouldEnrichUserEidsWithRequestedEids() { .extracting(AuctionRequestPayload::bidRequest) .extracting(BidRequest::getUser) .extracting(User::getEids) - .isEqualTo(List.of(givenEid, expectedEid.toBuilder() + .isEqualTo(List.of(givenEid, apiResponseEid.toBuilder() .inserter("s2s.liveintent.com") - .matcher("itsLiveintent") + .matcher("liveintentStamp") .build())); verify(httpClient).post( @@ -300,13 +299,12 @@ public void callShouldCreateUserAndUseRequestedEidsWhenUserIsAbsent() { // given final BidRequest givenBidRequest = BidRequest.builder().id("request").user(null).build(); - final Eid expectedEid = Eid.builder() + final Eid apiResponseEid = Eid.builder() .source("liveintent.com") .uids(singletonList(Uid.builder().id("id2").atype(3).build())) - .matcher("itsLiveintent") .build(); - final String responseBody = MAPPER.encodeToString(IdResResponse.of(List.of(expectedEid))); + final String responseBody = MAPPER.encodeToString(IdResResponse.of(List.of(apiResponseEid))); given(httpClient.post(any(), any(), any(), anyLong())) .willReturn(Future.succeededFuture(HttpClientResponse.of(200, null, responseBody))); @@ -329,9 +327,9 @@ public void callShouldCreateUserAndUseRequestedEidsWhenUserIsAbsent() { .extracting(AuctionRequestPayload::bidRequest) .extracting(BidRequest::getUser) .extracting(User::getEids) - .isEqualTo(List.of(expectedEid.toBuilder() + .isEqualTo(List.of(apiResponseEid.toBuilder() .inserter("s2s.liveintent.com") - .matcher("itsLiveintent") + .matcher("liveintentStamp") .build())); verify(httpClient).post( @@ -406,12 +404,12 @@ public void shouldRestrictExistingEidPermissionsByIntersectionAndKeepGlobalBidde .build(); final ExtRequestPrebidDataEidPermissions liBidder2 = ExtRequestPrebidDataEidPermissions.builder() - .matcher("itsLiveintent") + .matcher("liveintentStamp") .inserter("s2s.liveintent.com") .bidders(singletonList("bidder2")) .build(); final ExtRequestPrebidDataEidPermissions liBidder23 = ExtRequestPrebidDataEidPermissions.builder() - .matcher("itsLiveintent") + .matcher("liveintentStamp") .inserter("s2s.liveintent.com") .bidders(List.of("bidder2", "bidder3")) .build(); @@ -429,7 +427,7 @@ public void shouldRestrictExistingEidPermissionsByIntersectionAndKeepGlobalBidde List.of("bidderX"), ListUtil.union(List.of(otherBidder, liBidder2), List.of(defaultPermissions))); - final Eid expectedEid = Eid.builder().matcher("itsLiveintent").build(); + final Eid expectedEid = Eid.builder().source("liveintent.com").build(); final String responseBody = MAPPER.encodeToString(IdResResponse.of(List.of(expectedEid))); given(httpClient.post(any(), any(), any(), anyLong())) @@ -473,7 +471,7 @@ public void shouldRemovePermissionWhenIntersectionIsEmpty() { List.of("bidderGlobal"), List.of( ExtRequestPrebidDataEidPermissions.builder() - .matcher("itsLiveintent") + .matcher("liveintentStamp") .inserter("s2s.liveintent.com") .bidders(singletonList("not-allowed")) .build(), @@ -488,7 +486,7 @@ public void shouldRemovePermissionWhenIntersectionIsEmpty() { .ext(ExtRequest.of(ExtRequestPrebid.builder().data(givenData).build())) .build(); - final Eid expectedEid = Eid.builder().matcher("itsLiveintent").build(); + final Eid expectedEid = Eid.builder().source("liveintent.com").build(); final String responseBody = MAPPER.encodeToString(IdResResponse.of(List.of(expectedEid))); given(httpClient.post(any(), any(), any(), anyLong())) .willReturn(Future.succeededFuture(HttpClientResponse.of(200, null, responseBody))); From 1c2fba3c974e786199ceca8a89d8aff44bc1f07a Mon Sep 17 00:00:00 2001 From: Peixun Zhang Date: Tue, 28 Apr 2026 14:54:08 +0200 Subject: [PATCH 04/10] inden --- ...elIdentityProcessedAuctionRequestHook.java | 456 +++++++++--------- 1 file changed, 224 insertions(+), 232 deletions(-) diff --git a/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java b/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java index 0e552a0a3b7..9b5b87a2b39 100644 --- a/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java +++ b/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java @@ -52,268 +52,260 @@ public class LiveIntentOmniChannelIdentityProcessedAuctionRequestHook implements ProcessedAuctionRequestHook { - private static final ConditionalLogger conditionalLogger = new ConditionalLogger(LoggerFactory.getLogger( - LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.class)); - - private static final String CODE = "liveintent-omni-channel-identity-enrichment-hook"; - - private static final String INSERTER = "s2s.liveintent.com"; - - private static final String MATCHER = "liveintentStamp"; - - private final LiveIntentOmniChannelProperties config; - private final JacksonMapper mapper; - private final HttpClient httpClient; - private final UserFpdActivityMask userFpdActivityMask; - private final double logSamplingRate; - private final Set targetBidders; - - public LiveIntentOmniChannelIdentityProcessedAuctionRequestHook(LiveIntentOmniChannelProperties config, - UserFpdActivityMask userFpdActivityMask, - JacksonMapper mapper, - HttpClient httpClient, - double logSamplingRate) { - - this.config = Objects.requireNonNull(config); - HttpUtil.validateUrlSyntax(config.getIdentityResolutionEndpoint()); - this.mapper = Objects.requireNonNull(mapper); - this.httpClient = Objects.requireNonNull(httpClient); - this.logSamplingRate = logSamplingRate; - this.userFpdActivityMask = Objects.requireNonNull(userFpdActivityMask); - this.targetBidders = SetUtils.emptyIfNull(config.getTargetBidders()); + private static final ConditionalLogger conditionalLogger = new ConditionalLogger(LoggerFactory.getLogger( + LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.class)); + + private static final String CODE = "liveintent-omni-channel-identity-enrichment-hook"; + + private static final String INSERTER = "s2s.liveintent.com"; + + private static final String MATCHER = "liveintentStamp"; + + private final LiveIntentOmniChannelProperties config; + private final JacksonMapper mapper; + private final HttpClient httpClient; + private final UserFpdActivityMask userFpdActivityMask; + private final double logSamplingRate; + private final Set targetBidders; + + public LiveIntentOmniChannelIdentityProcessedAuctionRequestHook(LiveIntentOmniChannelProperties config, + UserFpdActivityMask userFpdActivityMask, + JacksonMapper mapper, + HttpClient httpClient, + double logSamplingRate) { + + this.config = Objects.requireNonNull(config); + HttpUtil.validateUrlSyntax(config.getIdentityResolutionEndpoint()); + this.mapper = Objects.requireNonNull(mapper); + this.httpClient = Objects.requireNonNull(httpClient); + this.logSamplingRate = logSamplingRate; + this.userFpdActivityMask = Objects.requireNonNull(userFpdActivityMask); + this.targetBidders = SetUtils.emptyIfNull(config.getTargetBidders()); + } + + @Override + public Future> call(AuctionRequestPayload auctionRequestPayload, + AuctionInvocationContext invocationContext) { + + return config.getTreatmentRate() > ThreadLocalRandom.current().nextFloat() + ? requestIdentities(auctionRequestPayload.bidRequest(), invocationContext.auctionContext()) + .>map(this::update) + .onFailure(throwable -> conditionalLogger.error( + "Failed enrichment: %s".formatted(throwable.getMessage()), logSamplingRate)) + : noAction(); + } + + private Future requestIdentities(BidRequest bidRequest, AuctionContext auctionContext) { + final BidRequest restrictedBidRequest = applyActivityRestrictions(bidRequest, auctionContext); + return httpClient.post( + config.getIdentityResolutionEndpoint(), + headers(), + mapper.encodeToString(restrictedBidRequest), + config.getRequestTimeoutMs()) + .map(this::processResponse); + } + + private BidRequest applyActivityRestrictions(BidRequest bidRequest, AuctionContext auctionContext) { + final ActivityInvocationPayload activityInvocationPayload = BidRequestActivityInvocationPayload.of( + ActivityInvocationPayloadImpl.of( + ComponentType.GENERAL_MODULE, + LiveIntentOmniChannelIdentityModule.CODE), + bidRequest); + final ActivityInfrastructure activityInfrastructure = auctionContext.getActivityInfrastructure(); + + final boolean disallowTransmitUfpd = !activityInfrastructure.isAllowed( + Activity.TRANSMIT_UFPD, activityInvocationPayload); + final boolean disallowTransmitEids = !activityInfrastructure.isAllowed( + Activity.TRANSMIT_EIDS, activityInvocationPayload); + final boolean disallowTransmitGeo = !activityInfrastructure.isAllowed( + Activity.TRANSMIT_GEO, activityInvocationPayload); + final boolean disallowTransmitTid = !activityInfrastructure.isAllowed( + Activity.TRANSMIT_TID, activityInvocationPayload); + + return maskUserPersonalInfo( + bidRequest, + disallowTransmitUfpd, + disallowTransmitEids, + disallowTransmitGeo, + disallowTransmitTid); + } + + private BidRequest maskUserPersonalInfo(BidRequest bidRequest, + boolean disallowTransmitUfpd, + boolean disallowTransmitEids, + boolean disallowTransmitGeo, + boolean disallowTransmitTid) { + + final User maskedUser = userFpdActivityMask.maskUser( + bidRequest.getUser(), disallowTransmitUfpd, disallowTransmitEids); + final Device maskedDevice = userFpdActivityMask.maskDevice( + bidRequest.getDevice(), disallowTransmitUfpd, disallowTransmitGeo); + + final Source maskedSource = maskSource(bidRequest.getSource(), disallowTransmitUfpd, disallowTransmitTid); + + return bidRequest.toBuilder() + .user(maskedUser) + .device(maskedDevice) + .source(maskedSource) + .build(); + } + + private Source maskSource(Source source, boolean mastUfpd, boolean maskTid) { + if (source == null || !(mastUfpd || maskTid)) { + return source; } - @Override - public Future> call(AuctionRequestPayload auctionRequestPayload, - AuctionInvocationContext invocationContext) { - - return config.getTreatmentRate() > ThreadLocalRandom.current().nextFloat() - ? requestIdentities(auctionRequestPayload.bidRequest(), - invocationContext.auctionContext()) - .>map(this::update) - .onFailure(throwable -> conditionalLogger.error( - "Failed enrichment: %s" - .formatted(throwable.getMessage()), - logSamplingRate)) - : noAction(); - } - - private Future requestIdentities(BidRequest bidRequest, AuctionContext auctionContext) { - final BidRequest restrictedBidRequest = applyActivityRestrictions(bidRequest, auctionContext); - return httpClient.post( - config.getIdentityResolutionEndpoint(), - headers(), - mapper.encodeToString(restrictedBidRequest), - config.getRequestTimeoutMs()) - .map(this::processResponse); - } - - private BidRequest applyActivityRestrictions(BidRequest bidRequest, AuctionContext auctionContext) { - final ActivityInvocationPayload activityInvocationPayload = BidRequestActivityInvocationPayload.of( - ActivityInvocationPayloadImpl.of( - ComponentType.GENERAL_MODULE, - LiveIntentOmniChannelIdentityModule.CODE), - bidRequest); - final ActivityInfrastructure activityInfrastructure = auctionContext.getActivityInfrastructure(); - - final boolean disallowTransmitUfpd = !activityInfrastructure.isAllowed( - Activity.TRANSMIT_UFPD, activityInvocationPayload); - final boolean disallowTransmitEids = !activityInfrastructure.isAllowed( - Activity.TRANSMIT_EIDS, activityInvocationPayload); - final boolean disallowTransmitGeo = !activityInfrastructure.isAllowed( - Activity.TRANSMIT_GEO, activityInvocationPayload); - final boolean disallowTransmitTid = !activityInfrastructure.isAllowed( - Activity.TRANSMIT_TID, activityInvocationPayload); - - return maskUserPersonalInfo( - bidRequest, - disallowTransmitUfpd, - disallowTransmitEids, - disallowTransmitGeo, - disallowTransmitTid); - } - - private BidRequest maskUserPersonalInfo(BidRequest bidRequest, - boolean disallowTransmitUfpd, - boolean disallowTransmitEids, - boolean disallowTransmitGeo, - boolean disallowTransmitTid) { - - final User maskedUser = userFpdActivityMask.maskUser( - bidRequest.getUser(), disallowTransmitUfpd, disallowTransmitEids); - final Device maskedDevice = userFpdActivityMask.maskDevice( - bidRequest.getDevice(), disallowTransmitUfpd, disallowTransmitGeo); - - final Source maskedSource = maskSource(bidRequest.getSource(), disallowTransmitUfpd, - disallowTransmitTid); - - return bidRequest.toBuilder() - .user(maskedUser) - .device(maskedDevice) - .source(maskedSource) - .build(); - } - - private Source maskSource(Source source, boolean mastUfpd, boolean maskTid) { - if (source == null || !(mastUfpd || maskTid)) { - return source; - } - - return source.toBuilder().tid(null).build(); - } - - private MultiMap headers() { - return MultiMap.caseInsensitiveMultiMap() - .add(HttpUtil.AUTHORIZATION_HEADER, "Bearer " + config.getAuthToken()); - } - - private IdResResponse processResponse(HttpClientResponse response) { - final IdResResponse res = mapper.decodeValue(response.getBody(), IdResResponse.class); - final List eids = res.getEids(); - - if (CollectionUtils.isEmpty(eids)) { - return res; - } - - final List modifiedEids = eids.stream() - .map(eid -> eid.toBuilder().inserter(INSERTER).matcher(MATCHER).build()) - .toList(); - - return IdResResponse.of(modifiedEids); - } - - private static Future> noAction() { - return Future.succeededFuture(InvocationResultImpl.builder() - .status(InvocationStatus.success) - .action(InvocationAction.no_action) - .build()); - } + return source.toBuilder().tid(null).build(); + } - private InvocationResultImpl update(IdResResponse resolutionResult) { - return InvocationResultImpl.builder() - .status(InvocationStatus.success) - .action(InvocationAction.update) - .payloadUpdate(payload -> updatedPayload(payload, resolutionResult.getEids())) - .analyticsTags(TagsImpl.of(List.of( - ActivityImpl.of( - "liveintent-enriched", "success", - List.of( - ResultImpl.of( - "", - mapper.mapper().createObjectNode() - .put("treatmentRate", - config.getTreatmentRate()), - null)))))) - .build(); - } + private MultiMap headers() { + return MultiMap.caseInsensitiveMultiMap() + .add(HttpUtil.AUTHORIZATION_HEADER, "Bearer " + config.getAuthToken()); + } - private AuctionRequestPayload updatedPayload(AuctionRequestPayload requestPayload, List resolvedEids) { - return CollectionUtils.isNotEmpty(resolvedEids) - ? AuctionRequestPayloadImpl - .of(updateBidRequest(requestPayload.bidRequest(), resolvedEids)) - : requestPayload; - } + private IdResResponse processResponse(HttpClientResponse response) { + final IdResResponse res = mapper.decodeValue(response.getBody(), IdResResponse.class); + final List eids = res.getEids(); - private BidRequest updateBidRequest(BidRequest bidRequest, List resolvedEids) { - return bidRequest.toBuilder() - .ext(updateExtRequest(bidRequest.getExt(), resolvedEids)) - .user(updateUser(bidRequest.getUser(), resolvedEids)) - .build(); + if (CollectionUtils.isEmpty(eids)) { + return res; } - private ExtRequest updateExtRequest(ExtRequest ext, List resolvedEids) { + final List modifiedEids = eids.stream() + .map(eid -> eid.toBuilder().inserter(INSERTER).matcher(MATCHER).build()) + .toList(); + + return IdResResponse.of(modifiedEids); + } + + private static Future> noAction() { + return Future.succeededFuture(InvocationResultImpl.builder() + .status(InvocationStatus.success) + .action(InvocationAction.no_action) + .build()); + } + + private InvocationResultImpl update(IdResResponse resolutionResult) { + return InvocationResultImpl.builder() + .status(InvocationStatus.success) + .action(InvocationAction.update) + .payloadUpdate(payload -> updatedPayload(payload, resolutionResult.getEids())) + .analyticsTags(TagsImpl.of(List.of( + ActivityImpl.of( + "liveintent-enriched", "success", + List.of( + ResultImpl.of( + "", + mapper.mapper().createObjectNode() + .put("treatmentRate", config.getTreatmentRate()), + null)))))) + .build(); + } + + private AuctionRequestPayload updatedPayload(AuctionRequestPayload requestPayload, List resolvedEids) { + return CollectionUtils.isNotEmpty(resolvedEids) + ? AuctionRequestPayloadImpl.of(updateBidRequest(requestPayload.bidRequest(), resolvedEids)) + : requestPayload; + } + + private BidRequest updateBidRequest(BidRequest bidRequest, List resolvedEids) { + return bidRequest.toBuilder() + .ext(updateExtRequest(bidRequest.getExt(), resolvedEids)) + .user(updateUser(bidRequest.getUser(), resolvedEids)) + .build(); + } + + private ExtRequest updateExtRequest(ExtRequest ext, List resolvedEids) { if (CollectionUtils.isEmpty(resolvedEids)) { return ext; } - final ExtRequestPrebid extPrebid = ext != null ? ext.getPrebid() : null; - final ExtRequestPrebidData extPrebidData = extPrebid != null ? extPrebid.getData() : null; - final List eidPermissions = extPrebidData != null - ? extPrebidData.getEidPermissions() - : null; - - final List modifiedEidPermissions = CollectionUtils - .isEmpty(eidPermissions) - ? createEidPermissions() - : modifyEidPermissions(eidPermissions); - - final ExtRequestPrebid updatedExtPrebid = Optional.ofNullable(extPrebid) - .map(ExtRequestPrebid::toBuilder) - .orElseGet(ExtRequestPrebid::builder) - .data(updatePrebidData(extPrebidData, modifiedEidPermissions)) - .build(); - - final ExtRequest updatedExtRequest = ExtRequest.of(updatedExtPrebid); - if (ext != null) { - mapper.fillExtension(updatedExtRequest, ext.getProperties()); - } - - return updatedExtRequest; + final ExtRequestPrebid extPrebid = ext != null ? ext.getPrebid() : null; + final ExtRequestPrebidData extPrebidData = extPrebid != null ? extPrebid.getData() : null; + final List eidPermissions = + extPrebidData != null ? extPrebidData.getEidPermissions() : null; + + final List modifiedEidPermissions = CollectionUtils + .isEmpty(eidPermissions) + ? createEidPermissions() + : modifyEidPermissions(eidPermissions); + + final ExtRequestPrebid updatedExtPrebid = Optional.ofNullable(extPrebid) + .map(ExtRequestPrebid::toBuilder) + .orElseGet(ExtRequestPrebid::builder) + .data(updatePrebidData(extPrebidData, modifiedEidPermissions)) + .build(); + + final ExtRequest updatedExtRequest = ExtRequest.of(updatedExtPrebid); + if (ext != null) { + mapper.fillExtension(updatedExtRequest, ext.getProperties()); } - private static User updateUser(User user, List resolvedEids) { - final List updatedEids = Optional.ofNullable(user) - .map(User::getEids) - .map(eids -> ListUtil.union(eids, resolvedEids)) - .orElse(resolvedEids); - - return Optional.ofNullable(user) - .map(User::toBuilder) - .orElseGet(User::builder) - .eids(updatedEids) - .build(); - } + return updatedExtRequest; + } + + private static User updateUser(User user, List resolvedEids) { + final List updatedEids = Optional.ofNullable(user) + .map(User::getEids) + .map(eids -> ListUtil.union(eids, resolvedEids)) + .orElse(resolvedEids); + + return Optional.ofNullable(user) + .map(User::toBuilder) + .orElseGet(User::builder) + .eids(updatedEids) + .build(); + } - private List createEidPermissions() { - return List.of(ExtRequestPrebidDataEidPermissions.builder() + private List createEidPermissions() { + return List.of(ExtRequestPrebidDataEidPermissions.builder() .matcher(MATCHER) .inserter(INSERTER) .bidders(targetBidders.stream().toList()) .build()); - } + } - private List modifyEidPermissions( - List eidPermissions) { - final List modifiedEidPermissions = eidPermissions.stream() + private List modifyEidPermissions( + List eidPermissions) { + final List modifiedEidPermissions = eidPermissions.stream() .map(this::updateEidPermission) .filter(Objects::nonNull) .toList(); - final List defaultEidPermissions = createEidPermissions(); - return ListUtils.union(modifiedEidPermissions, defaultEidPermissions); - } + final List defaultEidPermissions = createEidPermissions(); + return ListUtils.union(modifiedEidPermissions, defaultEidPermissions); + } - private ExtRequestPrebidData updatePrebidData(ExtRequestPrebidData extPrebidData, - List eidPermissions) { + private ExtRequestPrebidData updatePrebidData(ExtRequestPrebidData extPrebidData, + List eidPermissions) { - final List originalBidders = extPrebidData != null ? extPrebidData.getBidders() : null; + final List originalBidders = extPrebidData != null ? extPrebidData.getBidders() : null; - return ExtRequestPrebidData.of(originalBidders, eidPermissions); - } + return ExtRequestPrebidData.of(originalBidders, eidPermissions); + } - private ExtRequestPrebidDataEidPermissions updateEidPermission( - ExtRequestPrebidDataEidPermissions eidPermission) { - if (!MATCHER.equals(eidPermission.getMatcher()) || !INSERTER.equals(eidPermission.getInserter())) { + private ExtRequestPrebidDataEidPermissions updateEidPermission(ExtRequestPrebidDataEidPermissions eidPermission) { + if (!MATCHER.equals(eidPermission.getMatcher()) || !INSERTER.equals(eidPermission.getInserter())) { return eidPermission; - } - - final List allowedBidders = ListUtils.emptyIfNull(eidPermission.getBidders()); - final List finalBidders = allowedBidders.stream() - .filter(targetBidders::contains) - .toList(); - - if (CollectionUtils.isEmpty(allowedBidders) || allowedBidders.contains("*")) { - return eidPermission.toBuilder().bidders(targetBidders.stream().toList()).build(); - } + } - if (CollectionUtils.isEmpty(finalBidders)) { - return null; - } + final List allowedBidders = ListUtils.emptyIfNull(eidPermission.getBidders()); + final List finalBidders = allowedBidders.stream() + .filter(targetBidders::contains) + .toList(); - return eidPermission.toBuilder().bidders(finalBidders).build(); + if (CollectionUtils.isEmpty(allowedBidders) || allowedBidders.contains("*")) { + return eidPermission.toBuilder().bidders(targetBidders.stream().toList()).build(); } - @Override - public String code() { - return CODE; + if (CollectionUtils.isEmpty(finalBidders)) { + return null; } + + return eidPermission.toBuilder().bidders(finalBidders).build(); + } + + @Override + public String code() { + return CODE; + } } From 96b8f2a279fbc5879f8255529a034960b6932926 Mon Sep 17 00:00:00 2001 From: Peixun Zhang Date: Mon, 4 May 2026 12:04:17 +0200 Subject: [PATCH 05/10] use exist stamp from ulysses --- ...veIntentOmniChannelIdentityProcessedAuctionRequestHook.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java b/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java index 9b5b87a2b39..607768d5f0a 100644 --- a/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java +++ b/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java @@ -59,7 +59,8 @@ public class LiveIntentOmniChannelIdentityProcessedAuctionRequestHook implements private static final String INSERTER = "s2s.liveintent.com"; - private static final String MATCHER = "liveintentStamp"; + // from ulysses + private static final String MATCHER = "liveintent.com"; private final LiveIntentOmniChannelProperties config; private final JacksonMapper mapper; From 2f68568e98252d7f374bb2ab00352a0678af279c Mon Sep 17 00:00:00 2001 From: Peixun Zhang Date: Mon, 4 May 2026 16:27:02 +0200 Subject: [PATCH 06/10] only use to check --- ...IntentOmniChannelIdentityProcessedAuctionRequestHook.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java b/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java index 607768d5f0a..22e8f45155a 100644 --- a/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java +++ b/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java @@ -59,7 +59,7 @@ public class LiveIntentOmniChannelIdentityProcessedAuctionRequestHook implements private static final String INSERTER = "s2s.liveintent.com"; - // from ulysses + // the IdResResponse is already stamped by Ulysses with "liveintent.com" as matcher private static final String MATCHER = "liveintent.com"; private final LiveIntentOmniChannelProperties config; @@ -173,7 +173,7 @@ private IdResResponse processResponse(HttpClientResponse response) { } final List modifiedEids = eids.stream() - .map(eid -> eid.toBuilder().inserter(INSERTER).matcher(MATCHER).build()) + .map(eid -> eid.toBuilder().inserter(INSERTER).build()) .toList(); return IdResResponse.of(modifiedEids); @@ -260,7 +260,6 @@ private static User updateUser(User user, List resolvedEids) { private List createEidPermissions() { return List.of(ExtRequestPrebidDataEidPermissions.builder() - .matcher(MATCHER) .inserter(INSERTER) .bidders(targetBidders.stream().toList()) .build()); From cb2700953a736d4255df086aa21b81bd34f26b53 Mon Sep 17 00:00:00 2001 From: Peixun Zhang Date: Mon, 4 May 2026 16:39:58 +0200 Subject: [PATCH 07/10] fix tests and set default --- ...niChannelIdentityProcessedAuctionRequestHook.java | 1 + ...annelIdentityProcessedAuctionRequestHookTest.java | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java b/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java index 22e8f45155a..6887429ef75 100644 --- a/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java +++ b/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java @@ -260,6 +260,7 @@ private static User updateUser(User user, List resolvedEids) { private List createEidPermissions() { return List.of(ExtRequestPrebidDataEidPermissions.builder() + .matcher(MATCHER) .inserter(INSERTER) .bidders(targetBidders.stream().toList()) .build()); diff --git a/extra/modules/live-intent-omni-channel-identity/src/test/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/LiveIntentOmniChannelIdentityProcessedAuctionRequestHookTest.java b/extra/modules/live-intent-omni-channel-identity/src/test/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/LiveIntentOmniChannelIdentityProcessedAuctionRequestHookTest.java index e93a719c0e3..ecbeb85c551 100644 --- a/extra/modules/live-intent-omni-channel-identity/src/test/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/LiveIntentOmniChannelIdentityProcessedAuctionRequestHookTest.java +++ b/extra/modules/live-intent-omni-channel-identity/src/test/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/LiveIntentOmniChannelIdentityProcessedAuctionRequestHookTest.java @@ -91,7 +91,7 @@ public void setUp() { defaultPermissions = ExtRequestPrebidDataEidPermissions.builder() .inserter("s2s.liveintent.com") - .matcher("liveintentStamp") + .matcher("liveintent.com") .bidders(configuredBidders.stream().toList()) .build(); @@ -284,7 +284,7 @@ public void callShouldEnrichUserEidsWithRequestedEids() { .extracting(User::getEids) .isEqualTo(List.of(givenEid, apiResponseEid.toBuilder() .inserter("s2s.liveintent.com") - .matcher("liveintentStamp") + .matcher("liveintent.com") .build())); verify(httpClient).post( @@ -329,7 +329,7 @@ public void callShouldCreateUserAndUseRequestedEidsWhenUserIsAbsent() { .extracting(User::getEids) .isEqualTo(List.of(apiResponseEid.toBuilder() .inserter("s2s.liveintent.com") - .matcher("liveintentStamp") + .matcher("liveintent.com") .build())); verify(httpClient).post( @@ -404,12 +404,12 @@ public void shouldRestrictExistingEidPermissionsByIntersectionAndKeepGlobalBidde .build(); final ExtRequestPrebidDataEidPermissions liBidder2 = ExtRequestPrebidDataEidPermissions.builder() - .matcher("liveintentStamp") + .matcher("liveintent.com") .inserter("s2s.liveintent.com") .bidders(singletonList("bidder2")) .build(); final ExtRequestPrebidDataEidPermissions liBidder23 = ExtRequestPrebidDataEidPermissions.builder() - .matcher("liveintentStamp") + .matcher("liveintent.com") .inserter("s2s.liveintent.com") .bidders(List.of("bidder2", "bidder3")) .build(); @@ -471,7 +471,7 @@ public void shouldRemovePermissionWhenIntersectionIsEmpty() { List.of("bidderGlobal"), List.of( ExtRequestPrebidDataEidPermissions.builder() - .matcher("liveintentStamp") + .matcher("liveintent.com") .inserter("s2s.liveintent.com") .bidders(singletonList("not-allowed")) .build(), From c105fbfc8b2547a009aa7a4dcc8bd9a608bfaf75 Mon Sep 17 00:00:00 2001 From: Peixun Zhang Date: Mon, 4 May 2026 16:58:33 +0200 Subject: [PATCH 08/10] adjust comment --- ...iveIntentOmniChannelIdentityProcessedAuctionRequestHook.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java b/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java index 6887429ef75..8066b857028 100644 --- a/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java +++ b/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java @@ -59,7 +59,7 @@ public class LiveIntentOmniChannelIdentityProcessedAuctionRequestHook implements private static final String INSERTER = "s2s.liveintent.com"; - // the IdResResponse is already stamped by Ulysses with "liveintent.com" as matcher + // IdResResponse is already stamped by Ulysses, in the EID's matcher field, it has "liveintent.com" private static final String MATCHER = "liveintent.com"; private final LiveIntentOmniChannelProperties config; From 504884e75fe3b3b881acea24ad38550f91670f15 Mon Sep 17 00:00:00 2001 From: Peixun Zhang Date: Wed, 6 May 2026 15:53:31 +0200 Subject: [PATCH 09/10] test --- ...elIdentityProcessedAuctionRequestHookTest.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/extra/modules/live-intent-omni-channel-identity/src/test/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/LiveIntentOmniChannelIdentityProcessedAuctionRequestHookTest.java b/extra/modules/live-intent-omni-channel-identity/src/test/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/LiveIntentOmniChannelIdentityProcessedAuctionRequestHookTest.java index ecbeb85c551..a9e266954b8 100644 --- a/extra/modules/live-intent-omni-channel-identity/src/test/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/LiveIntentOmniChannelIdentityProcessedAuctionRequestHookTest.java +++ b/extra/modules/live-intent-omni-channel-identity/src/test/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/LiveIntentOmniChannelIdentityProcessedAuctionRequestHookTest.java @@ -256,6 +256,7 @@ public void callShouldEnrichUserEidsWithRequestedEids() { final Eid apiResponseEid = Eid.builder() .source("liveintent.com") + .matcher("liveintent.com") .uids(singletonList(Uid.builder().id("id2").atype(3).build())) .build(); @@ -278,15 +279,25 @@ public void callShouldEnrichUserEidsWithRequestedEids() { // then assertThat(result.status()).isEqualTo(InvocationStatus.success); assertThat(result.action()).isEqualTo(InvocationAction.update); - assertThat(result.payloadUpdate().apply(AuctionRequestPayloadImpl.of(givenBidRequest))) + + final AuctionRequestPayload updatedPayload = + result.payloadUpdate().apply(AuctionRequestPayloadImpl.of(givenBidRequest)); + + assertThat(updatedPayload) .extracting(AuctionRequestPayload::bidRequest) .extracting(BidRequest::getUser) .extracting(User::getEids) .isEqualTo(List.of(givenEid, apiResponseEid.toBuilder() .inserter("s2s.liveintent.com") - .matcher("liveintent.com") .build())); + assertThat(updatedPayload) + .extracting(AuctionRequestPayload::bidRequest) + .extracting(BidRequest::getExt) + .extracting(ExtRequest::getPrebid) + .extracting(ExtRequestPrebid::getData) + .isEqualTo(ExtRequestPrebidData.of(null, List.of(defaultPermissions))); + verify(httpClient).post( eq("https://test.com/idres"), argThat(headers -> headers.contains("Authorization", "Bearer auth_token", true)), From 17f1ae33136b00651edb842e1f6ed12b0ae5b943 Mon Sep 17 00:00:00 2001 From: Peixun Zhang Date: Fri, 8 May 2026 14:58:36 +0200 Subject: [PATCH 10/10] lint --- ...entOmniChannelIdentityProcessedAuctionRequestHook.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java b/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java index 8066b857028..c417a0e5283 100644 --- a/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java +++ b/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java @@ -217,9 +217,9 @@ private BidRequest updateBidRequest(BidRequest bidRequest, List resolvedEid } private ExtRequest updateExtRequest(ExtRequest ext, List resolvedEids) { - if (CollectionUtils.isEmpty(resolvedEids)) { - return ext; - } + if (CollectionUtils.isEmpty(resolvedEids)) { + return ext; + } final ExtRequestPrebid extPrebid = ext != null ? ext.getPrebid() : null; final ExtRequestPrebidData extPrebidData = extPrebid != null ? extPrebid.getData() : null; @@ -286,7 +286,7 @@ private ExtRequestPrebidData updatePrebidData(ExtRequestPrebidData extPrebidData private ExtRequestPrebidDataEidPermissions updateEidPermission(ExtRequestPrebidDataEidPermissions eidPermission) { if (!MATCHER.equals(eidPermission.getMatcher()) || !INSERTER.equals(eidPermission.getInserter())) { - return eidPermission; + return eidPermission; } final List allowedBidders = ListUtils.emptyIfNull(eidPermission.getBidders());