Skip to content

Commit 55a4d9c

Browse files
authored
Support excluded bidders from config in userId/deviceId masking (#1082)
1 parent 04616e8 commit 55a4d9c

File tree

11 files changed

+430
-328
lines changed

11 files changed

+430
-328
lines changed

src/main/java/org/prebid/server/privacy/gdpr/tcfstrategies/purpose/PurposeStrategy.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,18 @@ public Collection<VendorPermission> processTypePurposeStrategy(
5252
Collection<VendorPermissionWithGvl> vendorPermissions,
5353
boolean wasDowngraded) {
5454

55-
allowedByTypeStrategy(vendorConsent, purpose, vendorPermissions).stream()
55+
final Collection<VendorPermissionWithGvl> excludedVendors = excludedVendors(vendorPermissions, purpose);
56+
final Collection<VendorPermissionWithGvl> vendorForPurpose = vendorPermissions.stream()
57+
.filter(vendorPermission -> !excludedVendors.contains(vendorPermission))
58+
.collect(Collectors.toList());
59+
60+
allowedByTypeStrategy(vendorConsent, purpose, vendorForPurpose, excludedVendors).stream()
5661
.map(VendorPermission::getPrivacyEnforcementAction)
5762
.forEach(this::allow);
5863

5964
final Collection<VendorPermission> naturalVendorPermission = wasDowngraded
60-
? allowedByBasicTypeStrategy(vendorConsent, true, vendorPermissions, Collections.emptyList())
61-
: allowedByFullTypeStrategy(vendorConsent, true, vendorPermissions, Collections.emptyList());
65+
? allowedByBasicTypeStrategy(vendorConsent, true, vendorForPurpose, excludedVendors)
66+
: allowedByFullTypeStrategy(vendorConsent, true, vendorForPurpose, excludedVendors);
6267

6368
naturalVendorPermission.stream()
6469
.map(VendorPermission::getPrivacyEnforcementAction)
@@ -71,12 +76,8 @@ public Collection<VendorPermission> processTypePurposeStrategy(
7176

7277
private Collection<VendorPermission> allowedByTypeStrategy(TCString vendorConsent,
7378
Purpose purpose,
74-
Collection<VendorPermissionWithGvl> vendorPermissions) {
75-
76-
final Collection<VendorPermissionWithGvl> excludedVendors = excludedVendors(vendorPermissions, purpose);
77-
final Collection<VendorPermissionWithGvl> vendorForPurpose = vendorPermissions.stream()
78-
.filter(vendorPermission -> !excludedVendors.contains(vendorPermission))
79-
.collect(Collectors.toList());
79+
Collection<VendorPermissionWithGvl> vendorForPurpose,
80+
Collection<VendorPermissionWithGvl> excludedVendors) {
8081
final boolean isEnforceVendors = BooleanUtils.isNotFalse(purpose.getEnforceVendors());
8182

8283
final EnforcePurpose purposeType = purpose.getEnforcePurpose();
@@ -105,7 +106,7 @@ protected Collection<VendorPermissionWithGvl> excludedVendors(Collection<VendorP
105106
return CollectionUtils.isEmpty(bidderNameExceptions)
106107
? Collections.emptyList()
107108
: CollectionUtils.select(vendorPermissions, vendorPermission ->
108-
bidderNameExceptions.contains(vendorPermission.getVendorPermission().getBidderName()));
109+
bidderNameExceptions.contains(vendorPermission.getVendorPermission().getBidderName()));
109110
}
110111

111112
protected Collection<VendorPermission> allowedByBasicTypeStrategy(

src/test/java/org/prebid/server/privacy/gdpr/tcfstrategies/purpose/PurposeEightStrategyTest.java

Lines changed: 42 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import static org.mockito.ArgumentMatchers.any;
2828
import static org.mockito.ArgumentMatchers.anyBoolean;
2929
import static org.mockito.BDDMockito.given;
30+
import static org.mockito.Mockito.times;
3031
import static org.mockito.Mockito.verify;
3132

3233
public class PurposeEightStrategyTest {
@@ -222,20 +223,20 @@ public void processTypePurposeStrategyShouldPassEmptyListWithFullEnforcementsWhe
222223
vendorPermissionsWithGvl, false);
223224

224225
// then
225-
final VendorPermission vendorPermission1Changed = VendorPermission.of(1, "b1", allowAllPurpose());
226-
final VendorPermission vendorPermission2Changed = VendorPermission.of(2, "b2", allowAllPurpose());
227-
final VendorPermission vendorPermission3Changed = VendorPermission.of(3, "b3", allowAllPurpose());
226+
final VendorPermission vendorPermission1Changed = VendorPermission.of(1, "b1", allowPurposeAndNaturally());
227+
final VendorPermission vendorPermission2Changed = VendorPermission.of(2, "b2", allowPurposeAndNaturally());
228+
final VendorPermission vendorPermission3Changed = VendorPermission.of(3, "b3", allowPurposeAndNaturally());
228229
assertThat(result).usingFieldByFieldElementComparator().isEqualTo(
229230
Arrays.asList(vendorPermission1Changed, vendorPermission2Changed, vendorPermission3Changed));
230231

231-
verify(fullEnforcePurposeStrategy).allowedByTypeStrategy(PURPOSE, tcString, emptyList(),
232+
verify(fullEnforcePurposeStrategy, times(2)).allowedByTypeStrategy(PURPOSE, tcString, emptyList(),
232233
vendorPermissionsWithGvl, true);
233234
}
234235

235236
@Test
236-
public void processTypePurposeStrategyShouldAllowOnlyPurposeWhenThereAreNoNaturalAllowance() {
237+
public void processTypePurposeStrategyShouldAllowPurposeAndNaturallyVendorExceptions() {
237238
// given
238-
final Purpose purpose = Purpose.of(EnforcePurpose.full, null, Arrays.asList("b1", "b2", "b3", "b5", "b7"));
239+
final Purpose purpose = Purpose.of(EnforcePurpose.full, null, Arrays.asList("b1", "b2"));
239240
final VendorPermission vendorPermission1 = VendorPermission.of(1, "b1", PrivacyEnforcementAction.restrictAll());
240241
final VendorPermission vendorPermission2 = VendorPermission.of(2, "b2", PrivacyEnforcementAction.restrictAll());
241242
final VendorPermission vendorPermission3 = VendorPermission.of(3, "b3", PrivacyEnforcementAction.restrictAll());
@@ -247,34 +248,37 @@ public void processTypePurposeStrategyShouldAllowOnlyPurposeWhenThereAreNoNatura
247248
VendorV2.empty(3));
248249
final List<VendorPermission> vendorPermissions = Arrays.asList(vendorPermission1, vendorPermission2,
249250
vendorPermission3);
250-
final List<VendorPermissionWithGvl> vendorPermissionsWithGvl = Arrays.asList(vendorPermissionWitGvl1,
251-
vendorPermissionWitGvl2, vendorPermissionWitGvl3);
251+
final List<VendorPermission> excludedVendorPermissions = Arrays.asList(vendorPermission1, vendorPermission2);
252252

253253
given(fullEnforcePurposeStrategy.allowedByTypeStrategy(any(), any(), any(), any(), anyBoolean()))
254254
.willReturn(vendorPermissions)
255-
.willReturn(emptyList());
255+
.willReturn(excludedVendorPermissions);
256+
257+
final List<VendorPermissionWithGvl> vendorPermissionsWithGvl = Arrays.asList(vendorPermissionWitGvl1,
258+
vendorPermissionWitGvl2, vendorPermissionWitGvl3);
256259

257260
// when
258261
final Collection<VendorPermission> result = target.processTypePurposeStrategy(tcString, purpose,
259262
vendorPermissionsWithGvl, false);
260263

261264
// then
262-
final VendorPermission vendorPermission1Changed = VendorPermission.of(1, "b1", allowPurpose());
263-
final VendorPermission vendorPermission2Changed = VendorPermission.of(2, "b2", allowPurpose());
265+
final List<VendorPermissionWithGvl> excludedVendorPermissionsWithGvl = Arrays.asList(vendorPermissionWitGvl1,
266+
vendorPermissionWitGvl2);
267+
268+
final VendorPermission vendorPermission1Changed = VendorPermission.of(1, "b1", allowPurposeAndNaturally());
269+
final VendorPermission vendorPermission2Changed = VendorPermission.of(2, "b2", allowPurposeAndNaturally());
264270
final VendorPermission vendorPermission3Changed = VendorPermission.of(3, "b3", allowPurpose());
265271
assertThat(result).usingFieldByFieldElementComparator().isEqualTo(
266272
Arrays.asList(vendorPermission1Changed, vendorPermission2Changed, vendorPermission3Changed));
267273

268-
verify(fullEnforcePurposeStrategy).allowedByTypeStrategy(PURPOSE, tcString, emptyList(),
269-
vendorPermissionsWithGvl, true);
270-
verify(fullEnforcePurposeStrategy).allowedByTypeStrategy(PURPOSE, tcString, vendorPermissionsWithGvl,
271-
emptyList(), true);
274+
verify(fullEnforcePurposeStrategy, times(2)).allowedByTypeStrategy(PURPOSE, tcString,
275+
singletonList(vendorPermissionWitGvl3), excludedVendorPermissionsWithGvl, true);
272276
}
273277

274278
@Test
275-
public void processTypePurposeStrategyShouldAllowOnlyPurposeWhenThereAreNoNaturalAllowanceForDowngraded() {
279+
public void processTypePurposeStrategyShouldAllowPurposeAndNaturallyWhenVendorPermissionsReturnedForDowngraded() {
276280
// given
277-
final Purpose purpose = Purpose.of(EnforcePurpose.no, null, Arrays.asList("b1", "b2", "b3", "b5", "b7"));
281+
final Purpose purpose = Purpose.of(EnforcePurpose.no, null, Arrays.asList("b1", "b2"));
278282
final VendorPermission vendorPermission1 = VendorPermission.of(1, "b1", PrivacyEnforcementAction.restrictAll());
279283
final VendorPermission vendorPermission2 = VendorPermission.of(2, "b2", PrivacyEnforcementAction.restrictAll());
280284
final VendorPermission vendorPermission3 = VendorPermission.of(3, "b3", PrivacyEnforcementAction.restrictAll());
@@ -286,44 +290,50 @@ public void processTypePurposeStrategyShouldAllowOnlyPurposeWhenThereAreNoNatura
286290
VendorV2.empty(3));
287291
final List<VendorPermission> vendorPermissions = Arrays.asList(vendorPermission1, vendorPermission2,
288292
vendorPermission3);
289-
final List<VendorPermissionWithGvl> vendorPermissionsWithGvl = Arrays.asList(vendorPermissionWitGvl1,
290-
vendorPermissionWitGvl2, vendorPermissionWitGvl3);
293+
294+
final List<VendorPermission> excludedVendorPermissions = Arrays.asList(vendorPermission1, vendorPermission2);
291295

292296
given(noEnforcePurposeStrategy.allowedByTypeStrategy(any(), any(), any(), any(), anyBoolean()))
293297
.willReturn(vendorPermissions);
294298
given(basicEnforcePurposeStrategy.allowedByTypeStrategy(any(), any(), any(), any(), anyBoolean()))
295-
.willReturn(emptyList());
299+
.willReturn(excludedVendorPermissions);
300+
301+
final List<VendorPermissionWithGvl> vendorPermissionsWithGvl = Arrays.asList(vendorPermissionWitGvl1,
302+
vendorPermissionWitGvl2, vendorPermissionWitGvl3);
296303

297304
// when
298305
final Collection<VendorPermission> result = target.processTypePurposeStrategy(tcString, purpose,
299306
vendorPermissionsWithGvl, true);
300307

301308
// then
302-
final VendorPermission vendorPermission1Changed = VendorPermission.of(1, "b1", allowPurpose());
303-
final VendorPermission vendorPermission2Changed = VendorPermission.of(2, "b2", allowPurpose());
309+
final List<VendorPermissionWithGvl> excludedVendorPermissionsWithGvl = Arrays.asList(vendorPermissionWitGvl1,
310+
vendorPermissionWitGvl2);
311+
312+
final VendorPermission vendorPermission1Changed = VendorPermission.of(1, "b1", allowPurposeAndNaturally());
313+
final VendorPermission vendorPermission2Changed = VendorPermission.of(2, "b2", allowPurposeAndNaturally());
304314
final VendorPermission vendorPermission3Changed = VendorPermission.of(3, "b3", allowPurpose());
305315
assertThat(result).usingFieldByFieldElementComparator().isEqualTo(
306316
Arrays.asList(vendorPermission1Changed, vendorPermission2Changed, vendorPermission3Changed));
307317

308-
verify(noEnforcePurposeStrategy).allowedByTypeStrategy(PURPOSE, tcString, emptyList(),
309-
vendorPermissionsWithGvl, true);
310-
verify(basicEnforcePurposeStrategy).allowedByTypeStrategy(PURPOSE, tcString, vendorPermissionsWithGvl,
311-
emptyList(), true);
318+
verify(noEnforcePurposeStrategy).allowedByTypeStrategy(PURPOSE, tcString,
319+
singletonList(vendorPermissionWitGvl3), excludedVendorPermissionsWithGvl, true);
320+
verify(basicEnforcePurposeStrategy).allowedByTypeStrategy(PURPOSE, tcString,
321+
singletonList(vendorPermissionWitGvl3), excludedVendorPermissionsWithGvl, true);
312322
}
313323

314-
private static PrivacyEnforcementAction allowAllPurpose() {
315-
final PrivacyEnforcementAction privacyEnforcementAction = PrivacyEnforcementAction.restrictAll();
316-
privacyEnforcementAction.setRemoveUserIds(false);
317-
privacyEnforcementAction.setMaskDeviceInfo(false);
318-
return privacyEnforcementAction;
324+
private static PrivacyEnforcementAction allowPurposeAndNaturally() {
325+
return allowNatural(allowPurpose());
319326
}
320327

321328
private static PrivacyEnforcementAction allowPurpose() {
322329
return PrivacyEnforcementAction.restrictAll();
323330
}
324331

325332
private static PrivacyEnforcementAction allowNatural() {
326-
final PrivacyEnforcementAction privacyEnforcementAction = PrivacyEnforcementAction.restrictAll();
333+
return allowNatural(PrivacyEnforcementAction.restrictAll());
334+
}
335+
336+
private static PrivacyEnforcementAction allowNatural(PrivacyEnforcementAction privacyEnforcementAction) {
327337
privacyEnforcementAction.setRemoveUserIds(false);
328338
privacyEnforcementAction.setMaskDeviceInfo(false);
329339
return privacyEnforcementAction;

0 commit comments

Comments
 (0)