github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/appsec/reputation_analysis.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 ReputationAnalysis interface supports retrieving and modifying the reputation analysis
    13  	// settings for a configuration and policy.
    14  	ReputationAnalysis interface {
    15  		// GetReputationAnalysis returns the current reputation analysis settings.
    16  		//
    17  		// See: https://techdocs.akamai.com/application-security/reference/get-reputation-analysis
    18  		GetReputationAnalysis(ctx context.Context, params GetReputationAnalysisRequest) (*GetReputationAnalysisResponse, error)
    19  
    20  		// UpdateReputationAnalysis updates the reputation analysis settings.
    21  		//
    22  		// See: https://techdocs.akamai.com/application-security/reference/put-reputation-analysis
    23  		UpdateReputationAnalysis(ctx context.Context, params UpdateReputationAnalysisRequest) (*UpdateReputationAnalysisResponse, error)
    24  
    25  		// RemoveReputationAnalysis removes the reputation analysis settings.
    26  		//
    27  		// See: https://techdocs.akamai.com/application-security/reference/put-reputation-analysis
    28  		RemoveReputationAnalysis(ctx context.Context, params RemoveReputationAnalysisRequest) (*RemoveReputationAnalysisResponse, error)
    29  	}
    30  
    31  	// GetReputationAnalysisRequest is used to retrieve the reputation analysis settings for a security policy.
    32  	GetReputationAnalysisRequest struct {
    33  		ConfigID int    `json:"configId"`
    34  		Version  int    `json:"version"`
    35  		PolicyID string `json:"policyId"`
    36  	}
    37  
    38  	// GetReputationAnalysisResponse is returned from a call to GetReputationAnalysis.
    39  	GetReputationAnalysisResponse struct {
    40  		ConfigID                           int    `json:"-"`
    41  		Version                            int    `json:"-"`
    42  		PolicyID                           string `json:"-"`
    43  		ForwardToHTTPHeader                bool   `json:"forwardToHTTPHeader"`
    44  		ForwardSharedIPToHTTPHeaderAndSIEM bool   `json:"forwardSharedIPToHTTPHeaderAndSIEM"`
    45  	}
    46  
    47  	// UpdateReputationAnalysisRequest is used to modify the reputation analysis settings for a security poliyc.
    48  	UpdateReputationAnalysisRequest struct {
    49  		ConfigID                           int    `json:"-"`
    50  		Version                            int    `json:"-"`
    51  		PolicyID                           string `json:"-"`
    52  		ForwardToHTTPHeader                bool   `json:"forwardToHTTPHeader"`
    53  		ForwardSharedIPToHTTPHeaderAndSIEM bool   `json:"forwardSharedIPToHTTPHeaderAndSIEM"`
    54  	}
    55  
    56  	// UpdateReputationAnalysisResponse is returned from a call to UpdateReputationAnalysis.
    57  	UpdateReputationAnalysisResponse struct {
    58  		ForwardToHTTPHeader                bool `json:"forwardToHTTPHeader"`
    59  		ForwardSharedIPToHTTPHeaderAndSIEM bool `json:"forwardSharedIPToHTTPHeaderAndSIEM"`
    60  	}
    61  
    62  	// RemoveReputationAnalysisRequest is used to remove the reputation analysis settings for a security policy.
    63  	RemoveReputationAnalysisRequest struct {
    64  		ConfigID                           int    `json:"-"`
    65  		Version                            int    `json:"-"`
    66  		PolicyID                           string `json:"-"`
    67  		ForwardToHTTPHeader                bool   `json:"forwardToHTTPHeader"`
    68  		ForwardSharedIPToHTTPHeaderAndSIEM bool   `json:"forwardSharedIPToHTTPHeaderAndSIEM"`
    69  	}
    70  
    71  	// RemoveReputationAnalysisResponse is returned from a call to RemoveReputationAnalysis.
    72  	RemoveReputationAnalysisResponse struct {
    73  		ForwardToHTTPHeader                bool `json:"forwardToHTTPHeader"`
    74  		ForwardSharedIPToHTTPHeaderAndSIEM bool `json:"forwardSharedIPToHTTPHeaderAndSIEM"`
    75  	}
    76  )
    77  
    78  // Validate validates a GetReputationAnalysisRequest.
    79  func (v GetReputationAnalysisRequest) Validate() error {
    80  	return validation.Errors{
    81  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
    82  		"Version":  validation.Validate(v.Version, validation.Required),
    83  		"PolicyID": validation.Validate(v.PolicyID, validation.Required),
    84  	}.Filter()
    85  }
    86  
    87  // Validate validates an UpdateReputationAnalysisRequest.
    88  func (v UpdateReputationAnalysisRequest) Validate() error {
    89  	return validation.Errors{
    90  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
    91  		"Version":  validation.Validate(v.Version, validation.Required),
    92  		"PolicyID": validation.Validate(v.PolicyID, validation.Required),
    93  	}.Filter()
    94  }
    95  
    96  // Validate validates a RemoveReputationAnalysisRequest.
    97  func (v RemoveReputationAnalysisRequest) Validate() error {
    98  	return validation.Errors{
    99  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
   100  		"Version":  validation.Validate(v.Version, validation.Required),
   101  		"PolicyID": validation.Validate(v.PolicyID, validation.Required),
   102  	}.Filter()
   103  }
   104  
   105  func (p *appsec) GetReputationAnalysis(ctx context.Context, params GetReputationAnalysisRequest) (*GetReputationAnalysisResponse, error) {
   106  	logger := p.Log(ctx)
   107  	logger.Debug("GetReputationAnalysis")
   108  
   109  	if err := params.Validate(); err != nil {
   110  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   111  	}
   112  
   113  	uri := fmt.Sprintf(
   114  		"/appsec/v1/configs/%d/versions/%d/security-policies/%s/reputation-analysis",
   115  		params.ConfigID,
   116  		params.Version,
   117  		params.PolicyID)
   118  
   119  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   120  	if err != nil {
   121  		return nil, fmt.Errorf("failed to create GetReputationAnalysis request: %w", err)
   122  	}
   123  
   124  	var result GetReputationAnalysisResponse
   125  	resp, err := p.Exec(req, &result)
   126  	if err != nil {
   127  		return nil, fmt.Errorf("get reputation analysis request failed: %w", err)
   128  	}
   129  	if resp.StatusCode != http.StatusOK {
   130  		return nil, p.Error(resp)
   131  	}
   132  
   133  	return &result, nil
   134  }
   135  
   136  func (p *appsec) UpdateReputationAnalysis(ctx context.Context, params UpdateReputationAnalysisRequest) (*UpdateReputationAnalysisResponse, error) {
   137  	logger := p.Log(ctx)
   138  	logger.Debug("UpdateReputationAnalysis")
   139  
   140  	if err := params.Validate(); err != nil {
   141  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   142  	}
   143  
   144  	uri := fmt.Sprintf(
   145  		"/appsec/v1/configs/%d/versions/%d/security-policies/%s/reputation-analysis",
   146  		params.ConfigID,
   147  		params.Version,
   148  		params.PolicyID,
   149  	)
   150  
   151  	req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri, nil)
   152  	if err != nil {
   153  		return nil, fmt.Errorf("failed to create UpdateReputationAnalysis request: %w", err)
   154  	}
   155  
   156  	var result UpdateReputationAnalysisResponse
   157  	resp, err := p.Exec(req, &result, params)
   158  	if err != nil {
   159  		return nil, fmt.Errorf("update reputation analysis request failed: %w", err)
   160  	}
   161  	if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated {
   162  		return nil, p.Error(resp)
   163  	}
   164  
   165  	return &result, nil
   166  }
   167  
   168  func (p *appsec) RemoveReputationAnalysis(ctx context.Context, params RemoveReputationAnalysisRequest) (*RemoveReputationAnalysisResponse, error) {
   169  	logger := p.Log(ctx)
   170  	logger.Debug("RemoveReputationAnalysis")
   171  
   172  	uri := fmt.Sprintf(
   173  		"/appsec/v1/configs/%d/versions/%d/security-policies/%s/reputation-analysis",
   174  		params.ConfigID,
   175  		params.Version,
   176  		params.PolicyID,
   177  	)
   178  
   179  	req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri, nil)
   180  	if err != nil {
   181  		return nil, fmt.Errorf("failed to create RemoveReputationAnalysis request: %w", err)
   182  	}
   183  
   184  	var result RemoveReputationAnalysisResponse
   185  	resp, err := p.Exec(req, &result, params)
   186  	if err != nil {
   187  		return nil, fmt.Errorf("remove reputation analysis 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  }