Skip to content

Commit 95b41b2

Browse files
committed
fix: respect the reason required org setting for ignore creation
1 parent b04124f commit 95b41b2

File tree

4 files changed

+317
-15
lines changed

4 files changed

+317
-15
lines changed

pkg/local_workflows/ignore_workflow/config.go

Lines changed: 69 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
"github.com/snyk/error-catalog-golang-public/cli"
1010
"github.com/snyk/go-application-framework/internal/api"
11+
"github.com/snyk/go-application-framework/internal/api/contract"
1112
policyApi "github.com/snyk/go-application-framework/internal/api/policy/2024-10-15"
1213
"github.com/snyk/go-application-framework/pkg/configuration"
1314
"github.com/snyk/go-application-framework/pkg/local_workflows/local_models"
@@ -40,26 +41,55 @@ func addCreateIgnoreDefaultConfigurationValues(invocationCtx workflow.Invocation
4041

4142
config.AddDefaultValue(ReasonKey, func(_ configuration.Configuration, existingValue interface{}) (interface{}, error) {
4243
isSet := config.IsSet(ReasonKey)
43-
return defaultFuncWithValidator(existingValue, isSet, isValidReason)
44+
reasonRequired := config.GetBool(ConfigIgnoreReasonRequired)
45+
return defaultFuncWithValidator(existingValue, isSet, getReasonValidator(reasonRequired))
4446
})
4547
}
4648

