-
Notifications
You must be signed in to change notification settings - Fork 70
/
Copy pathpenalty_box.go
212 lines (176 loc) · 7.08 KB
/
penalty_box.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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
package appsec
import (
"context"
"fmt"
"net/http"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v9/pkg/session"
validation "github.com/go-ozzo/ozzo-validation/v4"
)
type (
// The PenaltyBox interface supports retrieving or modifying the penalty box settings for
// a specified security policy
PenaltyBox interface {
// GetPenaltyBoxes returns the penalty boxes settings for the security policy you specify.
//
// See: https://techdocs.akamai.com/application-security/reference/get-policy-penalty-box
// Deprecated: this method will be removed in a future release. Use GetPenaltyBox instead.
GetPenaltyBoxes(ctx context.Context, params GetPenaltyBoxesRequest) (*GetPenaltyBoxesResponse, error)
// GetPenaltyBox returns the penalty box settings for the security policy you specify.
//
// See: https://techdocs.akamai.com/application-security/reference/get-policy-penalty-box
GetPenaltyBox(ctx context.Context, params GetPenaltyBoxRequest) (*GetPenaltyBoxResponse, error)
// UpdatePenaltyBox modifies the penalty box settings for a security policy.
//
// See: https://techdocs.akamai.com/application-security/reference/put-policy-penalty-box
UpdatePenaltyBox(ctx context.Context, params UpdatePenaltyBoxRequest) (*UpdatePenaltyBoxResponse, error)
}
// GetPenaltyBoxesRequest is used to retrieve the penalty box settings.
// Deprecated: this struct will be removed in a future release.
GetPenaltyBoxesRequest struct {
ConfigID int `json:"-"`
Version int `json:"-"`
PolicyID string `json:"-"`
Current string `json:"current"`
Mode string `json:"mode"`
Eval string `json:"eval"`
}
// GetPenaltyBoxesResponse is returned from a call to GetPenaltyBoxes.
// Deprecated: this struct will be removed in a future release.
GetPenaltyBoxesResponse struct {
Action string `json:"action,omitempty"`
PenaltyBoxProtection bool `json:"penaltyBoxProtection,omitempty"`
}
// GetPenaltyBoxRequest is used to retrieve the penalty box settings.
GetPenaltyBoxRequest struct {
ConfigID int `json:"-"`
Version int `json:"-"`
PolicyID string `json:"-"`
Action string `json:"action"`
PenaltyBoxProtection bool `json:"penaltyBoxProtection"`
}
// GetPenaltyBoxResponse is returned from a call to GetPenaltyBox.
GetPenaltyBoxResponse struct {
Action string `json:"action"`
PenaltyBoxProtection bool `json:"penaltyBoxProtection,omitempty"`
}
// UpdatePenaltyBoxRequest is used to modify the penalty box settings.
UpdatePenaltyBoxRequest struct {
ConfigID int `json:"-"`
Version int `json:"-"`
PolicyID string `json:"-"`
Action string `json:"action"`
PenaltyBoxProtection bool `json:"penaltyBoxProtection"`
}
// UpdatePenaltyBoxResponse is returned from a call to UpdatePenaltyBox.
UpdatePenaltyBoxResponse struct {
Action string `json:"action"`
PenaltyBoxProtection bool `json:"penaltyBoxProtection"`
}
)
// Validate validates a GetPenaltyBoxRequest.
func (v GetPenaltyBoxRequest) Validate() error {
return validation.Errors{
"ConfigID": validation.Validate(v.ConfigID, validation.Required),
"Version": validation.Validate(v.Version, validation.Required),
"PolicyID": validation.Validate(v.PolicyID, validation.Required),
}.Filter()
}
// Validate validates a GetPenaltyBoxesRequest.
// Deprecated: this method will be removed in a future release.
func (v GetPenaltyBoxesRequest) Validate() error {
return validation.Errors{
"ConfigID": validation.Validate(v.ConfigID, validation.Required),
"Version": validation.Validate(v.Version, validation.Required),
"PolicyID": validation.Validate(v.PolicyID, validation.Required),
}.Filter()
}
// Validate validates an UpdatePenaltyBoxRequest.
func (v UpdatePenaltyBoxRequest) Validate() error {
return validation.Errors{
"ConfigID": validation.Validate(v.ConfigID, validation.Required),
"Version": validation.Validate(v.Version, validation.Required),
"PolicyID": validation.Validate(v.PolicyID, validation.Required),
"Action": validation.Validate(v.Action, validation.Required, validation.In(string(ActionTypeAlert), string(ActionTypeDeny), string(ActionTypeNone)).Error(
fmt.Sprintf("value '%s' is invalid. Must be one of: 'alert', 'deny' or 'none'", v.Action))),
}.Filter()
}
func (p *appsec) GetPenaltyBox(ctx context.Context, params GetPenaltyBoxRequest) (*GetPenaltyBoxResponse, error) {
logger := p.Log(ctx)
logger.Debug("GetPenaltyBox")
if err := params.Validate(); err != nil {
return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
}
uri := fmt.Sprintf(
"/appsec/v1/configs/%d/versions/%d/security-policies/%s/penalty-box",
params.ConfigID,
params.Version,
params.PolicyID)
req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
if err != nil {
return nil, fmt.Errorf("failed to create GetPenaltyBox request: %w", err)
}
var result GetPenaltyBoxResponse
resp, err := p.Exec(req, &result)
if err != nil {
return nil, fmt.Errorf("get penalty box request failed: %w", err)
}
defer session.CloseResponseBody(resp)
if resp.StatusCode != http.StatusOK {
return nil, p.Error(resp)
}
return &result, nil
}
// Deprecated: this method will be removed in a future release.
func (p *appsec) GetPenaltyBoxes(ctx context.Context, params GetPenaltyBoxesRequest) (*GetPenaltyBoxesResponse, error) {
logger := p.Log(ctx)
logger.Debug("GetPenaltyBoxes")
if err := params.Validate(); err != nil {
return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
}
var result GetPenaltyBoxesResponse
uri := fmt.Sprintf(
"/appsec/v1/configs/%d/versions/%d/security-policies/%s/penalty-box",
params.ConfigID,
params.Version,
params.PolicyID)
req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
if err != nil {
return nil, fmt.Errorf("failed to create GetPenaltyBoxes request: %w", err)
}
resp, err := p.Exec(req, &result)
if err != nil {
return nil, fmt.Errorf("get penalty boxes request failed: %w", err)
}
defer session.CloseResponseBody(resp)
if resp.StatusCode != http.StatusOK {
return nil, p.Error(resp)
}
return &result, nil
}
func (p *appsec) UpdatePenaltyBox(ctx context.Context, params UpdatePenaltyBoxRequest) (*UpdatePenaltyBoxResponse, error) {
logger := p.Log(ctx)
logger.Debug("UpdatePenaltyBox")
if err := params.Validate(); err != nil {
return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
}
uri := fmt.Sprintf(
"/appsec/v1/configs/%d/versions/%d/security-policies/%s/penalty-box",
params.ConfigID,
params.Version,
params.PolicyID,
)
req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri, nil)
if err != nil {
return nil, fmt.Errorf("failed to create UpdatePenaltyBox request: %w", err)
}
var result UpdatePenaltyBoxResponse
resp, err := p.Exec(req, &result, params)
if err != nil {
return nil, fmt.Errorf("update penalty box request failed: %w", err)
}
defer session.CloseResponseBody(resp)
if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated {
return nil, p.Error(resp)
}
return &result, nil
}