Check arguments before looking for the mnemonic (closes #79)
check / check (push) Waiting to run
check / check (push) Waiting to run
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. The README says which checks come first. Judgement call: the -o path is still looked at after the mnemonic. Model: opus-5-5
This commit was merged in pull request #84.
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