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