check / check (push) Waiting to run
`secret rm ..` resolved to the vault directory and deleted the whole vault; `secret rm .` and `secret rm ""` deleted every secret. rm, mv, the version commands, encrypt and decrypt built paths from the name without checking it; import checked it only after reading the source file. vault.ValidateSecretName wraps the existing name rule; its error and README.md state the rule. Each of those commands calls it on the name as given, before building any path; MoveSecret checks both names once, for every form of the move, before switching the current vault. AddSecret, GetSecretVersion and GetSecretObject use it too. The regression test copies two in-memory vaults for each rejected command and requires the exact error and an unchanged state directory. Model: opus-5-5
67 lines
2.7 KiB
Go
67 lines
2.7 KiB
Go
package vault
|
|
|
|
import "errors"
|
|
|
|
// Sentinel errors returned by vault operations.
|
|
//
|
|
// Several of these carry deliberately partial text: the message a caller
|
|
// composes with fmt.Errorf places the interpolated value where it has
|
|
// always appeared, and the sentinel supplies only the surrounding fixed
|
|
// words. This keeps every composed message byte-identical to the dynamic
|
|
// errors these sentinels replaced. Each such sentinel notes the message it
|
|
// participates in.
|
|
var (
|
|
// ErrMnemonicMismatch indicates the mnemonic-derived public key does
|
|
// not match the vault's stored public key hash.
|
|
ErrMnemonicMismatch = errors.New(
|
|
"derived public key does not match vault: mnemonic may be incorrect",
|
|
)
|
|
|
|
// ErrInvalidVaultName indicates a vault name that does not match the
|
|
// allowed pattern [a-z0-9.\-_]+. Composed as
|
|
// "invalid vault name '<name>': must match pattern [a-z0-9.\-_]+".
|
|
ErrInvalidVaultName = errors.New("invalid vault name")
|
|
|
|
// ErrVaultNotFound indicates the named vault does not exist. Composed
|
|
// as "vault <name> does not exist".
|
|
ErrVaultNotFound = errors.New("does not exist")
|
|
|
|
// ErrNilValueBuffer indicates a nil value buffer was supplied.
|
|
ErrNilValueBuffer = errors.New("value buffer is nil")
|
|
|
|
// ErrInvalidSecretName indicates a secret name that breaks the naming
|
|
// rule: only letters, digits, '.', '-', '_' and '/'; not empty; no
|
|
// leading '.' or '/', no trailing '/', no '//', no '..' path segment.
|
|
// Composed by ValidateSecretName as
|
|
// "invalid secret name '<name>': <the rule>".
|
|
ErrInvalidSecretName = errors.New("invalid secret name")
|
|
|
|
// ErrSecretExists indicates the secret already exists and --force
|
|
// was not supplied. Composed as
|
|
// "secret <name> already exists (use --force to overwrite)", or as
|
|
// "secret '<name>' already exists in vault '<vault>' (use --force to
|
|
// overwrite)" when copying between vaults.
|
|
ErrSecretExists = errors.New("already exists")
|
|
|
|
// ErrSecretNotFound indicates the named secret does not exist.
|
|
// Composed as "secret <name> not found".
|
|
ErrSecretNotFound = errors.New("not found")
|
|
|
|
// ErrVersionNotFound indicates the requested secret version does not
|
|
// exist. Composed as
|
|
// "version <version> not found for secret <name>".
|
|
ErrVersionNotFound = errors.New("not found for secret")
|
|
|
|
// ErrNoVersions indicates the source secret has no versions. Composed
|
|
// as "source secret '<name>' has no versions".
|
|
ErrNoVersions = errors.New("has no versions")
|
|
|
|
// ErrUnsupportedUnlockerType indicates an unlocker metadata type
|
|
// that this build does not support.
|
|
ErrUnsupportedUnlockerType = errors.New("unsupported unlocker type")
|
|
|
|
// ErrUnlockerNotFound indicates no unlocker with the given ID exists.
|
|
// Composed as "unlocker with ID <id> not found".
|
|
ErrUnlockerNotFound = errors.New("not found")
|
|
)
|