mirror of
https://github.com/cubixle/iabtcfv2.git
synced 2026-04-30 15:48:39 +01:00
Create SegmentType and TcfVersion constants
This commit is contained in:
@@ -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
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -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
|
||||||
|
)
|
||||||
@@ -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
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user