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  }