Skip to content

Commit c23f861

Browse files
Chadclaude
authored andcommitted
fix: replace GPC segment with SensitiveDataConsent segment for IN/KY/RI
Per the IAB GPP MSPA spec, Indiana (25), Kentucky (26), and Rhode Island (27) have a Sensitive Data Consents optional segment (not GPC). Move SensitiveDataProcessing out of the core segment and into the new UsIn/Ky/RiSensitiveDataConsentSegment, and remove the incorrectly added GPC fields and segment files. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 5e7d05d commit c23f861

16 files changed

Lines changed: 142 additions & 168 deletions

iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsInField.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@ public class UsInField {
1717
public static String ADDITIONAL_DATA_PROCESSING_CONSENT = "AdditionalDataProcessingConsent";
1818
public static String SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing";
1919

20-
public static String GPC_SEGMENT_TYPE = "GpcSegmentType";
21-
public static String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded";
22-
public static String GPC = "Gpc";
20+
public static String SENSITIVE_DATA_CONSENT_SEGMENT_INCLUDED = "SensitiveDataConsentSegmentIncluded";
2321

2422
//@formatter:off
2523
public static List<String> USIN_CORE_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] {
@@ -32,15 +30,13 @@ public class UsInField {
3230
UsInField.SALE_OPT_OUT,
3331
UsInField.TARGETED_ADVERTISING_OPT_OUT,
3432
UsInField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS,
35-
UsInField.ADDITIONAL_DATA_PROCESSING_CONSENT,
36-
UsInField.SENSITIVE_DATA_PROCESSING
33+
UsInField.ADDITIONAL_DATA_PROCESSING_CONSENT
3734
});
3835
//@formatter:on
3936

4037
//@formatter:off
41-
public static List<String> USIN_GPC_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] {
42-
UsInField.GPC_SEGMENT_TYPE,
43-
UsInField.GPC
38+
public static List<String> USIN_SENSITIVE_DATA_CONSENT_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] {
39+
UsInField.SENSITIVE_DATA_PROCESSING
4440
});
4541
//@formatter:on
4642
}

iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsKyField.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@ public class UsKyField {
1717
public static String ADDITIONAL_DATA_PROCESSING_CONSENT = "AdditionalDataProcessingConsent";
1818
public static String SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing";
1919

20-
public static String GPC_SEGMENT_TYPE = "GpcSegmentType";
21-
public static String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded";
22-
public static String GPC = "Gpc";
20+
public static String SENSITIVE_DATA_CONSENT_SEGMENT_INCLUDED = "SensitiveDataConsentSegmentIncluded";
2321

2422
//@formatter:off
2523
public static List<String> USKY_CORE_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] {
@@ -32,15 +30,13 @@ public class UsKyField {
3230
UsKyField.SALE_OPT_OUT,
3331
UsKyField.TARGETED_ADVERTISING_OPT_OUT,
3432
UsKyField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS,
35-
UsKyField.ADDITIONAL_DATA_PROCESSING_CONSENT,
36-
UsKyField.SENSITIVE_DATA_PROCESSING
33+
UsKyField.ADDITIONAL_DATA_PROCESSING_CONSENT
3734
});
3835
//@formatter:on
3936

4037
//@formatter:off
41-
public static List<String> USKY_GPC_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] {
42-
UsKyField.GPC_SEGMENT_TYPE,
43-
UsKyField.GPC
38+
public static List<String> USKY_SENSITIVE_DATA_CONSENT_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] {
39+
UsKyField.SENSITIVE_DATA_PROCESSING
4440
});
4541
//@formatter:on
4642
}

