mirror of
https://github.com/gopasspw/gopass.git
synced 2025-12-08 19:24:54 +00:00
* Add flag '--keep-capitalization' to env subcommend By adding this boolean flag to the `gopass env` cmd, the original capitalization of the secret is maintained. This fixes #2225. RELEASE_NOTES=[ENHANCEMENT] Add flag to keep env variable capitalization in `gopass env` subcmd Signed-off-by: dotcs <git@dotcs.me> * Rename CLI flag from 'keep-capitalization' to 'keep-case' Signed-off-by: dotcs <git@dotcs.me>
78 lines
1.9 KiB
Go
78 lines
1.9 KiB
Go
package action
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"path"
|
|
"strings"
|
|
|
|
"github.com/gopasspw/gopass/internal/action/exit"
|
|
"github.com/gopasspw/gopass/internal/tree"
|
|
"github.com/gopasspw/gopass/pkg/ctxutil"
|
|
"github.com/gopasspw/gopass/pkg/debug"
|
|
"github.com/urfave/cli/v2"
|
|
)
|
|
|
|
// Env implements the env subcommand. It populates the environment of a subprocess with
|
|
// a set of environment variables corresponding to the secret subtree specified on the
|
|
// command line.
|
|
func (s *Action) Env(c *cli.Context) error {
|
|
ctx := ctxutil.WithGlobalFlags(c)
|
|
name := c.Args().First()
|
|
args := c.Args().Tail()
|
|
keepCase := c.Bool("keep-case")
|
|
|
|
if len(args) == 0 {
|
|
return exit.Error(exit.Usage, nil, "Missing subcommand to execute")
|
|
}
|
|
|
|
if !s.Store.Exists(ctx, name) && !s.Store.IsDir(ctx, name) {
|
|
return exit.Error(exit.NotFound, nil, "Secret %s not found", name)
|
|
}
|
|
|
|
keys := make([]string, 0, 1)
|
|
if s.Store.IsDir(ctx, name) {
|
|
debug.Log("%q is a dir, adding it's entries", name)
|
|
|
|
l, err := s.Store.Tree(ctx)
|
|
if err != nil {
|
|
return exit.Error(exit.List, err, "failed to list store: %s", err)
|
|
}
|
|
|
|
subtree, err := l.FindFolder(name)
|
|
if err != nil {
|
|
return exit.Error(exit.NotFound, nil, "Entry %q not found", name)
|
|
}
|
|
|
|
for _, e := range subtree.List(tree.INF) {
|
|
debug.Log("found key: %s", e)
|
|
keys = append(keys, e)
|
|
}
|
|
} else {
|
|
keys = append(keys, name)
|
|
}
|
|
|
|
env := make([]string, 0, 1)
|
|
for _, key := range keys {
|
|
debug.Log("exporting to environment key: %s", key)
|
|
sec, err := s.Store.Get(ctx, key)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to get entry for env prefix %q: %w", name, err)
|
|
}
|
|
envKey := path.Base(key)
|
|
if !keepCase {
|
|
envKey = strings.ToUpper(envKey)
|
|
}
|
|
env = append(env, fmt.Sprintf("%s=%s", envKey, sec.Password()))
|
|
}
|
|
|
|
cmd := exec.CommandContext(ctx, args[0], args[1:]...)
|
|
cmd.Env = append(os.Environ(), env...)
|
|
cmd.Stdin = os.Stdin
|
|
cmd.Stdout = stdout
|
|
cmd.Stderr = os.Stderr
|
|
|
|
return cmd.Run()
|
|
}
|