Ask for the new passphrase in unlocker add when the variable is set (closes #154)
check / check (push) Waiting to run
check / check (push) Waiting to run
With SB_UNLOCK_PASSPHRASE set, `secret unlocker add passphrase` gave the new unlocker the passphrase in the variable without asking. It now asks on the terminal for the new passphrase and uses the variable to unlock the vault. With no controlling terminal the new unlocker takes the variable's passphrase, and the output says so. secret.ErrNoTerminal is exported so that the command can tell a missing terminal from other failures to read, such as nothing typed or a mismatched confirmation, which still fail the command. The in-process tests that add a passphrase unlocker with the variable set rely on the Docker test phase having no controlling terminal; at a terminal they would ask. Model: opus-5-5
This commit was merged in pull request #175.
This commit is contained in:
@@ -441,15 +441,20 @@ func (cli *Instance) addPassphraseUnlocker(cmd *cobra.Command) error {
|
||||
// long-term key
|
||||
vlt.Mnemonic, vlt.UnlockPassphrase = cli.Mnemonic, cli.UnlockPassphrase
|
||||
|
||||
// The new unlocker gets the passphrase from the environment, which also
|
||||
// unlocks the current passphrase unlocker, else the one entered here
|
||||
passphraseBuffer := cli.UnlockPassphrase
|
||||
if passphraseBuffer == nil {
|
||||
// Use secure passphrase input with confirmation
|
||||
passphraseBuffer, err = readSecurePassphrase("Enter passphrase for unlocker: ")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// The new passphrase is asked for even when SB_UNLOCK_PASSPHRASE is
|
||||
// set, and the variable unlocks the vault. With no terminal to ask on,
|
||||
// the new unlocker takes the passphrase in the variable.
|
||||
fromVariable := false
|
||||
|
||||
passphraseBuffer, err := readSecurePassphrase("Enter passphrase for unlocker: ")
|
||||
|
||||
switch {
|
||||
case errors.Is(err, secret.ErrNoTerminal) && cli.UnlockPassphrase != nil:
|
||||
passphraseBuffer = cli.UnlockPassphrase
|
||||
fromVariable = true
|
||||
case err != nil:
|
||||
return err
|
||||
default:
|
||||
defer passphraseBuffer.Destroy()
|
||||
}
|
||||
|
||||
@@ -460,6 +465,12 @@ func (cli *Instance) addPassphraseUnlocker(cmd *cobra.Command) error {
|
||||
|
||||
cmd.Printf("Created passphrase unlocker: %s\n", passphraseUnlocker.GetID())
|
||||
|
||||
if fromVariable {
|
||||
cmd.Printf("The new unlocker takes its passphrase from %s, since "+
|
||||
"there is no terminal to ask for a new one on\n",
|
||||
secret.EnvUnlockPassphrase)
|
||||
}
|
||||
|
||||
// CreatePassphraseUnlocker has already made it the current unlocker
|
||||
cmd.Printf("Automatically selected as current unlocker\n")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user