github.com/prebid/prebid-server@v0.275.0/privacy/enforcement.go (about)

     1  package privacy
     2  
     3  import (
     4  	"github.com/prebid/openrtb/v19/openrtb2"
     5  	"github.com/prebid/prebid-server/config"
     6  )
     7  
     8  // Enforcement represents the privacy policies to enforce for an OpenRTB bid request.
     9  type Enforcement struct {
    10  	CCPA    bool
    11  	COPPA   bool
    12  	GDPRGeo bool
    13  	GDPRID  bool
    14  	LMT     bool
    15  
    16  	// activities
    17  	UFPD       bool
    18  	Eids       bool
    19  	PreciseGeo bool
    20  	TID        bool
    21  }
    22  
    23  // Any returns true if at least one privacy policy requires enforcement.
    24  func (e Enforcement) AnyLegacy() bool {
    25  	return e.CCPA || e.COPPA || e.GDPRGeo || e.GDPRID || e.LMT
    26  }
    27  
    28  func (e Enforcement) AnyActivities() bool {
    29  	return e.UFPD || e.PreciseGeo || e.Eids || e.TID
    30  }
    31  
    32  // Apply cleans personally identifiable information from an OpenRTB bid request.
    33  func (e Enforcement) Apply(bidRequest *openrtb2.BidRequest, privacy config.AccountPrivacy) {
    34  	e.apply(bidRequest, NewScrubber(privacy.IPv6Config, privacy.IPv4Config))
    35  }
    36  
    37  func (e Enforcement) apply(bidRequest *openrtb2.BidRequest, scrubber Scrubber) {
    38  	if bidRequest != nil {
    39  		if e.AnyActivities() {
    40  			bidRequest = scrubber.ScrubRequest(bidRequest, e)
    41  		}
    42  		if e.AnyLegacy() && !(e.UFPD && e.PreciseGeo && e.Eids) {
    43  			bidRequest.User = scrubber.ScrubUser(bidRequest.User, e.getUserScrubStrategy(), e.getGeoScrubStrategy())
    44  		}
    45  		if e.AnyLegacy() && !(e.UFPD && e.PreciseGeo) {
    46  			bidRequest.Device = scrubber.ScrubDevice(bidRequest.Device, e.getDeviceIDScrubStrategy(), e.getIPv4ScrubStrategy(), e.getIPv6ScrubStrategy(), e.getGeoScrubStrategy())
    47  		}
    48  	}
    49  }
    50  
    51  func (e Enforcement) getDeviceIDScrubStrategy() ScrubStrategyDeviceID {
    52  	if e.COPPA || e.GDPRID || e.CCPA || e.LMT {
    53  		return ScrubStrategyDeviceIDAll
    54  	}
    55  
    56  	return ScrubStrategyDeviceIDNone
    57  }
    58  
    59  func (e Enforcement) getIPv4ScrubStrategy() ScrubStrategyIPV4 {
    60  	if e.COPPA || e.GDPRGeo || e.CCPA || e.LMT {
    61  		return ScrubStrategyIPV4Subnet
    62  	}
    63  
    64  	return ScrubStrategyIPV4None
    65  }
    66  
    67  func (e Enforcement) getIPv6ScrubStrategy() ScrubStrategyIPV6 {
    68  	if e.GDPRGeo || e.CCPA || e.LMT || e.COPPA {
    69  		return ScrubStrategyIPV6Subnet
    70  	}
    71  	return ScrubStrategyIPV6None
    72  }
    73  
    74  func (e Enforcement) getGeoScrubStrategy() ScrubStrategyGeo {
    75  	if e.COPPA {
    76  		return ScrubStrategyGeoFull
    77  	}
    78  
    79  	if e.GDPRGeo || e.CCPA || e.LMT {
    80  		return ScrubStrategyGeoReducedPrecision
    81  	}
    82  
    83  	return ScrubStrategyGeoNone
    84  }
    85  
    86  func (e Enforcement) getUserScrubStrategy() ScrubStrategyUser {
    87  	if e.COPPA || e.CCPA || e.LMT || e.GDPRID {
    88  		return ScrubStrategyUserIDAndDemographic
    89  	}
    90  
    91  	return ScrubStrategyUserNone
    92  }