Skip to content

Commit 0dc4424

Browse files
authored
LiveIntent module: Restrict LI enrichment based on allowed activity (#4185)
1 parent eb5d5ca commit 0dc4424

File tree

3 files changed

+256
-20
lines changed

3 files changed

+256
-20
lines changed

extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/config/LiveIntentOmniChannelIdentityConfiguration.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.prebid.server.hooks.modules.liveintent.omni.channel.identity.config;
22

3+
import org.prebid.server.auction.privacy.enforcement.mask.UserFpdActivityMask;
34
import org.prebid.server.hooks.modules.liveintent.omni.channel.identity.model.config.LiveIntentOmniChannelProperties;
45
import org.prebid.server.hooks.modules.liveintent.omni.channel.identity.v1.LiveIntentOmniChannelIdentityModule;
56
import org.prebid.server.hooks.modules.liveintent.omni.channel.identity.v1.hooks.LiveIntentOmniChannelIdentityProcessedAuctionRequestHook;
@@ -30,12 +31,13 @@ LiveIntentOmniChannelProperties properties() {
3031
@Bean
3132
Module liveIntentOmniChannelIdentityModule(LiveIntentOmniChannelProperties properties,
3233
JacksonMapper mapper,
34+
UserFpdActivityMask userFpdActivityMask,
3335
HttpClient httpClient,
3436
@Value("${logging.sampling-rate:0.01}") double logSamplingRate) {
3537

3638
final LiveIntentOmniChannelIdentityProcessedAuctionRequestHook hook =
3739
new LiveIntentOmniChannelIdentityProcessedAuctionRequestHook(
38-
properties, mapper, httpClient, logSamplingRate);
40+
properties, userFpdActivityMask, mapper, httpClient, logSamplingRate);
3941

4042
return new LiveIntentOmniChannelIdentityModule(Collections.singleton(hook));
4143
}

extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java

Lines changed: 71 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,26 @@
11
package org.prebid.server.hooks.modules.liveintent.omni.channel.identity.v1.hooks;
22

33
import com.iab.openrtb.request.BidRequest;
4+
import com.iab.openrtb.request.Device;
45
import com.iab.openrtb.request.Eid;
6+
import com.iab.openrtb.request.Source;
57
import com.iab.openrtb.request.User;
68
import io.vertx.core.Future;
79
import io.vertx.core.MultiMap;
810
import org.apache.commons.collections4.ListUtils;
11+
import org.prebid.server.activity.Activity;
12+
import org.prebid.server.activity.ComponentType;
13+
import org.prebid.server.activity.infrastructure.ActivityInfrastructure;
14+
import org.prebid.server.activity.infrastructure.payload.ActivityInvocationPayload;
15+
import org.prebid.server.activity.infrastructure.payload.impl.ActivityInvocationPayloadImpl;
16+
import org.prebid.server.activity.infrastructure.payload.impl.BidRequestActivityInvocationPayload;
17+
import org.prebid.server.auction.model.AuctionContext;
18+
import org.prebid.server.auction.privacy.enforcement.mask.UserFpdActivityMask;
919
import org.prebid.server.hooks.execution.v1.InvocationResultImpl;
1020
import org.prebid.server.hooks.execution.v1.auction.AuctionRequestPayloadImpl;
1121
import org.prebid.server.hooks.modules.liveintent.omni.channel.identity.model.IdResResponse;
1222
import org.prebid.server.hooks.modules.liveintent.omni.channel.identity.model.config.LiveIntentOmniChannelProperties;
23+
import org.prebid.server.hooks.modules.liveintent.omni.channel.identity.v1.LiveIntentOmniChannelIdentityModule;
1324
import org.prebid.server.hooks.v1.InvocationAction;
1425
import org.prebid.server.hooks.v1.InvocationResult;
1526
import org.prebid.server.hooks.v1.InvocationStatus;
@@ -39,9 +50,11 @@ public class LiveIntentOmniChannelIdentityProcessedAuctionRequestHook implements
3950
private final LiveIntentOmniChannelProperties config;
4051
private final JacksonMapper mapper;
4152
private final HttpClient httpClient;
53+
private final UserFpdActivityMask userFpdActivityMask;
4254
private final double logSamplingRate;
4355

4456
public LiveIntentOmniChannelIdentityProcessedAuctionRequestHook(LiveIntentOmniChannelProperties config,
57+
UserFpdActivityMask userFpdActivityMask,
4558
JacksonMapper mapper,
4659
HttpClient httpClient,
4760
double logSamplingRate) {
@@ -51,29 +64,84 @@ public LiveIntentOmniChannelIdentityProcessedAuctionRequestHook(LiveIntentOmniCh
5164
this.mapper = Objects.requireNonNull(mapper);
5265
this.httpClient = Objects.requireNonNull(httpClient);
5366
this.logSamplingRate = logSamplingRate;
67+
this.userFpdActivityMask = Objects.requireNonNull(userFpdActivityMask);
5468
}
5569

5670
@Override
5771
public Future<InvocationResult<AuctionRequestPayload>> call(AuctionRequestPayload auctionRequestPayload,
5872
AuctionInvocationContext invocationContext) {
5973

6074
return config.getTreatmentRate() > ThreadLocalRandom.current().nextFloat()
61-
? requestIdentities(auctionRequestPayload.bidRequest())
75+
? requestIdentities(auctionRequestPayload.bidRequest(), invocationContext.auctionContext())
6276
.<InvocationResult<AuctionRequestPayload>>map(this::update)
6377
.onFailure(throwable -> conditionalLogger.error(
6478
"Failed enrichment: %s".formatted(throwable.getMessage()), logSamplingRate))
6579
: noAction();
6680
}
6781

68-
private Future<IdResResponse> requestIdentities(BidRequest bidRequest) {
82+
private Future<IdResResponse> requestIdentities(BidRequest bidRequest, AuctionContext auctionContext) {
83+
final BidRequest restrictedBidRequest = applyActivityRestrictions(bidRequest, auctionContext);
6984
return httpClient.post(
7085
config.getIdentityResolutionEndpoint(),
7186
headers(),
72-
mapper.encodeToString(bidRequest),
87+
mapper.encodeToString(restrictedBidRequest),
7388
config.getRequestTimeoutMs())
7489
.map(this::processResponse);
7590
}
7691

92+
private BidRequest applyActivityRestrictions(BidRequest bidRequest, AuctionContext auctionContext) {
93+
final ActivityInvocationPayload activityInvocationPayload = BidRequestActivityInvocationPayload.of(
94+
ActivityInvocationPayloadImpl.of(
95+
ComponentType.GENERAL_MODULE,
96+
LiveIntentOmniChannelIdentityModule.CODE),
97+
bidRequest);
98+
final ActivityInfrastructure activityInfrastructure = auctionContext.getActivityInfrastructure();
99+
100+
final boolean disallowTransmitUfpd = !activityInfrastructure.isAllowed(
101+
Activity.TRANSMIT_UFPD, activityInvocationPayload);
102+
final boolean disallowTransmitEids = !activityInfrastructure.isAllowed(
103+
Activity.TRANSMIT_EIDS, activityInvocationPayload);
104+
final boolean disallowTransmitGeo = !activityInfrastructure.isAllowed(
105+
Activity.TRANSMIT_GEO, activityInvocationPayload);
106+
final boolean disallowTransmitTid = !activityInfrastructure.isAllowed(
107+
Activity.TRANSMIT_TID, activityInvocationPayload);
108+
109+
return maskUserPersonalInfo(
110+
bidRequest,
111+
disallowTransmitUfpd,
112+
disallowTransmitEids,
113+
disallowTransmitGeo,
114+
disallowTransmitTid);
115+
}
116+
117+
private BidRequest maskUserPersonalInfo(BidRequest bidRequest,
118+
boolean disallowTransmitUfpd,
119+
boolean disallowTransmitEids,
120+
boolean disallowTransmitGeo,
121+
boolean disallowTransmitTid) {
122+
123+
final User maskedUser = userFpdActivityMask.maskUser(
124+
bidRequest.getUser(), disallowTransmitUfpd, disallowTransmitEids);
125+
final Device maskedDevice = userFpdActivityMask.maskDevice(
126+
bidRequest.getDevice(), disallowTransmitUfpd, disallowTransmitGeo);
127+
128+
final Source maskedSource = maskSource(bidRequest.getSource(), disallowTransmitUfpd, disallowTransmitTid);
129+
130+
return bidRequest.toBuilder()
131+
.user(maskedUser)
132+
.device(maskedDevice)
133+
.source(maskedSource)
134+
.build();
135+
}
136+
137+
private Source maskSource(Source source, boolean mastUfpd, boolean maskTid) {
138+
if (source == null || !(mastUfpd || maskTid)) {
139+
return source;
140+
}
141+
142+
return source.toBuilder().tid(null).build();
143+
}
144+
77145
private MultiMap headers() {
78146
return MultiMap.caseInsensitiveMultiMap()
79147
.add(HttpUtil.AUTHORIZATION_HEADER, "Bearer " + config.getAuthToken());

0 commit comments

Comments
 (0)