Create SegmentType and TcfVersion constants

This commit is contained in:
Thomas LAY
2020-04-06 14:30:24 +02:00
parent 32689c75f9
commit 34eb7e045a
5 changed files with 74 additions and 54 deletions
+12 -8
View File
@@ -36,15 +36,19 @@ if err != nil {
} }
``` ```
Use `GetSegmentType(segment string)` to read the segment type from a segment value: Use `GetSegmentType(segment string) (segmentType SegmentType, err error)` to read the segment type from a segment value:
- `0` = *Core String* - `SegmentTypeUndefined` = undefined
- `1` = *Disclosed Vendors* - `SegmentTypeCoreString` = *Core String*
- `2` = *Allowed Vendors* - `SegmentTypeDisclosedVendors` = *Disclosed Vendors*
- `3` = *Publisher TC* - `SegmentTypeAllowedVendors` = *Allowed Vendors*
- `SegmentTypePublisherTC` = *Publisher TC*
Use `GetVersion(s string)` to verify the cookie version from a TC String or a *Core String* segment value. This function also supports TCF V1.1 consent strings: You can find more information about segment types [here](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20Consent%20string%20and%20vendor%20list%20formats%20v2.md#disclosed-vendors-oob).
- `1` = TCF V1.1
- `2` = TCF V2.0 Use `GetVersion(s string) (version TcfVersion, err error)` to read the cookie version from a TC String or a *Core String* segment value. This function also supports TCF V1.1 consent strings:
- `TcfVersionUndefined` = undefined
- `TcfVersion1` = TCF V1.1
- `TcfVersion2` = TCF V2.0
#### Example #### Example
``` ```
+19
View File
@@ -0,0 +1,19 @@
package iabtcfv2
type SegmentType int
const (
SegmentTypeUndefined SegmentType = -1
SegmentTypeCoreString SegmentType = 0
SegmentTypeDisclosedVendors SegmentType = 1
SegmentTypeAllowedVendors SegmentType = 2
SegmentTypePublisherTC SegmentType = 3
)
type TcfVersion int
const (
TcfVersionUndefined TcfVersion = -1
TcfVersion1 TcfVersion = 1
TcfVersion2 TcfVersion = 2
)
+29 -25
View File
@@ -6,9 +6,12 @@ import (
"strings" "strings"
) )
// Decodes a string and returns the TCF version // Decodes a string and returns the TcfVersion
// It can also decode version from a TCF V1.1 consent string // It can also decode version from a TCF V1.1 consent string
func GetVersion(s string) (version int, err error) { // - TcfVersionUndefined = -1
// - TcfVersion1 = 1
// - TcfVersion2 = 2
func GetVersion(s string) (version TcfVersion, err error) {
defer func() { defer func() {
if r := recover(); r != nil { if r := recover(); r != nil {
err = fmt.Errorf("%v", r) err = fmt.Errorf("%v", r)
@@ -17,19 +20,20 @@ func GetVersion(s string) (version int, err error) {
b, err := base64.RawURLEncoding.DecodeString(s) b, err := base64.RawURLEncoding.DecodeString(s)
if err != nil { if err != nil {
return 0, err return TcfVersionUndefined, err
} }
var e = newTCEncoder(b) var e = newTCEncoder(b)
return e.readInt(6), nil return TcfVersion(e.readInt(6)), nil
} }
// Decodes a segment value and returns the type // Decodes a segment value and returns the SegmentType
// - 0 = Core String // - SegmentTypeUndefined = -1
// - 1 = Disclosed Vendors // - SegmentTypeCoreString = 0
// - 2 = Allowed Vendors // - SegmentTypeDisclosedVendors = 1
// - 3 = Publisher TC // - SegmentTypeAllowedVendors = 2
func GetSegmentType(segment string) (segmentType int, err error) { // - SegmentTypePublisherTC = 3
func GetSegmentType(segment string) (segmentType SegmentType, err error) {
defer func() { defer func() {
if r := recover(); r != nil { if r := recover(); r != nil {
err = fmt.Errorf("%v", r) err = fmt.Errorf("%v", r)
@@ -38,11 +42,11 @@ func GetSegmentType(segment string) (segmentType int, err error) {
b, err := base64.RawURLEncoding.DecodeString(segment) b, err := base64.RawURLEncoding.DecodeString(segment)
if err != nil { if err != nil {
return 0, err return SegmentTypeUndefined, err
} }
var e = newTCEncoder(b) var e = newTCEncoder(b)
return e.readInt(3), nil return SegmentType(e.readInt(3)), nil
} }
// Decode a TC String and returns it as a TCData structure // Decode a TC String and returns it as a TCData structure
@@ -53,55 +57,55 @@ func GetSegmentType(segment string) (segmentType int, err error) {
// - Publisher TC // - Publisher TC
func Decode(tcString string) (t *TCData, err error) { func Decode(tcString string) (t *TCData, err error) {
t = &TCData{} t = &TCData{}
mapSegments := map[int]bool{} mapSegments := map[SegmentType]bool{}
for i, v := range strings.Split(tcString, ".") { for i, v := range strings.Split(tcString, ".") {
segmentType, err := GetSegmentType(v) segmentType, err := GetSegmentType(v)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if segmentType == disclosedVendorsType { if segmentType == SegmentTypeDisclosedVendors {
if mapSegments[disclosedVendorsType] == true { if mapSegments[SegmentTypeDisclosedVendors] == true {
return nil, fmt.Errorf("duplicate Disclosed Vendors segment") return nil, fmt.Errorf("duplicate Disclosed Vendors segment")
} }
segment, err := DecodeDisclosedVendors(v) segment, err := DecodeDisclosedVendors(v)
if err == nil { if err == nil {
t.DisclosedVendors = segment t.DisclosedVendors = segment
mapSegments[disclosedVendorsType] = true mapSegments[SegmentTypeDisclosedVendors] = true
} }
} else if segmentType == allowedVendorsType { } else if segmentType == SegmentTypeAllowedVendors {
if mapSegments[allowedVendorsType] == true { if mapSegments[SegmentTypeAllowedVendors] == true {
return nil, fmt.Errorf("duplicate Allowed Vendors segment") return nil, fmt.Errorf("duplicate Allowed Vendors segment")
} }
segment, err := DecodeAllowedVendors(v) segment, err := DecodeAllowedVendors(v)
if err == nil { if err == nil {
t.AllowedVendors = segment t.AllowedVendors = segment
mapSegments[allowedVendorsType] = true mapSegments[SegmentTypeAllowedVendors] = true
} }
} else if segmentType == publicherTCType { } else if segmentType == SegmentTypePublisherTC {
if mapSegments[publicherTCType] == true { if mapSegments[SegmentTypePublisherTC] == true {
return nil, fmt.Errorf("duplicate Publisher TC segment") return nil, fmt.Errorf("duplicate Publisher TC segment")
} }
segment, err := DecodePublisherTC(v) segment, err := DecodePublisherTC(v)
if err == nil { if err == nil {
t.PublisherTC = segment t.PublisherTC = segment
mapSegments[publicherTCType] = true mapSegments[SegmentTypePublisherTC] = true
} }
} else { } else {
if mapSegments[coreStringType] == true { if mapSegments[SegmentTypeCoreString] == true {
return nil, fmt.Errorf("duplicate Core String segment") return nil, fmt.Errorf("duplicate Core String segment")
} }
segment, err := DecodeCoreString(v) segment, err := DecodeCoreString(v)
if err == nil { if err == nil {
t.CoreString = segment t.CoreString = segment
if i == 0 { if i == 0 {
mapSegments[coreStringType] = true mapSegments[SegmentTypeCoreString] = true
} }
} }
} }
} }
if mapSegments[coreStringType] == false { if mapSegments[SegmentTypeCoreString] == false {
return nil, fmt.Errorf("invalid TC string") return nil, fmt.Errorf("invalid TC string")
} }
+14 -14
View File
@@ -11,8 +11,8 @@ func TestGetVersion(t *testing.T) {
return return
} }
if version != 1 { if version != TcfVersion1 {
t.Errorf("Version should be 1") t.Errorf("Version should be %d", TcfVersion1)
} }
version, err = GetVersion("COxR03kOxR1CqBcABCENAgCMAP_AAH_AAAqIF3EXySoGY2thI2YVFxBEIYwfJxyigMgChgQIsSwNQIeFLBoGLiAAHBGYJAQAGBAEEACBAQIkHGBMCQAAgAgBiRCMQEGMCzNIBIBAggEbY0FACCVmHkHSmZCY7064O__QLuIJEFQMAkSBAIACLECIQwAQDiAAAYAlAAABAhIaAAgIWBQEeAAAACAwAAgAAABBAAACAAQAAICIAAABAAAgAiAQAAAAGgIQAACBABACRIAAAEANCAAgiCEAQg4EAo4AAA") version, err = GetVersion("COxR03kOxR1CqBcABCENAgCMAP_AAH_AAAqIF3EXySoGY2thI2YVFxBEIYwfJxyigMgChgQIsSwNQIeFLBoGLiAAHBGYJAQAGBAEEACBAQIkHGBMCQAAgAgBiRCMQEGMCzNIBIBAggEbY0FACCVmHkHSmZCY7064O__QLuIJEFQMAkSBAIACLECIQwAQDiAAAYAlAAABAhIaAAgIWBQEeAAAACAwAAgAAABBAAACAAQAAICIAAABAAAgAiAQAAAAGgIQAACBABACRIAAAEANCAAgiCEAQg4EAo4AAA")
@@ -21,8 +21,8 @@ func TestGetVersion(t *testing.T) {
return return
} }
if version != 2 { if version != TcfVersion2 {
t.Errorf("Version should be 2") t.Errorf("Version should be %d", TcfVersion2)
} }
} }
@@ -35,8 +35,8 @@ func TestGetSegmentType(t *testing.T) {
return return
} }
if segType != 1 { if segType != SegmentTypeDisclosedVendors {
t.Errorf("Segment type should be 1") t.Errorf("Segment type should be %d", SegmentTypeDisclosedVendors)
} }
} }
@@ -114,8 +114,8 @@ func TestDecodeCoreString(t *testing.T) {
return return
} }
if segType != 0 { if segType != SegmentTypeCoreString {
t.Errorf("Segment type should be 0") t.Errorf("Segment type should be %d", SegmentTypeCoreString)
return return
} }
@@ -145,8 +145,8 @@ func TestDecodeDisclosedVendors(t *testing.T) {
return return
} }
if segType != 1 { if segType != SegmentTypeDisclosedVendors {
t.Errorf("Segment type should be 1") t.Errorf("Segment type should be %d", SegmentTypeDisclosedVendors)
return return
} }
@@ -186,8 +186,8 @@ func TestDecodeAllowedVendors(t *testing.T) {
return return
} }
if segType != 2 { if segType != SegmentTypeAllowedVendors {
t.Errorf("Segment type should be 2") t.Errorf("Segment type should be %d", SegmentTypeAllowedVendors)
return return
} }
@@ -227,8 +227,8 @@ func TestDecodePublisherTC(t *testing.T) {
return return
} }
if segType != 3 { if segType != SegmentTypePublisherTC {
t.Errorf("Segment type should be 3") t.Errorf("Segment type should be %d", SegmentTypePublisherTC)
return return
} }
-7
View File
@@ -2,13 +2,6 @@ package iabtcfv2
import "strings" import "strings"
const (
coreStringType = 0
disclosedVendorsType = 1
allowedVendorsType = 2
publicherTCType = 3
)
type TCData struct { type TCData struct {
CoreString *CoreString CoreString *CoreString
DisclosedVendors *DisclosedVendors DisclosedVendors *DisclosedVendors