github.com/akamai/AkamaiOPEN-edgegrid-golang/v4@v4.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    []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  }