49+
func getOrgIgnoreSettings(engine workflow.Engine) (*contract.OrgSettingsResponse, error) {
50+
config := engine.GetConfiguration()
51+
org := config.GetString(configuration.ORGANIZATION)
52+
client := engine.GetNetworkAccess().GetHttpClient()
53+
url := config.GetString(configuration.API_URL)
54+
apiClient := api.NewApi(url, client)
55+
56+
settings, err := apiClient.GetOrgSettings(org)
57+
if err != nil {
58+
engine.GetLogger().Err(err).Msg("Failed to access settings.")
59+
return nil, err
60+
}
61+
62+
engine.GetConfiguration().Set(ConfigIgnoreSettings, settings)
63+
return settings, nil
64+
}
65+
66+
func getOrgIgnoreSettingsConfig(engine workflow.Engine) configuration.DefaultValueFunction {
67+
callback := func(_ configuration.Configuration, existingValue interface{}) (interface{}, error) {
68+
if existingValue != nil {
69+
return existingValue, nil
70+
}
71+
72+
response, err := getOrgIgnoreSettings(engine)
73+
if err != nil {
74+
engine.GetLogger().Err(err).Msg("Failed to access settings.")
75+
return nil, err
76+
}
77+
78+
return response, nil
79+
}
80+
return callback
81+
}
82+
4783
func getOrgIgnoreApprovalEnabled(engine workflow.Engine) configuration.DefaultValueFunction {
4884
return func(_ configuration.Configuration, existingValue interface{}) (interface{}, error) {
4985
if existingValue != nil {
5086
return existingValue, nil
5187
}
5288

53-
config := engine.GetConfiguration()
54-
org := config.GetString(configuration.ORGANIZATION)
55-
client := engine.GetNetworkAccess().GetHttpClient()
56-
url := config.GetString(configuration.API_URL)
57-
apiClient := api.NewApi(url, client)
58-
59-
settings, err := apiClient.GetOrgSettings(org)
89+
settings, err := getOrgIgnoreSettings(engine)
6090
if err != nil {
6191
engine.GetLogger().Err(err).Msg("Failed to access settings.")
62-
return nil, err
92+
return false, err
6393
}
6494

6595
if settings.Ignores != nil && settings.Ignores.ApprovalWorkflowEnabled {
@@ -70,6 +100,26 @@ func getOrgIgnoreApprovalEnabled(engine workflow.Engine) configuration.DefaultVa
70100
}
71101
}
72102

103+
func getOrgIgnoreReasonRequired(engine workflow.Engine) configuration.DefaultValueFunction {
104+
return func(_ configuration.Configuration, existingValue interface{}) (interface{}, error) {
105+
if existingValue != nil {
106+
return existingValue, nil
107+
}
108+
109+
settings, err := getOrgIgnoreSettings(engine)
110+
if err != nil {
111+
engine.GetLogger().Err(err).Msg("Failed to access settings.")
112+
return false, err
113+
}
114+
115+
if settings.Ignores != nil {
116+
return settings.Ignores.ReasonRequired, nil
117+
}
118+
119+
return false, nil
120+
}
121+
}
122+
73123
func remoteRepoUrlDefaultFunc(existingValue interface{}, config configuration.Configuration) (interface{}, error) {
74124
if existingValue != nil && existingValue != "" {
75125
return existingValue, nil
@@ -148,6 +198,16 @@ func isValidFindingsId(input string) error {
148198
return nil
149199
}
150200

201+
func getReasonValidator(reasonRequired bool) func(string) error {
202+
if reasonRequired {
203+
return isValidReason
204+
}
205+
206+
return func(input string) error {
207+
return nil
208+
}
209+
}
210+
151211
func isValidReason(input string) error {
152212
if input == "" {
153213
return cli.NewValidationFailureError("The ignore reason cannot be empty. Provide a justification for ignoring this finding.")

pkg/local_workflows/ignore_workflow/ignore_workflow.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ const (
6262
interactiveIgnoreRequestSubmissionMessage = "✅ Your ignore request has been submitted."
6363

6464
ConfigIgnoreApprovalEnabled = "internal_iaw_enabled"
65+
ConfigIgnoreReasonRequired = "internal_ignore_reason_required"
66+
ConfigIgnoreSettings = "internal_ignore_settings"
6567
)
6668

6769
var reasonPromptHelpMap = map[string]string{
@@ -90,7 +92,9 @@ func InitIgnoreWorkflows(engine workflow.Engine) error {
9092
return err
9193
}
9294

95+
engine.GetConfiguration().AddDefaultValue(ConfigIgnoreSettings, getOrgIgnoreSettingsConfig(engine))
9396
engine.GetConfiguration().AddDefaultValue(ConfigIgnoreApprovalEnabled, getOrgIgnoreApprovalEnabled(engine))
97+
engine.GetConfiguration().AddDefaultValue(ConfigIgnoreReasonRequired, getOrgIgnoreReasonRequired(engine))
9498

9599
return nil
96100
}
@@ -115,6 +119,11 @@ func ignoreCreateWorkflowEntryPoint(invocationCtx workflow.InvocationContext, _
115119
return nil, disabledError
116120
}
117121

122+
reasonRequired, reasonRequiredError := config.GetBoolWithError(ConfigIgnoreReasonRequired)
123+
if reasonRequiredError != nil {
124+
return nil, reasonRequiredError
125+
}
126+
118127
interactive := config.GetBool(InteractiveKey)
119128
addCreateIgnoreDefaultConfigurationValues(invocationCtx)
120129

@@ -184,7 +193,7 @@ func ignoreCreateWorkflowEntryPoint(invocationCtx workflow.InvocationContext, _
184193
if !ok {
185194
reasonHelp = reasonPromptHelp
186195
}
187-
reason, err = promptIfEmpty(reason, userInterface, reasonHelp, reasonDescription, isValidReason)
196+
reason, err = promptIfEmpty(reason, userInterface, reasonHelp, reasonDescription, getReasonValidator(reasonRequired))
188197
if err != nil {
189198
return nil, err
190199
}
@@ -213,7 +222,7 @@ func ignoreCreateWorkflowEntryPoint(invocationCtx workflow.InvocationContext, _
213222
return nil, cli.NewEmptyFlagOptionError("The expiration flag is required and cannot be empty. Provide it using the --expiration flag. The date format is YYYY-MM-DD or 'never' for no expiration.")
214223
}
215224

216-
if reason == "" {
225+
if reasonRequired && reason == "" {
217226
return nil, cli.NewEmptyFlagOptionError("The reason flag is required and cannot be empty. Provide it using the --reason flag.")
218227
}
219228

0 commit comments

Comments
 (0)