github.com/akamai/AkamaiOPEN-edgegrid-golang/v2@v2.17.0/pkg/appsec/malware_policy.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 MalwarePolicy interface supports creating, retrieving, updating and removing malware protection policies. 13 MalwarePolicy interface { 14 // CreateMalwarePolicy creates a new malware protection policy. 15 // 16 // See: https://techdocs.akamai.com/application-security/reference/post-malware-policies 17 CreateMalwarePolicy(ctx context.Context, params CreateMalwarePolicyRequest) (*MalwarePolicyResponse, error) 18 19 // GetMalwarePolicy retrieves an existing malware protection policy. 20 // 21 // See: https://techdocs.akamai.com/application-security/reference/get-malware-policy 22 GetMalwarePolicy(ctx context.Context, params GetMalwarePolicyRequest) (*MalwarePolicyResponse, error) 23 24 // GetMalwarePolicies retrieves the existing malware protection policies for a configuration. 25 // 26 // See: https://techdocs.akamai.com/application-security/reference/get-malware-policies 27 GetMalwarePolicies(ctx context.Context, params GetMalwarePoliciesRequest) (*MalwarePoliciesResponse, error) 28 29 // UpdateMalwarePolicy modifies an existing malware protection policy. 30 // 31 // See: https://techdocs.akamai.com/application-security/reference/put-malware-policy 32 UpdateMalwarePolicy(ctx context.Context, params UpdateMalwarePolicyRequest) (*MalwarePolicyResponse, error) 33 34 // RemoveMalwarePolicy removes a malware protection policy. 35 // 36 // See: https://techdocs.akamai.com/application-security/reference/delete-malware-policy 37 RemoveMalwarePolicy(ctx context.Context, params RemoveMalwarePolicyRequest) error 38 } 39 40 // MalwarePolicyBody describes a malware policy. 41 MalwarePolicyBody struct { 42 MalwarePolicyID int `json:"id"` 43 Name string `json:"name"` 44 Description string `json:"description,omitempty"` 45 Hostnames []string `json:"hostnames"` 46 Paths []string `json:"paths"` 47 ContentTypes []string `json:"contentTypes"` 48 } 49 50 // CreateMalwarePolicyRequest is used to create a malware policy. 51 CreateMalwarePolicyRequest struct { 52 ConfigID int 53 ConfigVersion int 54 Policy *MalwarePolicyBody 55 } 56 57 // MalwarePolicyResponse is returned from a call to CreateMalwarePolicy 58 MalwarePolicyResponse struct { 59 MalwarePolicyID int `json:"id"` 60 Name string `json:"name"` 61 Description string `json:"description,omitempty"` 62 Hostnames []string `json:"hostnames"` 63 Paths []string `json:"paths"` 64 ContentTypes []string `json:"contentTypes"` 65 } 66 67 // GetMalwarePolicyRequest is used to retrieve an existing malware policy. 68 GetMalwarePolicyRequest struct { 69 ConfigID int 70 ConfigVersion int 71 MalwarePolicyID int 72 } 73 74 // GetMalwarePoliciesRequest is used to retrieve the malware policies for a configuration. 75 GetMalwarePoliciesRequest struct { 76 ConfigID int 77 ConfigVersion int 78 MalwarePolicyID int 79 } 80 81 // MalwarePoliciesResponse is returned from a call to GetMalwarePolicies. 82 MalwarePoliciesResponse struct { 83 MalwarePolicies []MalwarePolicyResponse 84 } 85 86 // UpdateMalwarePolicyRequest is used to update an existing malware policy. 87 UpdateMalwarePolicyRequest struct { 88 ConfigID int 89 ConfigVersion int 90 MalwarePolicyID int 91 Policy *MalwarePolicyBody 92 } 93 94 // RemoveMalwarePolicyRequest is used to remove a malware policy. 95 RemoveMalwarePolicyRequest struct { 96 ConfigID int 97 ConfigVersion int 98 MalwarePolicyID int 99 } 100 ) 101 102 // Validate validates a GetMalwarePolicyRequest. 103 func (v GetMalwarePolicyRequest) Validate() error { 104 return validation.Errors{ 105 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 106 "ConfigVersion": validation.Validate(v.ConfigVersion, validation.Required), 107 "MalwarePolicyID": validation.Validate(v.MalwarePolicyID, validation.Required), 108 }.Filter() 109 } 110 111 // Validate validates a GetMalwarePolicysRequest. 112 func (v GetMalwarePoliciesRequest) Validate() error { 113 return validation.Errors{ 114 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 115 "ConfigVersion": validation.Validate(v.ConfigVersion, validation.Required), 116 }.Filter() 117 } 118 119 // Validate validates a CreateMalwarePolicyRequest. 120 func (v CreateMalwarePolicyRequest) Validate() error { 121 return validation.Errors{ 122 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 123 "ConfigVersion": validation.Validate(v.ConfigVersion, validation.Required), 124 "Policy": validation.Validate(v.Policy, validation.Required), 125 }.Filter() 126 } 127 128 // Validate validates an UpdateMalwarePolicyRequest. 129 func (v UpdateMalwarePolicyRequest) Validate() error { 130 return validation.Errors{ 131 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 132 "ConfigVersion": validation.Validate(v.ConfigVersion, validation.Required), 133 "MalwarePolicyID": validation.Validate(v.MalwarePolicyID, validation.Required), 134 "Policy": validation.Validate(v.Policy, validation.Required), 135 }.Filter() 136 } 137 138 // Validate validates a RemoveMalwarePolicyRequest. 139 func (v RemoveMalwarePolicyRequest) Validate() error { 140 return validation.Errors{ 141 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 142 "ConfigVersion": validation.Validate(v.ConfigVersion, validation.Required), 143 "MalwarePolicyID": validation.Validate(v.MalwarePolicyID, validation.Required), 144 }.Filter() 145 } 146 147 func (p *appsec) CreateMalwarePolicy(ctx context.Context, params CreateMalwarePolicyRequest) (*MalwarePolicyResponse, error) { 148 logger := p.Log(ctx) 149 logger.Debug("CreateMalwarePolicy") 150 151 if err := params.Validate(); err != nil { 152 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 153 } 154 155 uri := fmt.Sprintf( 156 "/appsec/v1/configs/%d/versions/%d/malware-policies", 157 params.ConfigID, 158 params.ConfigVersion, 159 ) 160 161 req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil) 162 if err != nil { 163 return nil, fmt.Errorf("failed to create CreateMalwarePolicy request: %w", err) 164 } 165 166 var result MalwarePolicyResponse 167 resp, err := p.Exec(req, &result, params.Policy) 168 if err != nil { 169 return nil, fmt.Errorf("create malware policy request failed: %w", err) 170 } 171 if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { 172 return nil, p.Error(resp) 173 } 174 175 return &result, nil 176 } 177 178 func (p *appsec) GetMalwarePolicy(ctx context.Context, params GetMalwarePolicyRequest) (*MalwarePolicyResponse, error) { 179 logger := p.Log(ctx) 180 logger.Debug("GetMalwarePolicy") 181 182 if err := params.Validate(); err != nil { 183 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 184 } 185 186 uri := fmt.Sprintf( 187 "/appsec/v1/configs/%d/versions/%d/malware-policies/%d", 188 params.ConfigID, 189 params.ConfigVersion, 190 params.MalwarePolicyID) 191 192 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 193 if err != nil { 194 return nil, fmt.Errorf("failed to create GetMalwarePolicy request: %w", err) 195 } 196 197 var result MalwarePolicyResponse 198 resp, err := p.Exec(req, &result) 199 if err != nil { 200 return nil, fmt.Errorf("get malware policy request failed: %w", err) 201 } 202 if resp.StatusCode != http.StatusOK { 203 return nil, p.Error(resp) 204 } 205 206 return &result, nil 207 } 208 209 func (p *appsec) GetMalwarePolicies(ctx context.Context, params GetMalwarePoliciesRequest) (*MalwarePoliciesResponse, error) { 210 logger := p.Log(ctx) 211 logger.Debug("GetMalwarePolicies") 212 213 if err := params.Validate(); err != nil { 214 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 215 } 216 217 uri := fmt.Sprintf( 218 "/appsec/v1/configs/%d/versions/%d/malware-policies", 219 params.ConfigID, 220 params.ConfigVersion, 221 ) 222 223 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 224 if err != nil { 225 return nil, fmt.Errorf("failed to create GetMalwarePolicies request: %w", err) 226 } 227 228 var result MalwarePoliciesResponse 229 resp, err := p.Exec(req, &result) 230 if err != nil { 231 return nil, fmt.Errorf("get malware policies request failed: %w", err) 232 } 233 if resp.StatusCode != http.StatusOK { 234 return nil, p.Error(resp) 235 } 236 237 if params.MalwarePolicyID != 0 { 238 var filteredResult MalwarePoliciesResponse 239 for _, val := range result.MalwarePolicies { 240 if val.MalwarePolicyID == params.MalwarePolicyID { 241 filteredResult.MalwarePolicies = append(filteredResult.MalwarePolicies, val) 242 } 243 } 244 return &filteredResult, nil 245 } 246 247 return &result, nil 248 } 249 250 func (p *appsec) UpdateMalwarePolicy(ctx context.Context, params UpdateMalwarePolicyRequest) (*MalwarePolicyResponse, error) { 251 logger := p.Log(ctx) 252 logger.Debug("UpdateMalwarePolicy") 253 254 if err := params.Validate(); err != nil { 255 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 256 } 257 258 uri := fmt.Sprintf( 259 "/appsec/v1/configs/%d/versions/%d/malware-policies/%d", 260 params.ConfigID, 261 params.ConfigVersion, 262 params.MalwarePolicyID, 263 ) 264 265 req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri, nil) 266 if err != nil { 267 return nil, fmt.Errorf("failed to create UpdateMalwarePolicy request: %w", err) 268 } 269 req.Header.Set("Content-Type", "application/json") 270 271 var result MalwarePolicyResponse 272 resp, err := p.Exec(req, &result, params.Policy) 273 if err != nil { 274 return nil, fmt.Errorf("update malware policy request failed: %w", err) 275 } 276 if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { 277 return nil, p.Error(resp) 278 } 279 280 return &result, nil 281 } 282 283 func (p *appsec) RemoveMalwarePolicy(ctx context.Context, params RemoveMalwarePolicyRequest) error { 284 logger := p.Log(ctx) 285 logger.Debug("RemoveMalwarePolicy") 286 287 if err := params.Validate(); err != nil { 288 return fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 289 } 290 291 uri := fmt.Sprintf("/appsec/v1/configs/%d/versions/%d/malware-policies/%d", params.ConfigID, params.ConfigVersion, params.MalwarePolicyID) 292 req, err := http.NewRequestWithContext(ctx, http.MethodDelete, uri, nil) 293 if err != nil { 294 return fmt.Errorf("failed to create RemoveMalwarePolicy request: %w", err) 295 } 296 297 resp, err := p.Exec(req, nil) 298 if err != nil { 299 return fmt.Errorf("remove malware policy request failed: %w", err) 300 } 301 if resp.StatusCode != http.StatusNoContent && resp.StatusCode != http.StatusOK { 302 return p.Error(resp) 303 } 304 305 return nil 306 }