Parham Alvani 46dfddaef0
Handle referencing in passwords (#3163)
* feat: handle referencing in passwords

Signed-off-by: Parham Alvani <parham.alvani@gmail.com>

* feat: use seq over slice to improve performance

Signed-off-by: Parham Alvani <parham.alvani@gmail.com>

* feat: handle error during reference following

Signed-off-by: Parham Alvani <parham.alvani@gmail.com>

* feat: provide a flag for not following references

Signed-off-by: Parham Alvani <parham.alvani@gmail.com>

* feat: disable ref following on edit and remove the flag

Signed-off-by: Parham Alvani <parham.alvani@gmail.com>

* feat: provide a configuration for follow-references

Signed-off-by: Parham Alvani <parham.alvani@gmail.com>

* fix: correct configuration tests

Signed-off-by: Parham Alvani <parham.alvani@gmail.com>

* fix: correct tests and document the new flag

Signed-off-by: Parham Alvani <parham.alvani@gmail.com>

* fix: correct integration test

Signed-off-by: Parham Alvani <parham.alvani@gmail.com>

* fix: correct tests

Signed-off-by: Parham Alvani <parham.alvani@gmail.com>

---------

Signed-off-by: Parham Alvani <parham.alvani@gmail.com>
2025-05-28 18:10:54 +02:00

31 lines
622 B
Go

package root
import (
"context"
"fmt"
"github.com/gopasspw/gopass/pkg/ctxutil"
"github.com/gopasspw/gopass/pkg/gopass"
)
// Get returns the plaintext of a single key.
func (r *Store) Get(ctx context.Context, name string) (gopass.Secret, error) {
store, name := r.getStore(name)
sec, err := store.Get(ctx, name)
if err != nil {
return sec, err
}
if ref, ok := sec.Ref(); ctxutil.IsFollowRef(ctx) && ok {
refSec, err := store.Get(ctx, ref)
if err != nil {
return sec, fmt.Errorf("failed to read reference %s by %s: %w", ref, name, err)
}
sec.SetPassword(refSec.Password())
}
return sec, nil
}