github.com/akamai/AkamaiOPEN-edgegrid-golang/v2@v2.17.0/pkg/appsec/security_policy_clone.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 SecurityPolicyClone interface supports cloning an existing security policy and retrieving
    13  	// existing security policies.
    14  	//
    15  	// https://developer.akamai.com/api/cloud_security/application_security/v1.html#securitypolicyclone
    16  	SecurityPolicyClone interface {
    17  		// https://developer.akamai.com/api/cloud_security/application_security/v1.html#getsecuritypolicies
    18  		GetSecurityPolicyClones(ctx context.Context, params GetSecurityPolicyClonesRequest) (*GetSecurityPolicyClonesResponse, error)
    19  
    20  		// https://developer.akamai.com/api/cloud_security/application_security/v1.html#getsecuritypolicies
    21  		GetSecurityPolicyClone(ctx context.Context, params GetSecurityPolicyCloneRequest) (*GetSecurityPolicyCloneResponse, error)
    22  
    23  		// https://developer.akamai.com/api/cloud_security/application_security/v1.html#postsecuritypolicies
    24  		CreateSecurityPolicyClone(ctx context.Context, params CreateSecurityPolicyCloneRequest) (*CreateSecurityPolicyCloneResponse, error)
    25  	}
    26  
    27  	// GetSecurityPolicyClonesRequest is used to retrieve the available security policies.
    28  	GetSecurityPolicyClonesRequest struct {
    29  		ConfigID int `json:"configId"`
    30  		Version  int `json:"version"`
    31  	}
    32  
    33  	// GetSecurityPolicyClonesResponse is returned from a call to GetSecurityPolicyClones.
    34  	GetSecurityPolicyClonesResponse struct {
    35  		ConfigID int `json:"configId"`
    36  		Version  int `json:"version"`
    37  		Policies []struct {
    38  			PolicyID                string `json:"policyId"`
    39  			PolicyName              string `json:"policyName"`
    40  			HasRatePolicyWithAPIKey bool   `json:"hasRatePolicyWithApiKey"`
    41  			PolicySecurityControls  struct {
    42  				ApplyApplicationLayerControls bool `json:"applyApplicationLayerControls"`
    43  				ApplyNetworkLayerControls     bool `json:"applyNetworkLayerControls"`
    44  				ApplyRateControls             bool `json:"applyRateControls"`
    45  				ApplyReputationControls       bool `json:"applyReputationControls"`
    46  				ApplyBotmanControls           bool `json:"applyBotmanControls"`
    47  				ApplyAPIConstraints           bool `json:"applyApiConstraints"`
    48  				ApplySlowPostControls         bool `json:"applySlowPostControls"`
    49  			} `json:"policySecurityControls"`
    50  		} `json:"policies"`
    51  	}
    52  
    53  	// GetSecurityPolicyCloneRequest is used to retrieve a security policy.
    54  	GetSecurityPolicyCloneRequest struct {
    55  		ConfigID int    `json:"configId"`
    56  		Version  int    `json:"version"`
    57  		PolicyID string `json:"policyId"`
    58  	}
    59  
    60  	// GetSecurityPolicyCloneResponse is returned from a call to GetSecurityPolicyClone.
    61  	GetSecurityPolicyCloneResponse struct {
    62  		ConfigID               int    `json:"configId,omitempty"`
    63  		PolicyID               string `json:"policyId,omitempty"`
    64  		PolicyName             string `json:"policyName,omitempty"`
    65  		PolicySecurityControls struct {
    66  			ApplyAPIConstraints           bool `json:"applyApiConstraints,omitempty"`
    67  			ApplyApplicationLayerControls bool `json:"applyApplicationLayerControls,omitempty"`
    68  			ApplyBotmanControls           bool `json:"applyBotmanControls,omitempty"`
    69  			ApplyNetworkLayerControls     bool `json:"applyNetworkLayerControls,omitempty"`
    70  			ApplyRateControls             bool `json:"applyRateControls,omitempty"`
    71  			ApplyReputationControls       bool `json:"applyReputationControls,omitempty"`
    72  			ApplySlowPostControls         bool `json:"applySlowPostControls,omitempty"`
    73  		} `json:"policySecurityControls,omitempty"`
    74  		Version int `json:"version,omitempty"`
    75  	}
    76  
    77  	// CreateSecurityPolicyCloneRequest is used to clone a security policy.
    78  	CreateSecurityPolicyCloneRequest struct {
    79  		ConfigID                 int    `json:"configId"`
    80  		Version                  int    `json:"version"`
    81  		CreateFromSecurityPolicy string `json:"createFromSecurityPolicy"`
    82  		PolicyName               string `json:"policyName"`
    83  		PolicyPrefix             string `json:"policyPrefix"`
    84  	}
    85  
    86  	// CreateSecurityPolicyCloneResponse is returned from a call to CreateSecurityPolicyClone.
    87  	CreateSecurityPolicyCloneResponse struct {
    88  		HasRatePolicyWithAPIKey bool   `json:"hasRatePolicyWithApiKey"`
    89  		PolicyID                string `json:"policyId"`
    90  		PolicyName              string `json:"policyName"`
    91  		PolicySecurityControls  struct {
    92  			ApplyAPIConstraints           bool `json:"applyApiConstraints"`
    93  			ApplyApplicationLayerControls bool `json:"applyApplicationLayerControls"`
    94  			ApplyBotmanControls           bool `json:"applyBotmanControls"`
    95  			ApplyNetworkLayerControls     bool `json:"applyNetworkLayerControls"`
    96  			ApplyRateControls             bool `json:"applyRateControls"`
    97  			ApplyReputationControls       bool `json:"applyReputationControls"`
    98  			ApplySlowPostControls         bool `json:"applySlowPostControls"`
    99  		}
   100  	}
   101  
   102  	// SecurityPolicyCloneResponse is currently unused.
   103  	SecurityPolicyCloneResponse struct {
   104  		ConfigID int        `json:"configId"`
   105  		Policies []Policies `json:"policies"`
   106  		Version  int        `json:"version"`
   107  	}
   108  
   109  	// Policies is used as part of a description of available security policies.
   110  	Policies struct {
   111  		HasRatePolicyWithAPIKey bool   `json:"hasRatePolicyWithApiKey"`
   112  		PolicyID                string `json:"policyId"`
   113  		PolicyName              string `json:"policyName"`
   114  		PolicySecurityControls  struct {
   115  			ApplyAPIConstraints           bool `json:"applyApiConstraints"`
   116  			ApplyApplicationLayerControls bool `json:"applyApplicationLayerControls"`
   117  			ApplyBotmanControls           bool `json:"applyBotmanControls"`
   118  			ApplyNetworkLayerControls     bool `json:"applyNetworkLayerControls"`
   119  			ApplyRateControls             bool `json:"applyRateControls"`
   120  			ApplyReputationControls       bool `json:"applyReputationControls"`
   121  			ApplySlowPostControls         bool `json:"applySlowPostControls"`
   122  		}
   123  	}
   124  
   125  	// CreateSecurityPolicyClonePost is currently unused.
   126  	CreateSecurityPolicyClonePost struct {
   127  		CreateFromSecurityPolicy string `json:"createFromSecurityPolicy"`
   128  		PolicyName               string `json:"policyName"`
   129  		PolicyPrefix             string `json:"policyPrefix"`
   130  	}
   131  
   132  	// CreateSecurityPolicyClonePostResponse is currently unused.
   133  	CreateSecurityPolicyClonePostResponse struct {
   134  		ConfigID               int    `json:"configId"`
   135  		PolicyID               string `json:"policyId"`
   136  		PolicyName             string `json:"policyName"`
   137  		PolicySecurityControls struct {
   138  			ApplyAPIConstraints           bool `json:"applyApiConstraints"`
   139  			ApplyApplicationLayerControls bool `json:"applyApplicationLayerControls"`
   140  			ApplyBotmanControls           bool `json:"applyBotmanControls"`
   141  			ApplyNetworkLayerControls     bool `json:"applyNetworkLayerControls"`
   142  			ApplyRateControls             bool `json:"applyRateControls"`
   143  			ApplyReputationControls       bool `json:"applyReputationControls"`
   144  			ApplySlowPostControls         bool `json:"applySlowPostControls"`
   145  		} `json:"policySecurityControls"`
   146  		Version int `json:"version"`
   147  	}
   148  )
   149  
   150  // Validate validates a GetSecurityPolicyCloneRequest.
   151  func (v GetSecurityPolicyCloneRequest) Validate() error {
   152  	return validation.Errors{
   153  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
   154  		"Version":  validation.Validate(v.Version, validation.Required),
   155  	}.Filter()
   156  }
   157  
   158  // Validate validates a GetSecurityPolicyClonesRequest.
   159  func (v GetSecurityPolicyClonesRequest) Validate() error {
   160  	return validation.Errors{
   161  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
   162  		"Version":  validation.Validate(v.Version, validation.Required),
   163  	}.Filter()
   164  }
   165  
   166  // Validate validates a CreateSecurityPolicyCloneRequest.
   167  func (v CreateSecurityPolicyCloneRequest) Validate() error {
   168  	return validation.Errors{
   169  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
   170  		"Version":  validation.Validate(v.Version, validation.Required),
   171  	}.Filter()
   172  }
   173  
   174  func (p *appsec) GetSecurityPolicyClone(ctx context.Context, params GetSecurityPolicyCloneRequest) (*GetSecurityPolicyCloneResponse, error) {
   175  	logger := p.Log(ctx)
   176  	logger.Debug("GetSecurityPolicyClone")
   177  
   178  	if err := params.Validate(); err != nil {
   179  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   180  	}
   181  
   182  	uri := fmt.Sprintf(
   183  		"/appsec/v1/configs/%d/versions/%d/security-policies/%s",
   184  		params.ConfigID,
   185  		params.Version,
   186  		params.PolicyID)
   187  
   188  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   189  	if err != nil {
   190  		return nil, fmt.Errorf("failed to create GetSecurityPolicyClone request: %w", err)
   191  	}
   192  
   193  	var results GetSecurityPolicyCloneResponse
   194  	resp, err := p.Exec(req, &results)
   195  	if err != nil {
   196  		return nil, fmt.Errorf("get security policy clone request failed: %w", err)
   197  	}
   198  	if resp.StatusCode != http.StatusOK {
   199  		return nil, p.Error(resp)
   200  	}
   201  
   202  	return &results, nil
   203  }
   204  
   205  func (p *appsec) GetSecurityPolicyClones(ctx context.Context, params GetSecurityPolicyClonesRequest) (*GetSecurityPolicyClonesResponse, error) {
   206  	logger := p.Log(ctx)
   207  	logger.Debug("GetSecurityPolicyClone")
   208  
   209  	if err := params.Validate(); err != nil {
   210  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   211  	}
   212  
   213  	uri := fmt.Sprintf(
   214  		"/appsec/v1/configs/%d/versions/%d/security-policies?detail=true&notMatched=false",
   215  		params.ConfigID,
   216  		params.Version)
   217  
   218  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   219  	if err != nil {
   220  		return nil, fmt.Errorf("failed to create GetSecurityPolicyClones request: %w", err)
   221  	}
   222  
   223  	var result GetSecurityPolicyClonesResponse
   224  	resp, err := p.Exec(req, &result)
   225  	if err != nil {
   226  		return nil, fmt.Errorf("get security policy clones request failed: %w", err)
   227  	}
   228  	if resp.StatusCode != http.StatusOK {
   229  		return nil, p.Error(resp)
   230  	}
   231  
   232  	return &result, nil
   233  }
   234  
   235  func (p *appsec) CreateSecurityPolicyClone(ctx context.Context, params CreateSecurityPolicyCloneRequest) (*CreateSecurityPolicyCloneResponse, error) {
   236  	logger := p.Log(ctx)
   237  	logger.Debug("CreateSecurityPolicyClone")
   238  
   239  	if err := params.Validate(); err != nil {
   240  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   241  	}
   242  
   243  	uri := fmt.Sprintf(
   244  		"/appsec/v1/configs/%d/versions/%d/security-policies",
   245  		params.ConfigID,
   246  		params.Version)
   247  
   248  	req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil)
   249  	if err != nil {
   250  		return nil, fmt.Errorf("failed to create CreateSecurityPolicyClone request: %w", err)
   251  	}
   252  
   253  	var result CreateSecurityPolicyCloneResponse
   254  	resp, err := p.Exec(req, &result, params)
   255  	if err != nil {
   256  		return nil, fmt.Errorf("create security policy clone request failed: %w", err)
   257  	}
   258  	if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated {
   259  		return nil, p.Error(resp)
   260  	}
   261  
   262  	return &result, nil
   263  }