github.com/prebid/prebid-server@v0.275.0/privacy/activitycontrol.go (about) 1 package privacy 2 3 import ( 4 "github.com/prebid/prebid-server/config" 5 "github.com/prebid/prebid-server/openrtb_ext" 6 ) 7 8 type ActivityResult int 9 10 const ( 11 ActivityAbstain ActivityResult = iota 12 ActivityAllow 13 ActivityDeny 14 ) 15 16 const defaultActivityResult = true 17 18 func NewRequestFromPolicies(p Policies) ActivityRequest { 19 return ActivityRequest{policies: &p} 20 } 21 22 func NewRequestFromBidRequest(r openrtb_ext.RequestWrapper) ActivityRequest { 23 return ActivityRequest{bidRequest: &r} 24 } 25 26 type ActivityRequest struct { 27 policies *Policies 28 bidRequest *openrtb_ext.RequestWrapper 29 } 30 31 func (r ActivityRequest) IsPolicies() bool { 32 return r.policies != nil 33 } 34 35 func (r ActivityRequest) IsBidRequest() bool { 36 return r.bidRequest != nil 37 } 38 39 type ActivityControl struct { 40 plans map[Activity]ActivityPlan 41 } 42 43 func NewActivityControl(cfg *config.AccountPrivacy) ActivityControl { 44 ac := ActivityControl{} 45 46 if cfg == nil || cfg.AllowActivities == nil { 47 return ac 48 } 49 50 plans := make(map[Activity]ActivityPlan, 8) 51 plans[ActivitySyncUser] = buildPlan(cfg.AllowActivities.SyncUser) 52 plans[ActivityFetchBids] = buildPlan(cfg.AllowActivities.FetchBids) 53 plans[ActivityEnrichUserFPD] = buildPlan(cfg.AllowActivities.EnrichUserFPD) 54 plans[ActivityReportAnalytics] = buildPlan(cfg.AllowActivities.ReportAnalytics) 55 plans[ActivityTransmitUserFPD] = buildPlan(cfg.AllowActivities.TransmitUserFPD) 56 plans[ActivityTransmitPreciseGeo] = buildPlan(cfg.AllowActivities.TransmitPreciseGeo) 57 plans[ActivityTransmitUniqueRequestIDs] = buildPlan(cfg.AllowActivities.TransmitUniqueRequestIds) 58 plans[ActivityTransmitTIDs] = buildPlan(cfg.AllowActivities.TransmitTids) 59 ac.plans = plans 60 61 return ac 62 } 63 64 func buildPlan(activity config.Activity) ActivityPlan { 65 return ActivityPlan{ 66 rules: cfgToRules(activity.Rules), 67 defaultResult: cfgToDefaultResult(activity.Default), 68 } 69 } 70 71 func cfgToRules(rules []config.ActivityRule) []Rule { 72 var enfRules []Rule 73 74 for _, r := range rules { 75 result := ActivityDeny 76 if r.Allow { 77 result = ActivityAllow 78 } 79 80 er := ConditionRule{ 81 result: result, 82 componentName: r.Condition.ComponentName, 83 componentType: r.Condition.ComponentType, 84 } 85 enfRules = append(enfRules, er) 86 } 87 return enfRules 88 } 89 90 func cfgToDefaultResult(activityDefault *bool) bool { 91 if activityDefault == nil { 92 return defaultActivityResult 93 } 94 return *activityDefault 95 } 96 97 func (e ActivityControl) Allow(activity Activity, target Component, request ActivityRequest) bool { 98 plan, planDefined := e.plans[activity] 99 100 if !planDefined { 101 return defaultActivityResult 102 } 103 104 return plan.Evaluate(target, request) 105 } 106 107 type ActivityPlan struct { 108 defaultResult bool 109 rules []Rule 110 } 111 112 func (p ActivityPlan) Evaluate(target Component, request ActivityRequest) bool { 113 for _, rule := range p.rules { 114 result := rule.Evaluate(target, request) 115 if result == ActivityDeny || result == ActivityAllow { 116 return result == ActivityAllow 117 } 118 } 119 return p.defaultResult 120 }