github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/appsec/penalty_box.go (about) 1 package appsec 2 3 import ( 4 "context" 5 "fmt" 6 "net/http" 7 8 validation "github.com/go-ozzo/ozzo-validation/v4" 9 ) 10 11 type ( 12 // The PenaltyBox interface supports retrieving or modifying the penalty box settings for 13 // a specified security policy 14 PenaltyBox interface { 15 // GetPenaltyBoxes returns the penalty boxes settings for the security policy you specify. 16 // 17 // See: https://techdocs.akamai.com/application-security/reference/get-policy-penalty-box 18 // Deprecated: this method will be removed in a future release. Use GetPenaltyBox instead. 19 GetPenaltyBoxes(ctx context.Context, params GetPenaltyBoxesRequest) (*GetPenaltyBoxesResponse, error) 20 21 // GetPenaltyBox returns the penalty box settings for the security policy you specify. 22 // 23 // See: https://techdocs.akamai.com/application-security/reference/get-policy-penalty-box 24 GetPenaltyBox(ctx context.Context, params GetPenaltyBoxRequest) (*GetPenaltyBoxResponse, error) 25 26 // UpdatePenaltyBox modifies the penalty box settings for a security policy. 27 // 28 // See: https://techdocs.akamai.com/application-security/reference/put-policy-penalty-box 29 UpdatePenaltyBox(ctx context.Context, params UpdatePenaltyBoxRequest) (*UpdatePenaltyBoxResponse, error) 30 } 31 32 // GetPenaltyBoxesRequest is used to retrieve the penalty box settings. 33 // Deprecated: this struct will be removed in a future release. 34 GetPenaltyBoxesRequest struct { 35 ConfigID int `json:"-"` 36 Version int `json:"-"` 37 PolicyID string `json:"-"` 38 Current string `json:"current"` 39 Mode string `json:"mode"` 40 Eval string `json:"eval"` 41 } 42 43 // GetPenaltyBoxesResponse is returned from a call to GetPenaltyBoxes. 44 // Deprecated: this struct will be removed in a future release. 45 GetPenaltyBoxesResponse struct { 46 Action string `json:"action,omitempty"` 47 PenaltyBoxProtection bool `json:"penaltyBoxProtection,omitempty"` 48 } 49 50 // GetPenaltyBoxRequest is used to retrieve the penalty box settings. 51 GetPenaltyBoxRequest struct { 52 ConfigID int `json:"-"` 53 Version int `json:"-"` 54 PolicyID string `json:"-"` 55 Action string `json:"action"` 56 PenaltyBoxProtection bool `json:"penaltyBoxProtection"` 57 } 58 59 // GetPenaltyBoxResponse is returned from a call to GetPenaltyBox. 60 GetPenaltyBoxResponse struct { 61 Action string `json:"action"` 62 PenaltyBoxProtection bool `json:"penaltyBoxProtection,omitempty"` 63 } 64 65 // UpdatePenaltyBoxRequest is used to modify the penalty box settings. 66 UpdatePenaltyBoxRequest struct { 67 ConfigID int `json:"-"` 68 Version int `json:"-"` 69 PolicyID string `json:"-"` 70 Action string `json:"action"` 71 PenaltyBoxProtection bool `json:"penaltyBoxProtection"` 72 } 73 74 // UpdatePenaltyBoxResponse is returned from a call to UpdatePenaltyBox. 75 UpdatePenaltyBoxResponse struct { 76 Action string `json:"action"` 77 PenaltyBoxProtection bool `json:"penaltyBoxProtection"` 78 } 79 ) 80 81 // Validate validates a GetPenaltyBoxRequest. 82 func (v GetPenaltyBoxRequest) Validate() error { 83 return validation.Errors{ 84 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 85 "Version": validation.Validate(v.Version, validation.Required), 86 "PolicyID": validation.Validate(v.PolicyID, validation.Required), 87 }.Filter() 88 } 89 90 // Validate validates a GetPenaltyBoxesRequest. 91 // Deprecated: this method will be removed in a future release. 92 func (v GetPenaltyBoxesRequest) Validate() error { 93 return validation.Errors{ 94 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 95 "Version": validation.Validate(v.Version, validation.Required), 96 "PolicyID": validation.Validate(v.PolicyID, validation.Required), 97 }.Filter() 98 } 99 100 // Validate validates an UpdatePenaltyBoxRequest. 101 func (v UpdatePenaltyBoxRequest) Validate() error { 102 return validation.Errors{ 103 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 104 "Version": validation.Validate(v.Version, validation.Required), 105 "PolicyID": validation.Validate(v.PolicyID, validation.Required), 106 "Action": validation.Validate(v.Action, validation.Required, validation.In(string(ActionTypeAlert), string(ActionTypeDeny), string(ActionTypeNone)).Error( 107 fmt.Sprintf("value '%s' is invalid. Must be one of: 'alert', 'deny' or 'none'", v.Action))), 108 }.Filter() 109 } 110 111 func (p *appsec) GetPenaltyBox(ctx context.Context, params GetPenaltyBoxRequest) (*GetPenaltyBoxResponse, error) { 112 logger := p.Log(ctx) 113 logger.Debug("GetPenaltyBox") 114 115 if err := params.Validate(); err != nil { 116 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 117 } 118 119 uri := fmt.Sprintf( 120 "/appsec/v1/configs/%d/versions/%d/security-policies/%s/penalty-box", 121 params.ConfigID, 122 params.Version, 123 params.PolicyID) 124 125 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 126 if err != nil { 127 return nil, fmt.Errorf("failed to create GetPenaltyBox request: %w", err) 128 } 129 130 var result GetPenaltyBoxResponse 131 resp, err := p.Exec(req, &result) 132 if err != nil { 133 return nil, fmt.Errorf("get penalty box request failed: %w", err) 134 } 135 if resp.StatusCode != http.StatusOK { 136 return nil, p.Error(resp) 137 } 138 139 return &result, nil 140 } 141 142 // Deprecated: this method will be removed in a future release. 143 func (p *appsec) GetPenaltyBoxes(ctx context.Context, params GetPenaltyBoxesRequest) (*GetPenaltyBoxesResponse, error) { 144 logger := p.Log(ctx) 145 logger.Debug("GetPenaltyBoxes") 146 147 if err := params.Validate(); err != nil { 148 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 149 } 150 151 var result GetPenaltyBoxesResponse 152 153 uri := fmt.Sprintf( 154 "/appsec/v1/configs/%d/versions/%d/security-policies/%s/penalty-box", 155 params.ConfigID, 156 params.Version, 157 params.PolicyID) 158 159 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 160 if err != nil { 161 return nil, fmt.Errorf("failed to create GetPenaltyBoxes request: %w", err) 162 } 163 164 resp, err := p.Exec(req, &result) 165 if err != nil { 166 return nil, fmt.Errorf("get penalty boxes request failed: %w", err) 167 } 168 if resp.StatusCode != http.StatusOK { 169 return nil, p.Error(resp) 170 } 171 172 return &result, nil 173 } 174 175 func (p *appsec) UpdatePenaltyBox(ctx context.Context, params UpdatePenaltyBoxRequest) (*UpdatePenaltyBoxResponse, error) { 176 logger := p.Log(ctx) 177 logger.Debug("UpdatePenaltyBox") 178 179 if err := params.Validate(); err != nil { 180 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 181 } 182 183 uri := fmt.Sprintf( 184 "/appsec/v1/configs/%d/versions/%d/security-policies/%s/penalty-box", 185 params.ConfigID, 186 params.Version, 187 params.PolicyID, 188 ) 189 190 req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri, nil) 191 if err != nil { 192 return nil, fmt.Errorf("failed to create UpdatePenaltyBox request: %w", err) 193 } 194 195 var result UpdatePenaltyBoxResponse 196 resp, err := p.Exec(req, &result, params) 197 if err != nil { 198 return nil, fmt.Errorf("update penalty box request failed: %w", err) 199 } 200 if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { 201 return nil, p.Error(resp) 202 } 203 204 return &result, nil 205 }