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  }