Refactor vault functionality to dedicated package, fix import cycles with interface pattern, fix tests

This commit is contained in:
2025-05-29 12:48:36 -07:00
parent c33385be6c
commit ddb395901b
18 changed files with 1847 additions and 2128 deletions

View File

@@ -8,6 +8,7 @@ import (
"strings"
"git.eeqj.de/sneak/secret/internal/secret"
"git.eeqj.de/sneak/secret/internal/vault"
"github.com/spf13/afero"
"github.com/spf13/cobra"
)
@@ -90,26 +91,26 @@ func newImportCmd() *cobra.Command {
return cmd
}
// AddSecret adds a secret to the vault
// AddSecret adds a secret to the current vault
func (cli *CLIInstance) AddSecret(secretName string, force bool) error {
secret.Debug("CLI AddSecret starting", "secret_name", secretName, "force", force)
// Get current vault
secret.Debug("Getting current vault")
vault, err := secret.GetCurrentVault(cli.fs, cli.stateDir)
vlt, err := vault.GetCurrentVault(cli.fs, cli.stateDir)
if err != nil {
secret.Debug("Failed to get current vault", "error", err)
return err
}
secret.Debug("Got current vault", "vault_name", vault.Name)
secret.Debug("Got current vault", "vault_name", vlt.GetName())
// Read secret value from stdin
secret.Debug("Reading secret value from stdin")
value, err := io.ReadAll(os.Stdin)
if err != nil {
secret.Debug("Failed to read secret from stdin", "error", err)
return fmt.Errorf("failed to read secret from stdin: %w", err)
return fmt.Errorf("failed to read secret value: %w", err)
}
secret.Debug("Read secret value from stdin", "value_length", len(value))
// Remove trailing newline if present
@@ -118,32 +119,32 @@ func (cli *CLIInstance) AddSecret(secretName string, force bool) error {
secret.Debug("Removed trailing newline", "new_length", len(value))
}
// Add the secret to the vault
secret.Debug("Calling vault.AddSecret", "secret_name", secretName, "value_length", len(value), "force", force)
err = vault.AddSecret(secretName, value, force)
if err != nil {
if err := vlt.AddSecret(secretName, value, force); err != nil {
secret.Debug("vault.AddSecret failed", "error", err)
return err
}
secret.Debug("vault.AddSecret completed successfully")
secret.Debug("vault.AddSecret completed successfully")
return nil
}
// GetSecret retrieves a secret from the vault
// GetSecret retrieves and prints a secret from the current vault
func (cli *CLIInstance) GetSecret(secretName string) error {
// Get current vault
vault, err := secret.GetCurrentVault(cli.fs, cli.stateDir)
vlt, err := vault.GetCurrentVault(cli.fs, cli.stateDir)
if err != nil {
return err
}
// Get the secret value using the vault's GetSecret method
// This handles the per-secret key architecture internally
value, err := vault.GetSecret(secretName)
// Get the secret value
value, err := vlt.GetSecret(secretName)
if err != nil {
return err
}
// Print the secret value to stdout
fmt.Print(string(value))
return nil
}
@@ -151,14 +152,15 @@ func (cli *CLIInstance) GetSecret(secretName string) error {
// ListSecrets lists all secrets in the current vault
func (cli *CLIInstance) ListSecrets(jsonOutput bool, filter string) error {
// Get current vault
vault, err := secret.GetCurrentVault(cli.fs, cli.stateDir)
vlt, err := vault.GetCurrentVault(cli.fs, cli.stateDir)
if err != nil {
return err
}
secrets, err := vault.ListSecrets()
// Get list of secrets
secrets, err := vlt.ListSecrets()
if err != nil {
return err
return fmt.Errorf("failed to list secrets: %w", err)
}
// Filter secrets if filter is provided
@@ -183,7 +185,7 @@ func (cli *CLIInstance) ListSecrets(jsonOutput bool, filter string) error {
}
// Try to get metadata using GetSecretObject
if secretObj, err := vault.GetSecretObject(secretName); err == nil {
if secretObj, err := vlt.GetSecretObject(secretName); err == nil {
metadata := secretObj.GetMetadata()
secretInfo["created_at"] = metadata.CreatedAt
secretInfo["updated_at"] = metadata.UpdatedAt
@@ -209,7 +211,7 @@ func (cli *CLIInstance) ListSecrets(jsonOutput bool, filter string) error {
// Pretty table output
if len(filteredSecrets) == 0 {
if filter != "" {
fmt.Printf("No secrets found in vault '%s' matching filter '%s'.\n", vault.Name, filter)
fmt.Printf("No secrets found in vault '%s' matching filter '%s'.\n", vlt.GetName(), filter)
} else {
fmt.Println("No secrets found in current vault.")
fmt.Println("Run 'secret add <name>' to create one.")
@@ -219,16 +221,16 @@ func (cli *CLIInstance) ListSecrets(jsonOutput bool, filter string) error {
// Get current vault name for display
if filter != "" {
fmt.Printf("Secrets in vault '%s' matching '%s':\n\n", vault.Name, filter)
fmt.Printf("Secrets in vault '%s' matching '%s':\n\n", vlt.GetName(), filter)
} else {
fmt.Printf("Secrets in vault '%s':\n\n", vault.Name)
fmt.Printf("Secrets in vault '%s':\n\n", vlt.GetName())
}
fmt.Printf("%-40s %-20s\n", "NAME", "LAST UPDATED")
fmt.Printf("%-40s %-20s\n", "----", "------------")
for _, secretName := range filteredSecrets {
lastUpdated := "unknown"
if secretObj, err := vault.GetSecretObject(secretName); err == nil {
if secretObj, err := vlt.GetSecretObject(secretName); err == nil {
metadata := secretObj.GetMetadata()
lastUpdated = metadata.UpdatedAt.Format("2006-01-02 15:04")
}
@@ -248,7 +250,7 @@ func (cli *CLIInstance) ListSecrets(jsonOutput bool, filter string) error {
// ImportSecret imports a secret from a file
func (cli *CLIInstance) ImportSecret(secretName, sourceFile string, force bool) error {
// Get current vault
vault, err := secret.GetCurrentVault(cli.fs, cli.stateDir)
vlt, err := vault.GetCurrentVault(cli.fs, cli.stateDir)
if err != nil {
return err
}
@@ -260,7 +262,7 @@ func (cli *CLIInstance) ImportSecret(secretName, sourceFile string, force bool)
}
// Store the secret in the vault
if err := vault.AddSecret(secretName, value, force); err != nil {
if err := vlt.AddSecret(secretName, value, force); err != nil {
return err
}