feat: GetSecret returns full item (all fields: username/uri/notes/fields)
CI / test (push) Has been cancelled
CI / docker (push) Has been cancelled

This commit is contained in:
Hermes committed 2026-08-02 17:17:33 +02:00
1 parent 4fdc94ba44
commit 0ad0415dba
2 files changed
+36 -11

No files matched your search

+1 -4
View File
@@ -108,10 +108,7 @@ func (h *Handler) GetSecret(c *fiber.Ctx) error {
})
}
return c.JSON(fiber.Map{
"name": secretName,
"value": value,
})
return c.JSON(value.ToMap())
}
func parseUUIDQuery(field, raw string) (string, error) {
+35 -7
View File
@@ -126,11 +126,22 @@ func matchesSecretFilter(item DecryptedItem, f SecretFilter) bool {
return true
}
// GetSecret retrieves a decrypted secret by name.
// It searches by exact name (case-insensitive), then falls back to partial match.
func (c *Client) GetSecret(name string, filter SecretFilter) (string, error) {
// GetSecret retrieves a decrypted secret by name and returns the full item
// (all fields) so the caller can see username/uri/notes/custom fields, not
// just the primary value. Searches by exact name (case-insensitive), then
// falls back to partial match.
func (c *Client) GetSecret(name string, filter SecretFilter) (DecryptedItem, error) {
item, err := c.getSecretItem(name, filter)
if err != nil {
return DecryptedItem{}, err
}
return item, nil
}
// getSecretItem finds the matching decrypted item without extracting a single value.
func (c *Client) getSecretItem(name string, filter SecretFilter) (DecryptedItem, error) {
if name == "" {
return "", fmt.Errorf("secret name cannot be empty")
return DecryptedItem{}, fmt.Errorf("secret name cannot be empty")
}
c.mu.RLock()
@@ -148,18 +159,35 @@ func (c *Client) GetSecret(name string, filter SecretFilter) (string, error) {
// Case 1: Exact match.
for _, item := range candidates {
if strings.EqualFold(item.Name, name) {
return extractSecret(item), nil
return item, nil
}
}
// Case 2: Partial match
for _, item := range candidates {
if strings.Contains(strings.ToLower(item.Name), key) {
logger.Debug.Printf("Partial match found for secret lookup")
return extractSecret(item), nil
return item, nil
}
}
return "", fmt.Errorf("secret not found")
return DecryptedItem{}, fmt.Errorf("secret not found")
}
// ToMap renders the decrypted item as a flat map for JSON output.
// The "value" key holds the same primary value extractSecret() would return,
// while the other keys expose every decrypted field.
func (item DecryptedItem) ToMap() map[string]interface{} {
out := map[string]interface{}{
"name": item.Name,
"type": item.Type,
"username": item.Username,
"password": item.Password,
"uri": item.URI,
"notes": item.Notes,
"fields": item.Fields,
}
out["value"] = extractSecret(item)
return out
}
// ClearCache triggers a fresh vault sync.