github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/appsec/eval_group.go (about)

     1  package appsec
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"net/http"
     7  )
     8  
     9  type (
    10  	// The EvalGroup interface supports creating, modifying and retrieving attack groups for evaluation.
    11  	EvalGroup interface {
    12  		// GetEvalGroups retrieves all attack groups currently under evaluation.
    13  		//
    14  		// See: https://techdocs.akamai.com/application-security/reference/get-policy-eval-groups
    15  		GetEvalGroups(ctx context.Context, params GetAttackGroupsRequest) (*GetAttackGroupsResponse, error)
    16  
    17  		// GetEvalGroup retrieves a specific attack group currently under evaluation.
    18  		//
    19  		// See: https://techdocs.akamai.com/application-security/reference/get-policy-eval-group
    20  		GetEvalGroup(ctx context.Context, params GetAttackGroupRequest) (*GetAttackGroupResponse, error)
    21  
    22  		// UpdateEvalGroup supports updating the condition and exception information for an attack group under evaluation.
    23  		//
    24  		// See: https://techdocs.akamai.com/application-security/reference/put-eval-group
    25  		UpdateEvalGroup(ctx context.Context, params UpdateAttackGroupRequest) (*UpdateAttackGroupResponse, error)
    26  	}
    27  )
    28  
    29  func (p *appsec) GetEvalGroup(ctx context.Context, params GetAttackGroupRequest) (*GetAttackGroupResponse, error) {
    30  	logger := p.Log(ctx)
    31  	logger.Debug("GetEvalGroup")
    32  
    33  	if err := params.Validate(); err != nil {
    34  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
    35  	}
    36  
    37  	uri := fmt.Sprintf(
    38  		"/appsec/v1/configs/%d/versions/%d/security-policies/%s/eval-groups/%s?includeConditionException=true",
    39  		params.ConfigID,
    40  		params.Version,
    41  		params.PolicyID,
    42  		params.Group)
    43  
    44  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
    45  	if err != nil {
    46  		return nil, fmt.Errorf("failed to create GetEvalGroup request: %w", err)
    47  	}
    48  
    49  	var result GetAttackGroupResponse
    50  	resp, err := p.Exec(req, &result)
    51  	if err != nil {
    52  		return nil, fmt.Errorf("get eval group request failed: %w", err)
    53  	}
    54  	if resp.StatusCode != http.StatusOK {
    55  		return nil, p.Error(resp)
    56  	}
    57  
    58  	return &result, nil
    59  }
    60  
    61  func (p *appsec) GetEvalGroups(ctx context.Context, params GetAttackGroupsRequest) (*GetAttackGroupsResponse, error) {
    62  	logger := p.Log(ctx)
    63  	logger.Debug("GetEvalGroups")
    64  
    65  	if err := params.Validate(); err != nil {
    66  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
    67  	}
    68  
    69  	uri := fmt.Sprintf(
    70  		"/appsec/v1/configs/%d/versions/%d/security-policies/%s/eval-groups?includeConditionException=true",
    71  		params.ConfigID,
    72  		params.Version,
    73  		params.PolicyID)
    74  
    75  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
    76  	if err != nil {
    77  		return nil, fmt.Errorf("failed to create GetEvalGroups request: %w", err)
    78  	}
    79  
    80  	var result GetAttackGroupsResponse
    81  	resp, err := p.Exec(req, &result)
    82  	if err != nil {
    83  		return nil, fmt.Errorf("get eval groups request failed: %w", err)
    84  	}
    85  	if resp.StatusCode != http.StatusOK {
    86  		return nil, p.Error(resp)
    87  	}
    88  
    89  	if params.Group != "" {
    90  		var filteredResult GetAttackGroupsResponse
    91  		for k, val := range result.AttackGroups {
    92  			if val.Group == params.Group {
    93  				filteredResult.AttackGroups = append(filteredResult.AttackGroups, result.AttackGroups[k])
    94  			}
    95  		}
    96  		return &filteredResult, nil
    97  	}
    98  
    99  	return &result, nil
   100  }
   101  
   102  func (p *appsec) UpdateEvalGroup(ctx context.Context, params UpdateAttackGroupRequest) (*UpdateAttackGroupResponse, error) {
   103  	logger := p.Log(ctx)
   104  	logger.Debug("UpdateEvalGroup")
   105  
   106  	if err := params.Validate(); err != nil {
   107  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   108  	}
   109  
   110  	uri := fmt.Sprintf(
   111  		"/appsec/v1/configs/%d/versions/%d/security-policies/%s/eval-groups/%s/action-condition-exception",
   112  		params.ConfigID,
   113  		params.Version,
   114  		params.PolicyID,
   115  		params.Group,
   116  	)
   117  
   118  	req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri, nil)
   119  	if err != nil {
   120  		return nil, fmt.Errorf("failed to create UpdateEvalGroup request: %w", err)
   121  	}
   122  
   123  	var result UpdateAttackGroupResponse
   124  	resp, err := p.Exec(req, &result, params)
   125  	if err != nil {
   126  		return nil, fmt.Errorf("update eval group request failed: %w", err)
   127  	}
   128  	if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated {
   129  		return nil, p.Error(resp)
   130  	}
   131  
   132  	return &result, nil
   133  }