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  }