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