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