Refuse an existing vault before asking for the mnemonic (closes #151)
check / check (push) Waiting to run
check / check (push) Waiting to run
`secret init` and `secret vault create` asked for the mnemonic and the unlocker passphrase, and `secret init` printed "Initialized secrets manager at", before refusing a vault that already exists. The check `vault.CreateVault` made before writing is now `vault.CheckNewVaultName`, which both commands call while holding the state directory lock, before the first prompt; `CreateVault` still calls it. `secret init` prints the "Initialized" line only once the vault is created, so `TestMnemonicNotReadNamesOnlyMnemonic` no longer expects it. Judgement call: the same check validates the name, so `secret vault create` with an invalid name also fails before the prompts. Model: opus-5-5
This commit is contained in:
@@ -222,12 +222,51 @@ func TestMnemonicNotReadNamesOnlyMnemonic(t *testing.T) {
|
||||
output, err := cmd.CombinedOutput()
|
||||
require.Error(t, err)
|
||||
|
||||
require.Equal(t, "Initialized secrets manager at: "+stateDir+"\n"+
|
||||
"Error: failed to read mnemonic: there is no terminal to ask on. "+
|
||||
"Please set the SB_SECRET_MNEMONIC environment variable or run "+
|
||||
require.Equal(t, "Error: failed to read mnemonic: there is no terminal to "+
|
||||
"ask on. Please set the SB_SECRET_MNEMONIC environment variable or run "+
|
||||
"interactively\n", string(output))
|
||||
}
|
||||
|
||||
// TestCreateExistingVaultAsksForNothing is a regression test for
|
||||
// https://git.eeqj.de/sneak/secret/issues/151: `secret init` and `secret
|
||||
// vault create` asked for the mnemonic and the unlocker passphrase before
|
||||
// refusing a vault that already exists, and `secret init` printed
|
||||
// "Initialized secrets manager at" first. Each runs here as the built binary,
|
||||
// in a new session, which has no terminal, and with neither
|
||||
// SB_SECRET_MNEMONIC nor SB_UNLOCK_PASSPHRASE set, so asking for either
|
||||
// fails. Each must fail saying only that the vault exists.
|
||||
func TestCreateExistingVaultAsksForNothing(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
stateDir := t.TempDir()
|
||||
_, err := vault.CreateVault(afero.NewOsFs(), stateDir, "default", nil, nil)
|
||||
require.NoError(t, err)
|
||||
|
||||
// run runs the built binary with args, which must fail, and returns what
|
||||
// it printed
|
||||
run := func(args ...string) string {
|
||||
//nolint:gosec // G204: test executes the freshly built secret binary
|
||||
cmd := exec.CommandContext(t.Context(), secretBinaryPath(t), args...)
|
||||
cmd.Env = []string{
|
||||
secret.EnvStateDir + "=" + stateDir,
|
||||
"PATH=" + os.Getenv("PATH"),
|
||||
"HOME=" + os.Getenv("HOME"),
|
||||
}
|
||||
cmd.SysProcAttr = &syscall.SysProcAttr{Setsid: true}
|
||||
|
||||
output, err := cmd.CombinedOutput()
|
||||
require.Error(t, err, "secret %v", args)
|
||||
|
||||
return string(output)
|
||||
}
|
||||
|
||||
require.Equal(t,
|
||||
"Error: failed to create default vault: vault default already exists\n",
|
||||
run("init"))
|
||||
require.Equal(t, "Error: vault default already exists\n",
|
||||
run("vault", "create", "default"))
|
||||
}
|
||||
|
||||
// TestStopDuringCreateLeavesWholeVaultOrNone is a regression test for
|
||||
// https://git.eeqj.de/sneak/secret/issues/105: `secret init` or `secret vault
|
||||
// create` killed after the passphrase prompt but before the unlocker was
|
||||
|
||||
Reference in New Issue
Block a user