Skip to content

Commit

Permalink
Feature/metadata view (#17)
Browse files Browse the repository at this point in the history
* Hotfix for popups; metadata view

* Fixing metadata view

* Cleanup
  • Loading branch information
dkyanakiev authored Apr 28, 2024
1 parent 4bf2c89 commit e479946
Show file tree
Hide file tree
Showing 16 changed files with 231 additions and 64 deletions.
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
# Changelog

## [0.1.8] - 2024-04-28

## Fixed

-- Fixing issue with popups not being focused and requiring selection with mouse

## Added

-- Adding metadata view on secret objects

## [0.1.7] - 2024-04-24

## Added
Expand Down
22 changes: 22 additions & 0 deletions internal/models/models.go
Original file line number Diff line number Diff line change
Expand Up @@ -209,3 +209,25 @@ type Namespace struct {
Name string
Description string
}

type MetaResponse struct {
Data Metadata `json:"data"`
}

type Metadata struct {
CasRequired bool `json:"cas_required"`
CreatedTime string `json:"created_time"`
CurrentVersion int `json:"current_version"`
DeleteVersionAfter string `json:"delete_version_after"`
MaxVersions int `json:"max_versions"`
OldestVersion int `json:"oldest_version"`
UpdatedTime string `json:"updated_time"`
CustomMetadata map[string]interface{} `json:"custom_metadata"`
Versions map[string]Version `json:"versions"`
}

type Version struct {
CreatedTime string `json:"created_time"`
DeletionTime string `json:"deletion_time"`
Destroyed bool `json:"destroyed"`
}
1 change: 1 addition & 0 deletions internal/state/state.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ type State struct {
SelectedObject string
SelectedPolicyName string
SelectedSecret *api.Secret
SelectedSecretMeta *models.Metadata
PolicyList []string
PolicyACL string
NewSecretName string
Expand Down
38 changes: 34 additions & 4 deletions internal/vault/secret.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package vault

import (
"context"
"encoding/json"
"errors"
"fmt"
"net/http"
Expand Down Expand Up @@ -74,23 +75,52 @@ func (v *Vault) ListNestedSecrets(mount, path string) ([]models.SecretPath, erro
return secretPaths, nil
}

func (v *Vault) GetSecretInfo(mount, path string) (*api.Secret, error) {
func (v *Vault) GetSecretData(mount, path string) (*api.Secret, error) {
secretPath := fmt.Sprintf("%s/data/%s", mount, path)
secretPath = sanitizePath(secretPath)
secretData, err := v.vault.Logical().Read(secretPath)
if err != nil {
v.Logger.Err(err).Msgf("failed to read secret: %s", err)
return nil, errors.New(fmt.Sprintf("Failed to read secret: %v", err))
return nil, fmt.Errorf("failed to read secret: %v", err)
}

if secretData == nil {
v.Logger.Err(err).Msgf("no data found at %s", secretPath)
return nil, errors.New(fmt.Sprintf("No data found at %s", secretPath))
return nil, fmt.Errorf("no data found at %s", secretPath)
}
//TODO: Add logging

return secretData, nil
}

func (v *Vault) GetSecretMetadata(mount, path string) (*models.Metadata, error) {
secretPath := fmt.Sprintf("%s/metadata/%s", mount, path)
secretPath = sanitizePath(secretPath)
var metadata models.Metadata
secretData, err := v.vault.Logical().Read(secretPath)
if err != nil {
v.Logger.Debug().Msgf("failed to read secret metadata: %s", err)
return nil, fmt.Errorf("failed to read secret metadata: %v", err)
}

if secretData == nil {
v.Logger.Debug().Msgf("no metadata found at %s", secretPath)
return nil, fmt.Errorf("no metadata found at %s", secretPath)
}

jsonData, err := json.Marshal(secretData.Data)
if err != nil {
v.Logger.Err(err).Msgf("failed to marshal secret data: %s", err)
}
// Convert JSON to Metadata
err = json.Unmarshal(jsonData, &metadata)
if err != nil {
v.Logger.Err(err).Msgf("failed to unmarshal secret data: %s", err)
}

v.Logger.Debug().Msgf("Metadata: %v", metadata.CustomMetadata)
return &metadata, nil
}

func (v *Vault) UpdateSecretObjectKV2(mount string, path string, patch bool, data map[string]interface{}) error {
ctx := context.Background()

Expand Down
13 changes: 10 additions & 3 deletions internal/watcher/secretobj.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,19 @@ func (w *Watcher) updateSecretState(selectedMount, selectedPath string) {
w.logger.Debug().Msgf("Enterprise version detected, setting namespace to %v", w.state.SelectedNamespace)
w.vault.SetNamespace(w.state.SelectedNamespace)
}
secret, err := w.vault.GetSecretInfo(selectedMount, selectedPath)
secret, err := w.vault.GetSecretData(selectedMount, selectedPath)
if err != nil {
w.NotifyHandler(models.HandleError, err.Error())
return
w.NotifyHandler(models.HandleInfo, err.Error())
}
metadata, err2 := w.vault.GetSecretMetadata(selectedMount, selectedPath)
if err2 != nil {
w.NotifyHandler(models.HandleInfo, err2.Error())
}
if err != nil && err2 != nil {
w.NotifyHandler(models.HandleError, "Unable to return secret data or metadata")
}
w.state.SelectedSecret = secret
w.state.SelectedSecretMeta = metadata

}

Expand Down
3 changes: 2 additions & 1 deletion internal/watcher/watcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ type Vault interface {
ListNestedSecrets(string, string) ([]models.SecretPath, error)
SetNamespace(string)
ListNamespaces() ([]string, error)
GetSecretInfo(string, string) (*api.Secret, error)
GetSecretData(string, string) (*api.Secret, error)
GetSecretMetadata(string, string) (*models.Metadata, error)
//GetPolicy(string) (string, error)
//ListPolicies() ([]string, error)
}
Expand Down
6 changes: 5 additions & 1 deletion tui/component/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ var (
SecretObjectCommands = []string{
fmt.Sprintf("\n%s Secret Commands:", styles.HighlightSecondaryTag),
fmt.Sprintf("%sh%s toggle display for secrets", styles.HighlightPrimaryTag, styles.StandardColorTag),
fmt.Sprintf("%st%s toggle display for metadata info", styles.HighlightPrimaryTag, styles.StandardColorTag),
fmt.Sprintf("%sc%s copy secret to clipboard", styles.HighlightPrimaryTag, styles.StandardColorTag),
fmt.Sprintf("%sj%s toggle json view for secret", styles.HighlightPrimaryTag, styles.StandardColorTag),
fmt.Sprintf("%sP%s to PATCH secret", styles.HighlightPrimaryTag, styles.StandardColorTag),
Expand Down Expand Up @@ -84,7 +85,6 @@ func NewCommands() *Commands {

func (c *Commands) Update(commands []string) {
c.Props.ViewCommands = commands

c.updateText()
}

Expand All @@ -101,6 +101,10 @@ func (c *Commands) Render() error {

func (c *Commands) updateText() {
commands := append(c.Props.MainCommands, c.Props.ViewCommands...)
// Easy way to handle long list of commands for views
if len(c.Props.ViewCommands) > 6 {
commands = c.Props.ViewCommands
}
cmds := strings.Join(commands, "\n")
c.TextView.SetText(cmds)
}
Expand Down
2 changes: 2 additions & 0 deletions tui/component/components.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ type Table interface {
SetSelectedFunc(fn func(row, column int))
SetInputCapture(capture func(event *tcell.EventKey) *tcell.EventKey)
ScrollToTop() *tview.Table
SetSelectedStyle(style tcell.Style)
SetSelectable(rows, columns bool)
}

//go:generate counterfeiter . TextView
Expand Down
Loading

0 comments on commit e479946

Please sign in to comment.