Skip to content

Commit bd0d740

Browse files
authored
feat(delete): add --skip flag and confirmation prompt to all write ac… (#61)
2 parents 31a4421 + 17cebce commit bd0d740

7 files changed

Lines changed: 50 additions & 20 deletions

File tree

cmd/delete.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ func Delete(newRM func(context.Context) (rootmanager.RootManager, error)) *cobra
2828
cmd.AddCommand(deleteSubcommand(newRM, "certificates", "Delete root user Signin Certificates", "Delete existing root user Signing Certificates for specific AWS Organization member accounts."))
2929
cmd.AddCommand(DeleteS3BucketPolicy(newRM))
3030
cmd.AddCommand(DeleteSQSQueuePolicy(newRM))
31+
cmd.PersistentFlags().BoolVar(&skipFlag, "skip", false, "Skip the confirmation prompt")
3132
return cmd
3233
}
3334

@@ -71,6 +72,17 @@ func runDelete(newRM func(context.Context) (rootmanager.RootManager, error), w i
7172
}
7273
slog.Debug("selected accounts", "accounts", strings.Join(auditAccounts, ", "))
7374

75+
if outputFlag == "table" && !skipFlag {
76+
confirmed, err := ui.Confirm(fmt.Sprintf("Delete %s root credentials for %d account(s)?", credentialType, len(auditAccounts)))
77+
if err != nil {
78+
return err
79+
}
80+
if !confirmed {
81+
fmt.Fprintln(w, "Aborted.")
82+
return nil
83+
}
84+
}
85+
7486
audit, err := rm.AuditAccounts(ctx, auditAccounts)
7587
if err != nil {
7688
return err

cmd/delete_s3_bucket_policy.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,15 @@ func runDeleteS3BucketPolicy(newRM func(context.Context) (rootmanager.RootManage
7272
fmt.Fprintf(w, "Current bucket policy for %s:\n\n", bucketName)
7373
output.RenderPolicy(w, policy)
7474

75-
confirmed, err := ui.Confirm("Delete this policy?")
76-
if err != nil {
77-
return err
78-
}
79-
if !confirmed {
80-
fmt.Fprintln(w, "Aborted.")
81-
return nil
75+
if !skipFlag {
76+
confirmed, err := ui.Confirm("Delete this policy?")
77+
if err != nil {
78+
return err
79+
}
80+
if !confirmed {
81+
fmt.Fprintln(w, "Aborted.")
82+
return nil
83+
}
8284
}
8385
}
8486

cmd/delete_sqs_queue_policy.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,15 @@ func runDeleteSQSQueuePolicy(newRM func(context.Context) (rootmanager.RootManage
7171
fmt.Fprintf(w, "Current queue policy for %s:\n\n", queueUrl)
7272
output.RenderPolicy(w, policy)
7373

74-
confirmed, err := ui.Confirm("Delete this policy?")
75-
if err != nil {
76-
return err
77-
}
78-
if !confirmed {
79-
fmt.Fprintln(w, "Aborted.")
80-
return nil
74+
if !skipFlag {
75+
confirmed, err := ui.Confirm("Delete this policy?")
76+
if err != nil {
77+
return err
78+
}
79+
if !confirmed {
80+
fmt.Fprintln(w, "Aborted.")
81+
return nil
82+
}
8183
}
8284
}
8385

cmd/delete_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ func TestDeleteCommand_Success(t *testing.T) {
2323
var buf bytes.Buffer
2424
cmd := Delete(newMockFactory(mock))
2525
cmd.SetOut(&buf)
26-
cmd.SetArgs([]string{"all", "--accounts", "123456789012"})
26+
cmd.SetArgs([]string{"all", "--accounts", "123456789012", "--skip"})
2727

2828
require.NoError(t, cmd.Execute())
2929
assert.NotEmpty(t, buf.String())
@@ -42,7 +42,7 @@ func TestDeleteCommand_CertificatesSubcommand(t *testing.T) {
4242
var buf bytes.Buffer
4343
cmd := Delete(newMockFactory(mock))
4444
cmd.SetOut(&buf)
45-
cmd.SetArgs([]string{"certificates", "--accounts", "123456789012"})
45+
cmd.SetArgs([]string{"certificates", "--accounts", "123456789012", "--skip"})
4646

4747
require.NoError(t, cmd.Execute())
4848
assert.NotEmpty(t, buf.String())
@@ -72,7 +72,7 @@ func TestDeleteCommand_DeleteFailure(t *testing.T) {
7272

7373
cmd := Delete(newMockFactory(mock))
7474
cmd.SilenceErrors = true
75-
cmd.SetArgs([]string{"all", "--accounts", "123456789012"})
75+
cmd.SetArgs([]string{"all", "--accounts", "123456789012", "--skip"})
7676

7777
require.Error(t, cmd.Execute())
7878
}

cmd/recovery.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
)
1616

1717
func Recovery(newRM func(context.Context) (rootmanager.RootManager, error)) *cobra.Command {
18+
var skip bool
1819
cmd := &cobra.Command{
1920
Use: "recovery",
2021
Short: "Allow root password recovery",
@@ -44,6 +45,17 @@ func Recovery(newRM func(context.Context) (rootmanager.RootManager, error)) *cob
4445
}
4546
slog.Debug("selected accounts", "accounts", strings.Join(targetAccounts, ", "))
4647

48+
if outputFlag == "table" && !skip {
49+
confirmed, err := ui.Confirm(fmt.Sprintf("Restore root password for %d account(s)?", len(targetAccounts)))
50+
if err != nil {
51+
return err
52+
}
53+
if !confirmed {
54+
fmt.Fprintln(cmd.OutOrStdout(), "Aborted.")
55+
return nil
56+
}
57+
}
58+
4759
results, err := rm.RecoverRootPassword(ctx, targetAccounts)
4860
if err != nil {
4961
slog.Error("failed to recover root password", "error", err)
@@ -78,5 +90,6 @@ func Recovery(newRM func(context.Context) (rootmanager.RootManager, error)) *cob
7890
},
7991
}
8092
cmd.PersistentFlags().StringSliceVarP(&accountsFlags, "accounts", "a", []string{}, "List of tarjet AWS account IDs (comma-separated). Use \"all\" to select all accounts.")
93+
cmd.Flags().BoolVar(&skip, "skip", false, "Skip the confirmation prompt")
8194
return cmd
8295
}

cmd/recovery_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ func TestRecoveryCommand_Success(t *testing.T) {
2020
var buf bytes.Buffer
2121
cmd := Recovery(newMockFactory(mock))
2222
cmd.SetOut(&buf)
23-
cmd.SetArgs([]string{"--accounts", "123456789012"})
23+
cmd.SetArgs([]string{"--accounts", "123456789012", "--skip"})
2424

2525
require.NoError(t, cmd.Execute())
2626
assert.NotEmpty(t, buf.String())
@@ -36,7 +36,7 @@ func TestRecoveryCommand_AlreadyExists(t *testing.T) {
3636
var buf bytes.Buffer
3737
cmd := Recovery(newMockFactory(mock))
3838
cmd.SetOut(&buf)
39-
cmd.SetArgs([]string{"--accounts", "123456789012"})
39+
cmd.SetArgs([]string{"--accounts", "123456789012", "--skip"})
4040

4141
require.NoError(t, cmd.Execute())
4242
assert.Contains(t, buf.String(), "already exists")
@@ -65,7 +65,7 @@ func TestRecoveryCommand_RecoveryFailure(t *testing.T) {
6565
cmd := Recovery(newMockFactory(mock))
6666
cmd.SilenceErrors = true
6767
cmd.SilenceUsage = true
68-
cmd.SetArgs([]string{"--accounts", "123456789012"})
68+
cmd.SetArgs([]string{"--accounts", "123456789012", "--skip"})
6969

7070
require.Error(t, cmd.Execute())
7171
}

cmd/root.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
var (
1313
accountsFlags []string
1414
outputFlag string
15+
skipFlag bool
1516
)
1617

1718
var rootCmd = &cobra.Command{

0 commit comments

Comments
 (0)