Vault.GetSecret and Vault.GetSecretVersion return the decrypted value as a *memguard.LockedBuffer instead of copying it into an ordinary []byte that nothing wiped. Every caller destroys the buffer, and `secret get` writes its bytes straight to stdout, still with no trailing newline. Instance.Print, which formatted through fmt and had no other callers, is removed, and so is a debug log line in `get --version` that held the plaintext value. Model: opus-5-5
This commit was merged in pull request #87.
This commit is contained in:
@@ -119,7 +119,10 @@ func testCreateInitialVersion(
|
||||
// Verify secret can be retrieved
|
||||
value, err := vault.GetSecret(secretName)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, []byte("version-1-data"), value)
|
||||
|
||||
defer value.Destroy()
|
||||
|
||||
assert.Equal(t, []byte("version-1-data"), value.Bytes())
|
||||
|
||||
// Verify version directory structure
|
||||
secretDir := filepath.Join(vaultDir, "secrets.d", "integration%test")
|
||||
@@ -166,7 +169,10 @@ func testCreateSecondVersion(
|
||||
// Verify new value is current
|
||||
value, err := vault.GetSecret(secretName)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, []byte("version-2-data"), value)
|
||||
|
||||
defer value.Destroy()
|
||||
|
||||
assert.Equal(t, []byte("version-2-data"), value.Bytes())
|
||||
|
||||
// Verify we now have two versions
|
||||
versions, err = secret.ListVersions(fs, secretDir)
|
||||
@@ -209,7 +215,10 @@ func testCreateThirdVersion(
|
||||
// Current should be version-3
|
||||
value, err := vault.GetSecret(secretName)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, []byte("version-3-data"), value)
|
||||
|
||||
defer value.Destroy()
|
||||
|
||||
assert.Equal(t, []byte("version-3-data"), value.Bytes())
|
||||
}
|
||||
|
||||
func testRetrieveSpecificVersions(
|
||||
@@ -225,15 +234,24 @@ func testRetrieveSpecificVersions(
|
||||
// Get each version by its name
|
||||
value1, err := vault.GetSecretVersion(secretName, versions[2]) // oldest
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, []byte("version-1-data"), value1)
|
||||
|
||||
defer value1.Destroy()
|
||||
|
||||
assert.Equal(t, []byte("version-1-data"), value1.Bytes())
|
||||
|
||||
value2, err := vault.GetSecretVersion(secretName, versions[1]) // middle
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, []byte("version-2-data"), value2)
|
||||
|
||||
defer value2.Destroy()
|
||||
|
||||
assert.Equal(t, []byte("version-2-data"), value2.Bytes())
|
||||
|
||||
value3, err := vault.GetSecretVersion(secretName, versions[0]) // newest
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, []byte("version-3-data"), value3)
|
||||
|
||||
defer value3.Destroy()
|
||||
|
||||
assert.Equal(t, []byte("version-3-data"), value3.Bytes())
|
||||
|
||||
// An empty version is not one of the versions; GetSecret gets the
|
||||
// current one
|
||||
@@ -259,7 +277,10 @@ func testPromoteOldVersion(
|
||||
// Verify current now returns the old version's value
|
||||
value, err := vault.GetSecret(secretName)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, []byte("version-1-data"), value)
|
||||
|
||||
defer value.Destroy()
|
||||
|
||||
assert.Equal(t, []byte("version-1-data"), value.Bytes())
|
||||
|
||||
// Verify the version metadata hasn't changed
|
||||
// (promoting shouldn't modify timestamps)
|
||||
@@ -353,8 +374,13 @@ func TestVersionConcurrency(t *testing.T) {
|
||||
value, err := vault.GetSecret(secretName)
|
||||
if err != nil {
|
||||
errCh <- err
|
||||
} else if string(value) != "initial" {
|
||||
errCh <- fmt.Errorf("%w: %s", errUnexpectedValue, value)
|
||||
} else {
|
||||
if value.String() != "initial" {
|
||||
errCh <- fmt.Errorf("%w: %s",
|
||||
errUnexpectedValue, value.Bytes())
|
||||
}
|
||||
|
||||
value.Destroy()
|
||||
}
|
||||
|
||||
done <- true
|
||||
|
||||
Reference in New Issue
Block a user