Skip to content

Commit 3006623

Browse files
author
ilya
committed
DATA-36551: Restrict LI enrichment based on allowed activity
1 parent fa13078 commit 3006623

3 files changed

Lines changed: 72 additions & 6 deletions

File tree

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: 63 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,76 @@ 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(ComponentType.GENERAL_MODULE, LiveIntentOmniChannelIdentityModule.CODE),
95+
bidRequest);
96+
final ActivityInfrastructure activityInfrastructure = auctionContext.getActivityInfrastructure();
97+
98+
final boolean disallowTransmitUfpd = !activityInfrastructure.isAllowed(
99+
Activity.TRANSMIT_UFPD, activityInvocationPayload);
100+
final boolean disallowTransmitEids = !activityInfrastructure.isAllowed(
101+
Activity.TRANSMIT_EIDS, activityInvocationPayload);
102+
final boolean disallowTransmitGeo = !activityInfrastructure.isAllowed(
103+
Activity.TRANSMIT_GEO, activityInvocationPayload);
104+
final boolean disallowTransmitTid = !activityInfrastructure.isAllowed(
105+
Activity.TRANSMIT_TID, activityInvocationPayload);
106+
107+
return maskUserPersonalInfo(
108+
bidRequest,
109+
disallowTransmitUfpd,
110+
disallowTransmitEids,
111+
disallowTransmitGeo,
112+
disallowTransmitTid);
113+
}
114+
115+
private BidRequest maskUserPersonalInfo(BidRequest bidRequest,
116+
boolean disallowTransmitUfpd,
117+
boolean disallowTransmitEids,
118+
boolean disallowTransmitGeo,
119+
boolean disallowTransmitTid) {
120+
121+
final User maskedUser = userFpdActivityMask.maskUser(
122+
bidRequest.getUser(), disallowTransmitUfpd, disallowTransmitEids);
123+
final Device maskedDevice = userFpdActivityMask.maskDevice(
124+
bidRequest.getDevice(), disallowTransmitUfpd, disallowTransmitGeo);
125+
126+
final Source maskedSource = disallowTransmitTid
127+
? bidRequest.getSource().toBuilder().tid(null).build()
128+
: bidRequest.getSource();
129+
130+
return bidRequest.toBuilder()
131+
.user(maskedUser)
132+
.device(maskedDevice)
133+
.source(maskedSource)
134+
.build();
135+
}
136+
77137
private MultiMap headers() {
78138
return MultiMap.caseInsensitiveMultiMap()
79139
.add(HttpUtil.AUTHORIZATION_HEADER, "Bearer " + config.getAuthToken());

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.junit.jupiter.api.extension.ExtendWith;
1111
import org.mockito.Mock;
1212
import org.mockito.junit.jupiter.MockitoExtension;
13+
import org.prebid.server.auction.privacy.enforcement.mask.UserFpdActivityMask;
1314
import org.prebid.server.hooks.execution.v1.auction.AuctionInvocationContextImpl;
1415
import org.prebid.server.hooks.execution.v1.auction.AuctionRequestPayloadImpl;
1516
import org.prebid.server.hooks.modules.liveintent.omni.channel.identity.model.IdResResponse;
@@ -44,6 +45,9 @@ public class LiveIntentOmniChannelIdentityProcessedAuctionRequestHookTest {
4445

4546
private static final JacksonMapper MAPPER = new JacksonMapper(ObjectMapperProvider.mapper());
4647

48+
@Mock
49+
private UserFpdActivityMask userFpdActivityMask;
50+
4751
@Mock
4852
private HttpClient httpClient;
4953

@@ -60,15 +64,15 @@ public void setUp() {
6064
given(properties.getTreatmentRate()).willReturn(1.0f);
6165

6266
target = new LiveIntentOmniChannelIdentityProcessedAuctionRequestHook(
63-
properties, MAPPER, httpClient, 0.01d);
67+
properties, userFpdActivityMask, MAPPER, httpClient, 0.01d);
6468
}
6569

6670
@Test
6771
public void creationShouldFailOnInvalidIdentityUrl() {
6872
given(properties.getIdentityResolutionEndpoint()).willReturn("invalid_url");
6973
assertThatIllegalArgumentException().isThrownBy(() ->
7074
new LiveIntentOmniChannelIdentityProcessedAuctionRequestHook(
71-
properties, MAPPER, httpClient, 0.01d));
75+
properties, userFpdActivityMask, MAPPER, httpClient, 0.01d));
7276
}
7377

7478
@Test

0 commit comments

Comments
 (0)