v3 candidate

This commit is contained in:
Andy Dixon
2026-06-16 11:51:07 +01:00
parent fcb19c96c8
commit 493bfed599
91 changed files with 28824 additions and 80 deletions
+12
View File
@@ -28,6 +28,8 @@ const (
argonKeyLen = 32
saltLen = 32
maxVaultFileBytes = 10 * 1024 * 1024
)
// SecretStore manages encrypted credential storage.
@@ -331,6 +333,16 @@ func (s *SecretStore) save() error {
// load reads and unmarshals the vault from disc.
func (s *SecretStore) load() (*secretVault, error) {
info, err := os.Stat(s.vaultPath())
if err != nil {
return nil, fmt.Errorf("failed to stat vault file: %w", err)
}
if info.IsDir() {
return nil, errors.New("vault path is a directory")
}
if info.Size() > maxVaultFileBytes {
return nil, fmt.Errorf("vault file is too large: %d bytes exceeds %d bytes", info.Size(), maxVaultFileBytes)
}
data, err := os.ReadFile(s.vaultPath())
if err != nil {
return nil, fmt.Errorf("failed to read vault file: %w", err)
+26
View File
@@ -1,7 +1,9 @@
package secrets
import (
"os"
"path/filepath"
"strings"
"testing"
)
@@ -267,6 +269,30 @@ func TestVaultPath(t *testing.T) {
}
}
func TestSecretStoreLoadRejectsOversizedVault(t *testing.T) {
dir := t.TempDir()
path := filepath.Join(dir, vaultFileName)
file, err := os.Create(path)
if err != nil {
t.Fatalf("Create() failed: %v", err)
}
if err := file.Truncate(maxVaultFileBytes + 1); err != nil {
t.Fatalf("Truncate() failed: %v", err)
}
if err := file.Close(); err != nil {
t.Fatalf("Close() failed: %v", err)
}
store := NewSecretStore(dir)
_, err = store.load()
if err == nil {
t.Fatal("expected oversized vault to be rejected")
}
if !strings.Contains(err.Error(), "vault file is too large") {
t.Fatalf("unexpected error: %v", err)
}
}
// ---------------------------------------------------------------------------
// Redaction helpers
// ---------------------------------------------------------------------------