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¬Matched=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 }