From edda30befbfcaf4370e53c5941b278e4a5b25dfc Mon Sep 17 00:00:00 2001 From: rde Date: Wed, 26 Jan 2022 16:54:26 +0100 Subject: [PATCH] fix IsVendorAllowedForFlexiblePurposes / IsVendorAllowedForFlexiblePurposesLI add unit test --- decode_test.go | 12 ++++++++++++ segment_core_string.go | 32 ++++++++++++++++++++++---------- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/decode_test.go b/decode_test.go index 5e15498..fa3e510 100644 --- a/decode_test.go +++ b/decode_test.go @@ -257,3 +257,15 @@ func TestDecodePublisherTC(t *testing.T) { t.Errorf("Encode() should produce the same string: in = %s, out = %s", str, result) } } + +func TestPublisherRestrictionFlexibleVendor(t *testing.T) { + str := "CPStgrQPStgrQAGABCDEB9CsAP_AAH_AAAqIH-NN7S__a2Pj-359Q_t0eY1f9953v-UhjhaZk6QF0bPDsL8V4mM6vE3opioKuBYEO3LAIQRlHKHcBQGAaokRoTPsbk2MLpAAJ7PEmgMbEmdIGHV9m93DnZKYz3w-2r6T_u4NRP_M5MfpP41v3Wt5tl06qXTTVz8YhLP1cAABAAAAQPiAIEBAUAgAEMAEQAFCIQAAQpiQAAAABBCABAAAAIiAAQVwAZIIEAAARAAAQAABAQgwAAAAAABCAAAACwQCAACAQAAgAEAAAAEJAIBACAEAAAEAJABACACECAggAAAwDAgAACCABABAAACJDAAAMIIASABgBEAABEgAGAAACAoMgFgBMAEcAMsAfYBWwExAJsAWwAz4BygD4hEAkAZYBTwDqgHyAQ6AkQBNgDPgHKCQAIDfxAAEAEgSBUAAgABYAFQAMgAcAA8ACAAGUANAA1AB5AEQARQAmABvADmAHoAP0AiACJAEsAJoAUoAtwBhwDKAMsAaoA-wB-gEUAKeAbQA3AB8gEOgJEATEAmwBTQC2AGSAM-AaQA1iByYHKBQAYAigBfAO3CAAwASAGiAU-GgGgBcAGWAQUAp8BaAFpAOqAfIBDoCRAE2AMYAZ8A5QOABAb-KgGABMAC4AI4AZcBaAFpASCAmIBNgCmwFsAM-AcoOgZAALAAqABkADgAIIAYgBlADQANQAeAA-gCIAIoATAAuABiADMAG8AOYAegA_ACIAEsAJgATQAowBSgC3AGGAMoAaIA-wB-gEUAKfAWgBaQC8gG4AOoAh0BIICRAE2AKagWwBbIDGAGSAMsAZmAz4BpADWIHJgcoPADAAqAEUAL4AjIDfwHbjgAIAJCEBYABYAGQAYgBMAC4AGIAMwAbwA9ACOAH2ARQAoYBT4C0ALSAdQBIICRAE2AKagWwBbIDPiIAMAFQAvgCMkoEAACAAFgAZAA4AB8AGIAPAAiABMAC4AGIAMwAbYBEAESAKMAUoAtwBqgEnAKfAWgBaQDcAHUAPkAh0BIgCbAFsAMsAZ8A0gBrBMAEARkBv5SBQAAsACoAGQAOAAggBiAGUANAA1AB5AEQARQAmABSADEAGYAOYAfgBEACjAFKALcAZQA0QBqgD7AKGAVsAvIBtADcAIdASIAk4BNgC2AGMAMkAZYAz4BpADWIHJgcoVACAAqAB8AL4Bv5QAGACQAk4BOw.YAAAAAAAAAAA" + tcData, err := Decode(str) + if err != nil { + t.Errorf("fail to decode tcstring: %s", err) + return + } + if !tcData.IsVendorAllowedForFlexiblePurposesLI(916, 4) { + t.Errorf("flexible vendor 916 should be allowed to purpose 4 even with publisher restriction because consent is established on purpose 4 for this vendor") + } +} diff --git a/segment_core_string.go b/segment_core_string.go index 8c3c841..1a90856 100644 --- a/segment_core_string.go +++ b/segment_core_string.go @@ -161,12 +161,18 @@ func (c *CoreString) IsVendorAllowedForFlexiblePurposes(id int, purposeIds ...in } for _, r := range pr { - if r.IsVendorIncluded(id) { - if r.RestrictionType == RestrictionTypeNotAllowed { + if !r.IsVendorIncluded(id) { + continue + } + switch r.RestrictionType { + case RestrictionTypeNotAllowed: + return false + case RestrictionTypeRequireConsent: + if !c.IsVendorAllowed(id) || !c.IsPurposeAllowed(p) { return false - } else if r.RestrictionType == RestrictionTypeRequireLI && (!c.IsVendorLIAllowed(id) || !c.IsPurposeLIAllowed(p)) { - return false - } else if !c.IsVendorAllowed(id) || !c.IsPurposeAllowed(p) { + } + case RestrictionTypeRequireLI: + if !c.IsVendorLIAllowed(id) || !c.IsPurposeLIAllowed(p) { return false } } @@ -194,12 +200,18 @@ func (c *CoreString) IsVendorAllowedForFlexiblePurposesLI(id int, purposeIds ... } for _, r := range pr { - if r.IsVendorIncluded(id) { - if r.RestrictionType == RestrictionTypeNotAllowed { + if !r.IsVendorIncluded(id) { + continue + } + switch r.RestrictionType { + case RestrictionTypeNotAllowed: + return false + case RestrictionTypeRequireConsent: + if !c.IsVendorAllowed(id) || !c.IsPurposeAllowed(p) { return false - } else if r.RestrictionType == RestrictionTypeRequireConsent && (!c.IsVendorAllowed(id) || !c.IsPurposeAllowed(p)) { - return false - } else if !c.IsVendorLIAllowed(id) || !c.IsPurposeLIAllowed(p) { + } + case RestrictionTypeRequireLI: + if !c.IsVendorLIAllowed(id) || !c.IsPurposeLIAllowed(p) { return false } }