check / check (push) Successful in 50s
Each command that changes the state directory holds one lock: flock(2) on `lock` in the state directory, dropped by the kernel if the process dies, or a process-wide mutex on the in-memory test filesystem. It covers the state directory, not each vault, because `currentvault`, `vault create` and cross-vault moves span vaults, and a lock file in a vault would be deleted by `vault remove` under a waiting command. Files go through `secret.WriteFileAtomic`; versions, new secrets and cross-vault copies are built in a temporary directory and renamed into place; removals rename out of the way first. An unlocker added under an existing unlocker's directory name is still rewritten file by file: #71. Model: opus-5-5
72 lines
2.9 KiB
Go
72 lines
2.9 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 does not match
|
|
// the allowed pattern [a-z0-9.\-_/]+. Composed as
|
|
// "invalid secret name '<name>': must match pattern [a-z0-9.\-_/]+",
|
|
// or as "invalid secret name: <name>" by GetSecretObject.
|
|
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")
|
|
|
|
// ErrNoLockForFilesystem indicates LockStateDir was given a filesystem
|
|
// it cannot lock. Composed as "cannot lock the state directory on
|
|
// filesystem <type>".
|
|
ErrNoLockForFilesystem = errors.New(
|
|
"cannot lock the state directory on filesystem")
|
|
)
|