github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/appsec/penalty_box.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 PenaltyBox interface supports retrieving or modifying the penalty box settings for
    13  	// a specified security policy
    14  	PenaltyBox interface {
    15  		// GetPenaltyBoxes returns the penalty boxes settings for the security policy you specify.
    16  		//
    17  		// See: https://techdocs.akamai.com/application-security/reference/get-policy-penalty-box
    18  		// Deprecated: this method will be removed in a future release. Use GetPenaltyBox instead.
    19  		GetPenaltyBoxes(ctx context.Context, params GetPenaltyBoxesRequest) (*GetPenaltyBoxesResponse, error)
    20  
    21  		// GetPenaltyBox returns the penalty box settings for the security policy you specify.
    22  		//
    23  		// See: https://techdocs.akamai.com/application-security/reference/get-policy-penalty-box
    24  		GetPenaltyBox(ctx context.Context, params GetPenaltyBoxRequest) (*GetPenaltyBoxResponse, error)
    25  
    26  		// UpdatePenaltyBox modifies the penalty box settings for a security policy.
    27  		//
    28  		// See: https://techdocs.akamai.com/application-security/reference/put-policy-penalty-box
    29  		UpdatePenaltyBox(ctx context.Context, params UpdatePenaltyBoxRequest) (*UpdatePenaltyBoxResponse, error)
    30  	}
    31  
    32  	// GetPenaltyBoxesRequest is used to retrieve the penalty box settings.
    33  	// Deprecated: this struct will be removed in a future release.
    34  	GetPenaltyBoxesRequest struct {
    35  		ConfigID int    `json:"-"`
    36  		Version  int    `json:"-"`
    37  		PolicyID string `json:"-"`
    38  		Current  string `json:"current"`
    39  		Mode     string `json:"mode"`
    40  		Eval     string `json:"eval"`
    41  	}
    42  
    43  	// GetPenaltyBoxesResponse is returned from a call to GetPenaltyBoxes.
    44  	// Deprecated: this struct will be removed in a future release.
    45  	GetPenaltyBoxesResponse struct {
    46  		Action               string `json:"action,omitempty"`
    47  		PenaltyBoxProtection bool   `json:"penaltyBoxProtection,omitempty"`
    48  	}
    49  
    50  	// GetPenaltyBoxRequest is used to retrieve the penalty box settings.
    51  	GetPenaltyBoxRequest struct {
    52  		ConfigID             int    `json:"-"`
    53  		Version              int    `json:"-"`
    54  		PolicyID             string `json:"-"`
    55  		Action               string `json:"action"`
    56  		PenaltyBoxProtection bool   `json:"penaltyBoxProtection"`
    57  	}
    58  
    59  	// GetPenaltyBoxResponse is returned from a call to GetPenaltyBox.
    60  	GetPenaltyBoxResponse struct {
    61  		Action               string `json:"action"`
    62  		PenaltyBoxProtection bool   `json:"penaltyBoxProtection,omitempty"`
    63  	}
    64  
    65  	// UpdatePenaltyBoxRequest is used to modify the penalty box settings.
    66  	UpdatePenaltyBoxRequest struct {
    67  		ConfigID             int    `json:"-"`
    68  		Version              int    `json:"-"`
    69  		PolicyID             string `json:"-"`
    70  		Action               string `json:"action"`
    71  		PenaltyBoxProtection bool   `json:"penaltyBoxProtection"`
    72  	}
    73  
    74  	// UpdatePenaltyBoxResponse is returned from a call to UpdatePenaltyBox.
    75  	UpdatePenaltyBoxResponse struct {
    76  		Action               string `json:"action"`
    77  		PenaltyBoxProtection bool   `json:"penaltyBoxProtection"`
    78  	}
    79  )
    80  
    81  // Validate validates a GetPenaltyBoxRequest.
    82  func (v GetPenaltyBoxRequest) Validate() error {
    83  	return validation.Errors{
    84  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
    85  		"Version":  validation.Validate(v.Version, validation.Required),
    86  		"PolicyID": validation.Validate(v.PolicyID, validation.Required),
    87  	}.Filter()
    88  }
    89  
    90  // Validate validates a GetPenaltyBoxesRequest.
    91  // Deprecated: this method will be removed in a future release.
    92  func (v GetPenaltyBoxesRequest) Validate() error {
    93  	return validation.Errors{
    94  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
    95  		"Version":  validation.Validate(v.Version, validation.Required),
    96  		"PolicyID": validation.Validate(v.PolicyID, validation.Required),
    97  	}.Filter()
    98  }
    99  
   100  // Validate validates an UpdatePenaltyBoxRequest.
   101  func (v UpdatePenaltyBoxRequest) Validate() error {
   102  	return validation.Errors{
   103  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
   104  		"Version":  validation.Validate(v.Version, validation.Required),
   105  		"PolicyID": validation.Validate(v.PolicyID, validation.Required),
   106  		"Action": validation.Validate(v.Action, validation.Required, validation.In(string(ActionTypeAlert), string(ActionTypeDeny), string(ActionTypeNone)).Error(
   107  			fmt.Sprintf("value '%s' is invalid. Must be one of: 'alert', 'deny' or 'none'", v.Action))),
   108  	}.Filter()
   109  }
   110  
   111  func (p *appsec) GetPenaltyBox(ctx context.Context, params GetPenaltyBoxRequest) (*GetPenaltyBoxResponse, error) {
   112  	logger := p.Log(ctx)
   113  	logger.Debug("GetPenaltyBox")
   114  
   115  	if err := params.Validate(); err != nil {
   116  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   117  	}
   118  
   119  	uri := fmt.Sprintf(
   120  		"/appsec/v1/configs/%d/versions/%d/security-policies/%s/penalty-box",
   121  		params.ConfigID,
   122  		params.Version,
   123  		params.PolicyID)
   124  
   125  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   126  	if err != nil {
   127  		return nil, fmt.Errorf("failed to create GetPenaltyBox request: %w", err)
   128  	}
   129  
   130  	var result GetPenaltyBoxResponse
   131  	resp, err := p.Exec(req, &result)
   132  	if err != nil {
   133  		return nil, fmt.Errorf("get penalty box request failed: %w", err)
   134  	}
   135  	if resp.StatusCode != http.StatusOK {
   136  		return nil, p.Error(resp)
   137  	}
   138  
   139  	return &result, nil
   140  }
   141  
   142  // Deprecated: this method will be removed in a future release.
   143  func (p *appsec) GetPenaltyBoxes(ctx context.Context, params GetPenaltyBoxesRequest) (*GetPenaltyBoxesResponse, error) {
   144  	logger := p.Log(ctx)
   145  	logger.Debug("GetPenaltyBoxes")
   146  
   147  	if err := params.Validate(); err != nil {
   148  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   149  	}
   150  
   151  	var result GetPenaltyBoxesResponse
   152  
   153  	uri := fmt.Sprintf(
   154  		"/appsec/v1/configs/%d/versions/%d/security-policies/%s/penalty-box",
   155  		params.ConfigID,
   156  		params.Version,
   157  		params.PolicyID)
   158  
   159  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   160  	if err != nil {
   161  		return nil, fmt.Errorf("failed to create GetPenaltyBoxes request: %w", err)
   162  	}
   163  
   164  	resp, err := p.Exec(req, &result)
   165  	if err != nil {
   166  		return nil, fmt.Errorf("get penalty boxes request failed: %w", err)
   167  	}
   168  	if resp.StatusCode != http.StatusOK {
   169  		return nil, p.Error(resp)
   170  	}
   171  
   172  	return &result, nil
   173  }
   174  
   175  func (p *appsec) UpdatePenaltyBox(ctx context.Context, params UpdatePenaltyBoxRequest) (*UpdatePenaltyBoxResponse, error) {
   176  	logger := p.Log(ctx)
   177  	logger.Debug("UpdatePenaltyBox")
   178  
   179  	if err := params.Validate(); err != nil {
   180  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   181  	}
   182  
   183  	uri := fmt.Sprintf(
   184  		"/appsec/v1/configs/%d/versions/%d/security-policies/%s/penalty-box",
   185  		params.ConfigID,
   186  		params.Version,
   187  		params.PolicyID,
   188  	)
   189  
   190  	req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri, nil)
   191  	if err != nil {
   192  		return nil, fmt.Errorf("failed to create UpdatePenaltyBox request: %w", err)
   193  	}
   194  
   195  	var result UpdatePenaltyBoxResponse
   196  	resp, err := p.Exec(req, &result, params)
   197  	if err != nil {
   198  		return nil, fmt.Errorf("update penalty box request failed: %w", err)
   199  	}
   200  	if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated {
   201  		return nil, p.Error(resp)
   202  	}
   203  
   204  	return &result, nil
   205  }