Commands fail when currentvault names no vault (closes #156)
check / check (push) Waiting to run
check / check (push) Waiting to run
An empty currentvault, or one naming a vault that does not exist, made `secret list` report an empty vault with exit 0 and `secret add` fail on a missing directory. ResolveVaultSymlink now refuses an empty or invalid name, or one with no directory under vaults.d, with an error that wraps ErrVaultNotFound, names the file and says to run `secret vault select <name>`. Every command that uses the current vault gets it; `secret vault list` and `secret info` still run. newSizeTestVault wrote a full path into currentvault, which resolved only because the last path element was taken as the name; it now relies on CreateVault selecting the vault. Model: opus-5-5
This commit was merged in pull request #182.
This commit is contained in:
@@ -55,7 +55,10 @@ func ValidateVaultName(name string) error {
|
||||
}
|
||||
|
||||
// ResolveVaultSymlink reads the currentvault file to get the path to the current vault
|
||||
// The file contains just the vault name (e.g., "default")
|
||||
// The file contains just the vault name (e.g., "default"). An empty or
|
||||
// invalid name, or the name of a vault that does not exist, is an error
|
||||
// wrapping ErrVaultNotFound that names the file and says to run
|
||||
// 'secret vault select <name>'.
|
||||
func ResolveVaultSymlink(fs afero.Fs, currentVaultPath string) (string, error) {
|
||||
secret.Debug("resolveVaultSymlink starting", "path", currentVaultPath)
|
||||
|
||||
@@ -74,6 +77,21 @@ func ResolveVaultSymlink(fs afero.Fs, currentVaultPath string) (string, error) {
|
||||
stateDir := filepath.Dir(currentVaultPath)
|
||||
absolutePath := filepath.Join(stateDir, "vaults.d", vaultName)
|
||||
|
||||
// An empty name would make vaults.d itself the vault's directory
|
||||
exists := false
|
||||
if isValidVaultName(vaultName) {
|
||||
exists, err = afero.DirExists(fs, absolutePath)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("failed to check if vault exists: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
if !exists {
|
||||
return "", fmt.Errorf("vault '%s' named in %s %w; run "+
|
||||
"'secret vault select <name>' to select a vault",
|
||||
vaultName, currentVaultPath, ErrVaultNotFound)
|
||||
}
|
||||
|
||||
secret.Debug("Resolved to absolute path", "absolute_path", absolutePath)
|
||||
|
||||
return absolutePath, nil
|
||||
|
||||
Reference in New Issue
Block a user