iabgpp-encoder/src/main/java/com/iab/gpp/encoder/field/UsRiField.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@ public class UsRiField {
1717
public static String ADDITIONAL_DATA_PROCESSING_CONSENT = "AdditionalDataProcessingConsent";
1818
public static String SENSITIVE_DATA_PROCESSING = "SensitiveDataProcessing";
1919

20-
public static String GPC_SEGMENT_TYPE = "GpcSegmentType";
21-
public static String GPC_SEGMENT_INCLUDED = "GpcSegmentIncluded";
22-
public static String GPC = "Gpc";
20+
public static String SENSITIVE_DATA_CONSENT_SEGMENT_INCLUDED = "SensitiveDataConsentSegmentIncluded";
2321

2422
//@formatter:off
2523
public static List<String> USRI_CORE_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] {
@@ -32,15 +30,13 @@ public class UsRiField {
3230
UsRiField.SALE_OPT_OUT,
3331
UsRiField.TARGETED_ADVERTISING_OPT_OUT,
3432
UsRiField.KNOWN_CHILD_SENSITIVE_DATA_CONSENTS,
35-
UsRiField.ADDITIONAL_DATA_PROCESSING_CONSENT,
36-
UsRiField.SENSITIVE_DATA_PROCESSING
33+
UsRiField.ADDITIONAL_DATA_PROCESSING_CONSENT
3734
});
3835
//@formatter:on
3936

4037
//@formatter:off
41-
public static List<String> USRI_GPC_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] {
42-
UsRiField.GPC_SEGMENT_TYPE,
43-
UsRiField.GPC
38+
public static List<String> USRI_SENSITIVE_DATA_CONSENT_SEGMENT_FIELD_NAMES = Arrays.asList(new String[] {
39+
UsRiField.SENSITIVE_DATA_PROCESSING
4440
});
4541
//@formatter:on
4642
}

iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsIn.java

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public int getVersion() {
4040
protected List<EncodableSegment> initializeSegments() {
4141
List<EncodableSegment> segments = new ArrayList<>();
4242
segments.add(new UsInCoreSegment());
43-
segments.add(new UsInGpcSegment());
43+
segments.add(new UsInSensitiveDataConsentSegment());
4444
return segments;
4545
}
4646

@@ -56,10 +56,10 @@ protected List<EncodableSegment> decodeSection(String encodedString) {
5656
}
5757

5858
if (encodedSegments.length > 1) {
59-
segments.get(1).setFieldValue(UsInField.GPC_SEGMENT_INCLUDED, true);
59+
segments.get(1).setFieldValue(UsInField.SENSITIVE_DATA_CONSENT_SEGMENT_INCLUDED, true);
6060
segments.get(1).decode(encodedSegments[1]);
6161
} else {
62-
segments.get(1).setFieldValue(UsInField.GPC_SEGMENT_INCLUDED, false);
62+
segments.get(1).setFieldValue(UsInField.SENSITIVE_DATA_CONSENT_SEGMENT_INCLUDED, false);
6363
}
6464
}
6565

