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