Check arguments before looking for the mnemonic (closes #79)
check / check (push) Canceled after 0s
check / check (push) Canceled after 0s
The key index, --words, the --to recipients and the input file of age encrypt and age decrypt were checked only after the mnemonic had been obtained, so a run that could not succeed still prompted for it or ran the mnemonic command. options.Index now refuses an index above derive.MaxIndex, which covers every command group; the mnemonic command calls the new childmnemonic.CheckWords first; age encrypt reads its recipients with the new agekey.Recipients, and both age commands open their input, before the key is derived. Encrypt now takes the parsed recipients. The README says which checks come first. Model: opus-5-5
This commit is contained in:
@@ -17,6 +17,7 @@ import (
|
||||
"sneak.berlin/go/keyfunc/internal/agekey"
|
||||
"sneak.berlin/go/keyfunc/internal/cli"
|
||||
"sneak.berlin/go/keyfunc/internal/cli/age"
|
||||
"sneak.berlin/go/keyfunc/internal/derive"
|
||||
"sneak.berlin/go/keyfunc/internal/mnemonic"
|
||||
)
|
||||
|
||||
@@ -69,6 +70,44 @@ func TestAnotherRecipientIsAddedAndTheDerivedOneStays(t *testing.T) {
|
||||
)
|
||||
}
|
||||
|
||||
// The mnemonic command fails in these runs, so the refusal of the index
|
||||
// shows that it was checked before the mnemonic was looked for.
|
||||
func TestAnAgeIndexWithNoHardenedChildIsRefused(t *testing.T) {
|
||||
t.Setenv(mnemonic.CommandVariable, failingMnemonicCommand)
|
||||
|
||||
for _, command := range []string{"pub", "priv", "encrypt", "decrypt"} {
|
||||
out, err := execute(t, "age", command, "-n", tooLarge)
|
||||
require.ErrorIs(t, err, derive.ErrIndexTooLarge, command)
|
||||
require.Empty(t, out, command)
|
||||
}
|
||||
}
|
||||
|
||||
// The mnemonic command fails in this run, so the refusal of the
|
||||
// recipient shows that it was read before the mnemonic was looked for.
|
||||
func TestAnEncryptionToARecipientThatIsNotOneIsRefused(t *testing.T) {
|
||||
t.Setenv(mnemonic.CommandVariable, failingMnemonicCommand)
|
||||
|
||||
plain := written(t, "notes.txt", "the secret\n")
|
||||
|
||||
out, err := execute(t, "age", "encrypt", "--to", "bogus", plain)
|
||||
require.ErrorContains(t, err, `reading recipient "bogus"`)
|
||||
require.Empty(t, out)
|
||||
}
|
||||
|
||||
// The mnemonic command fails in these runs, so the refusal of the input
|
||||
// file shows that it was opened before the mnemonic was looked for.
|
||||
func TestAnInputFileThatCannotBeOpenedIsRefused(t *testing.T) {
|
||||
t.Setenv(mnemonic.CommandVariable, failingMnemonicCommand)
|
||||
|
||||
missing := filepath.Join(t.TempDir(), "missing")
|
||||
|
||||
for _, operation := range []string{"encrypt", "decrypt"} {
|
||||
out, err := execute(t, "age", operation, missing)
|
||||
require.ErrorIs(t, err, fs.ErrNotExist, operation)
|
||||
require.Empty(t, out, operation)
|
||||
}
|
||||
}
|
||||
|
||||
func TestAFileForAnotherKeyIsRefused(t *testing.T) {
|
||||
t.Setenv(mnemonic.Variable, example())
|
||||
|
||||
|
||||
Reference in New Issue
Block a user