@@ -72,7 +72,7 @@ protected String encodeSection(List<EncodableSegment> segments) {
7272

7373
if (!segments.isEmpty()) {
7474
encodedSegments.add(segments.get(0).encode());
75-
if (segments.size() >= 2 && segments.get(1).getFieldValue(UsInField.GPC_SEGMENT_INCLUDED).equals(true)) {
75+
if (segments.size() >= 2 && segments.get(1).getFieldValue(UsInField.SENSITIVE_DATA_CONSENT_SEGMENT_INCLUDED).equals(true)) {
7676
encodedSegments.add(segments.get(1).encode());
7777
}
7878
}
@@ -121,20 +121,12 @@ public Integer getAdditionalDataProcessingConsent() {
121121
return (Integer) this.getFieldValue(UsInField.ADDITIONAL_DATA_PROCESSING_CONSENT);
122122
}
123123

124+
public Boolean getSensitiveDataConsentSegmentIncluded() {
125+
return (Boolean) this.getFieldValue(UsInField.SENSITIVE_DATA_CONSENT_SEGMENT_INCLUDED);
126+
}
127+
124128
@SuppressWarnings("unchecked")
125129
public List<Integer> getSensitiveDataProcessing() {
126130
return (List<Integer>) this.getFieldValue(UsInField.SENSITIVE_DATA_PROCESSING);
127131
}
128-
129-
public Integer getGpcSegmentType() {
130-
return (Integer) this.getFieldValue(UsInField.GPC_SEGMENT_TYPE);
131-
}
132-
133-
public Boolean getGpcSegmentIncluded() {
134-
return (Boolean) this.getFieldValue(UsInField.GPC_SEGMENT_INCLUDED);
135-
}
136-
137-
public Boolean getGpc() {
138-
return (Boolean) this.getFieldValue(UsInField.GPC);
139-
}
140132
}

iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsKy.java

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public int getVersion() {
4040
protected List<EncodableSegment> initializeSegments() {
4141
List<EncodableSegment> segments = new ArrayList<>();
4242
segments.add(new UsKyCoreSegment());
43-
segments.add(new UsKyGpcSegment());
43+
segments.add(new UsKySensitiveDataConsentSegment());
4444
return segments;
4545
}
4646

@@ -56,10 +56,10 @@ protected List<EncodableSegment> decodeSection(String encodedString) {
5656
}
5757

5858
if (encodedSegments.length > 1) {
59-
segments.get(1).setFieldValue(UsKyField.GPC_SEGMENT_INCLUDED, true);
59+
segments.get(1).setFieldValue(UsKyField.SENSITIVE_DATA_CONSENT_SEGMENT_INCLUDED, true);
6060
segments.get(1).decode(encodedSegments[1]);
6161
} else {
62-
segments.get(1).setFieldValue(UsKyField.GPC_SEGMENT_INCLUDED, false);
62+
segments.get(1).setFieldValue(UsKyField.SENSITIVE_DATA_CONSENT_SEGMENT_INCLUDED, false);
6363
}
6464
}
6565

@@ -72,7 +72,7 @@ protected String encodeSection(List<EncodableSegment> segments) {
7272

7373
if (!segments.isEmpty()) {
7474
encodedSegments.add(segments.get(0).encode());
75-
if (segments.size() >= 2 && segments.get(1).getFieldValue(UsKyField.GPC_SEGMENT_INCLUDED).equals(true)) {
75+
if (segments.size() >= 2 && segments.get(1).getFieldValue(UsKyField.SENSITIVE_DATA_CONSENT_SEGMENT_INCLUDED).equals(true)) {
7676
encodedSegments.add(segments.get(1).encode());
7777
}
7878
}
@@ -121,20 +121,12 @@ public Integer getAdditionalDataProcessingConsent() {
121121
return (Integer) this.getFieldValue(UsKyField.ADDITIONAL_DATA_PROCESSING_CONSENT);
122122
}
123123

124+
public Boolean getSensitiveDataConsentSegmentIncluded() {
125+
return (Boolean) this.getFieldValue(UsKyField.SENSITIVE_DATA_CONSENT_SEGMENT_INCLUDED);
126+
}
127+
124128
@SuppressWarnings("unchecked")
125129
public List<Integer> getSensitiveDataProcessing() {
126130
return (List<Integer>) this.getFieldValue(UsKyField.SENSITIVE_DATA_PROCESSING);
127131
}
128-
129-
public Integer getGpcSegmentType() {
130-
return (Integer) this.getFieldValue(UsKyField.GPC_SEGMENT_TYPE);
131-
}
132-
133-
public Boolean getGpcSegmentIncluded() {
134-
return (Boolean) this.getFieldValue(UsKyField.GPC_SEGMENT_INCLUDED);
135-
}
136-
137-
public Boolean getGpc() {
138-
return (Boolean) this.getFieldValue(UsKyField.GPC);
139-
}
140132
}

iabgpp-encoder/src/main/java/com/iab/gpp/encoder/section/UsRi.java

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public int getVersion() {
4040
protected List<EncodableSegment> initializeSegments() {
4141
List<EncodableSegment> segments = new ArrayList<>();
4242
segments.add(new UsRiCoreSegment());
43-
segments.add(new UsRiGpcSegment());
43+
segments.add(new UsRiSensitiveDataConsentSegment());
4444
return segments;
4545
}
4646

@@ -56,10 +56,10 @@ protected List<EncodableSegment> decodeSection(String encodedString) {
5656
}
5757

5858
if (encodedSegments.length > 1) {
59-
segments.get(1).setFieldValue(UsRiField.GPC_SEGMENT_INCLUDED, true);
59+
segments.get(1).setFieldValue(UsRiField.SENSITIVE_DATA_CONSENT_SEGMENT_INCLUDED, true);
6060
segments.get(1).decode(encodedSegments[1]);
6161
} else {
62-
segments.get(1).setFieldValue(UsRiField.GPC_SEGMENT_INCLUDED, false);
62+
segments.get(1).setFieldValue(UsRiField.SENSITIVE_DATA_CONSENT_SEGMENT_INCLUDED, false);
6363
}
6464
}
6565

@@ -72,7 +72,7 @@ protected String encodeSection(List<EncodableSegment> segments) {
7272

7373
if (!segments.isEmpty()) {
7474
encodedSegments.add(segments.get(0).encode());
75-
if (segments.size() >= 2 && segments.get(1).getFieldValue(UsRiField.GPC_SEGMENT_INCLUDED).equals(true)) {
75+
if (segments.size() >= 2 && segments.get(1).getFieldValue(UsRiField.SENSITIVE_DATA_CONSENT_SEGMENT_INCLUDED).equals(true)) {
7676
encodedSegments.add(segments.get(1).encode());
7777
}
7878
}
@@ -121,20 +121,12 @@ public Integer getAdditionalDataProcessingConsent() {
121121
return (Integer) this.getFieldValue(UsRiField.ADDITIONAL_DATA_PROCESSING_CONSENT);
122122
}
123123

124+
public Boolean getSensitiveDataConsentSegmentIncluded() {
125+
return (Boolean) this.getFieldValue(UsRiField.SENSITIVE_DATA_CONSENT_SEGMENT_INCLUDED);
126+
}
127+
124128
@SuppressWarnings("unchecked")
125129
public List<Integer> getSensitiveDataProcessing() {
126130
return (List<Integer>) this.getFieldValue(UsRiField.SENSITIVE_DATA_PROCESSING);
127131
}
128-
129-
public Integer getGpcSegmentType() {
130-
return (Integer) this.getFieldValue(UsRiField.GPC_SEGMENT_TYPE);
131-
}
132-
133-
public Boolean getGpcSegmentIncluded() {
134-
return (Boolean) this.getFieldValue(UsRiField.GPC_SEGMENT_INCLUDED);
135-
}
136-
137-
public Boolean getGpc() {
138-
return (Boolean) this.getFieldValue(UsRiField.GPC);
139-
}
140132
}

iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsInCoreSegment.java

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,11 @@
44
import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder;
55
import com.iab.gpp.encoder.bitstring.BitStringEncoder;
66
import com.iab.gpp.encoder.datatype.EncodableFixedInteger;
7-
import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList;
87
import com.iab.gpp.encoder.error.DecodingException;
98
import com.iab.gpp.encoder.field.EncodableBitStringFields;
109
import com.iab.gpp.encoder.field.UsInField;
1110
import com.iab.gpp.encoder.section.UsIn;
1211

13-
import java.util.Arrays;
1412
import java.util.List;
1513
import java.util.function.Predicate;
1614

@@ -37,14 +35,6 @@ public List<String> getFieldNames() {
3735
protected EncodableBitStringFields initializeFields() {
3836
Predicate<Integer> nullableBooleanAsTwoBitIntegerValidator = (n -> n >= 0 && n <= 2);
3937
Predicate<Integer> nonNullableBooleanAsTwoBitIntegerValidator = (n -> n >= 1 && n <= 2);
40-
Predicate<List<Integer>> nullableBooleanAsTwoBitIntegerListValidator = (l -> {
41-
for (int n : l) {
42-
if (n < 0 || n > 2) {
43-
return false;
44-
}
45-
}
46-
return true;
47-
});
4838

4939
EncodableBitStringFields fields = new EncodableBitStringFields();
5040
fields.put(UsInField.MSPA_VERSION, new EncodableFixedInteger(6, UsIn.VERSION));
@@ -66,9 +56,6 @@ protected EncodableBitStringFields initializeFields() {
6656
new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator));
6757
fields.put(UsInField.ADDITIONAL_DATA_PROCESSING_CONSENT,
6858
new EncodableFixedInteger(2, 0).withValidator(nullableBooleanAsTwoBitIntegerValidator));
69-
fields.put(UsInField.SENSITIVE_DATA_PROCESSING,
70-
new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0))
71-
.withValidator(nullableBooleanAsTwoBitIntegerListValidator));
7259
return fields;
7360
}
7461

iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsInGpcSegment.java renamed to iabgpp-encoder/src/main/java/com/iab/gpp/encoder/segment/UsInSensitiveDataConsentSegment.java

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,38 +4,50 @@
44
import com.iab.gpp.encoder.base64.CompressedBase64UrlEncoder;
55
import com.iab.gpp.encoder.bitstring.BitStringEncoder;
66
import com.iab.gpp.encoder.datatype.EncodableBoolean;
7-
import com.iab.gpp.encoder.datatype.EncodableFixedInteger;
7+
import com.iab.gpp.encoder.datatype.EncodableFixedIntegerList;
88
import com.iab.gpp.encoder.error.DecodingException;
99
import com.iab.gpp.encoder.field.EncodableBitStringFields;
1010
import com.iab.gpp.encoder.field.UsInField;
1111

12+
import java.util.Arrays;
1213
import java.util.List;
14+
import java.util.function.Predicate;
1315

14-
public class UsInGpcSegment extends AbstractLazilyEncodableSegment<EncodableBitStringFields> {
16+
public class UsInSensitiveDataConsentSegment extends AbstractLazilyEncodableSegment<EncodableBitStringFields> {
1517

1618
private AbstractBase64UrlEncoder base64UrlEncoder = CompressedBase64UrlEncoder.getInstance();
1719
private BitStringEncoder bitStringEncoder = BitStringEncoder.getInstance();
1820

19-
public UsInGpcSegment() {
21+
public UsInSensitiveDataConsentSegment() {
2022
super();
2123
}
2224

23-
public UsInGpcSegment(String encodedString) {
25+
public UsInSensitiveDataConsentSegment(String encodedString) {
2426
super();
2527
this.decode(encodedString);
2628
}
2729

2830
@Override
2931
public List<String> getFieldNames() {
30-
return UsInField.USIN_GPC_SEGMENT_FIELD_NAMES;
32+
return UsInField.USIN_SENSITIVE_DATA_CONSENT_SEGMENT_FIELD_NAMES;
3133
}
3234

3335
@Override
3436
protected EncodableBitStringFields initializeFields() {
37+
Predicate<List<Integer>> nullableBooleanAsTwoBitIntegerListValidator = (l -> {
38+
for (int n : l) {
39+
if (n < 0 || n > 2) {
40+
return false;
41+
}
42+
}
43+
return true;
44+
});
45+
3546
EncodableBitStringFields fields = new EncodableBitStringFields();
36-
fields.put(UsInField.GPC_SEGMENT_TYPE, new EncodableFixedInteger(2, 1));
37-
fields.put(UsInField.GPC_SEGMENT_INCLUDED, new EncodableBoolean(true));
38-
fields.put(UsInField.GPC, new EncodableBoolean(false));
47+
fields.put(UsInField.SENSITIVE_DATA_CONSENT_SEGMENT_INCLUDED, new EncodableBoolean(true));
48+
fields.put(UsInField.SENSITIVE_DATA_PROCESSING,
49+
new EncodableFixedIntegerList(2, Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0))
50+
.withValidator(nullableBooleanAsTwoBitIntegerListValidator));
3951
return fields;
4052
}
4153

@@ -48,14 +60,14 @@ protected String encodeSegment(EncodableBitStringFields fields) {
4860

4961
@Override
5062
protected void decodeSegment(String encodedString, EncodableBitStringFields fields) {
51-
if(encodedString == null || encodedString.isEmpty()) {
63+
if (encodedString == null || encodedString.isEmpty()) {
5264
this.fields.reset(fields);
5365
}
5466
try {
5567
String bitString = base64UrlEncoder.decode(encodedString);
5668
bitStringEncoder.decode(bitString, getFieldNames(), fields);
5769
} catch (Exception e) {
58-
throw new DecodingException("Unable to decode UsInGpcSegment '" + encodedString + "'", e);
70+
throw new DecodingException("Unable to decode UsInSensitiveDataConsentSegment '" + encodedString + "'", e);
5971
}
6072
}
6173
}

0 commit comments

Comments
 (0)