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