11package org .prebid .server .hooks .modules .liveintent .omni .channel .identity .v1 .hooks ;
22
33import com .iab .openrtb .request .BidRequest ;
4+ import com .iab .openrtb .request .Device ;
45import com .iab .openrtb .request .Eid ;
6+ import com .iab .openrtb .request .Source ;
57import com .iab .openrtb .request .User ;
68import io .vertx .core .Future ;
79import io .vertx .core .MultiMap ;
810import 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 ;
919import org .prebid .server .hooks .execution .v1 .InvocationResultImpl ;
1020import org .prebid .server .hooks .execution .v1 .auction .AuctionRequestPayloadImpl ;
1121import org .prebid .server .hooks .modules .liveintent .omni .channel .identity .model .IdResResponse ;
1222import 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 ;
1324import org .prebid .server .hooks .v1 .InvocationAction ;
1425import org .prebid .server .hooks .v1 .InvocationResult ;
1526import 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