lockbox

password manager
Log | Files | Refs | README | LICENSE

commit 3b7a8de84c14cc760408c592f679a9344692d1e9
parent 49c2852099d474614d276f7aa70563b076ccb733
Author: Sean Enck <sean@ttypty.com>
Date:   Fri, 28 Jul 2023 21:44:44 -0400

support short output of current env settings

Diffstat:
Minternal/app/completions.go | 4++++
Minternal/app/core.go | 2++
Minternal/app/doc/bash | 3+++
Minternal/app/doc/zsh | 5+++++
Minternal/app/info.go | 25++++++++++++++++++-------
Minternal/app/info_test.go | 21+++++++++++++++++++++
Minternal/config/core.go | 13+++++++++++++
Minternal/config/core_test.go | 14++++++++++++++
8 files changed, 80 insertions(+), 7 deletions(-)

diff --git a/internal/app/completions.go b/internal/app/completions.go @@ -31,6 +31,8 @@ type ( JSONCommand string HelpCommand string HelpAdvancedCommand string + EnvShortCommand string + EnvCommand string } ) @@ -51,9 +53,11 @@ func GenerateCompletions(isBash, defaults bool) ([]string, error) { MultiLineCommand: MultiLineCommand, JSONCommand: JSONCommand, HelpCommand: HelpCommand, + EnvCommand: EnvCommand, HelpAdvancedCommand: HelpAdvancedCommand, TOTPCommand: TOTPCommand, MoveCommand: MoveCommand, + EnvShortCommand: EnvShortCommand, DoList: fmt.Sprintf("%s %s", name, ListCommand), DoTOTPList: fmt.Sprintf("%s %s %s", name, TOTPCommand, TOTPListCommand), Options: []string{MultiLineCommand, EnvCommand, HelpCommand, ListCommand, ShowCommand, VersionCommand, JSONCommand}, diff --git a/internal/app/core.go b/internal/app/core.go @@ -54,6 +54,8 @@ const ( TOTPOnceCommand = "once" // EnvDefaultsCommand will display the default env variables, not those set EnvDefaultsCommand = "defaults" + // EnvShortCommand will output the set environment variables + EnvShortCommand = "short" // BashCommand is the command to generate bash completions BashCommand = "bash" // BashDefaultsCommand will generate environment agnostic completions diff --git a/internal/app/doc/bash b/internal/app/doc/bash @@ -12,6 +12,9 @@ _{{ $.Executable }}() { else if [ "$COMP_CWORD" -eq 2 ]; then case ${COMP_WORDS[1]} in + "{{ $.EnvCommand }}") + opts="{{ $.EnvShortCommand }}" + ;; "{{ $.HelpCommand }}") opts="{{ $.HelpAdvancedCommand }}" ;; diff --git a/internal/app/doc/zsh b/internal/app/doc/zsh @@ -15,6 +15,11 @@ _{{ $.Executable }}() { ;; *) case $words[2] in + "{{ $.EnvCommand }}") + if [ "$len" -eq 3 ]; then + compadd "$@" "{{ $.EnvShortCommand }}" + fi + ;; "{{ $.HelpCommand }}") if [ "$len" -eq 3 ]; then compadd "$@" "{{ $.HelpAdvancedCommand }}" diff --git a/internal/app/info.go b/internal/app/info.go @@ -44,15 +44,20 @@ func info(command string, args []string) ([]string, error) { return results, nil case EnvCommand, BashCommand, ZshCommand: defaultFlag := BashDefaultsCommand + secondFlag := "" isEnv := command == EnvCommand if isEnv { defaultFlag = EnvDefaultsCommand + secondFlag = EnvShortCommand } - defaults, err := getInfoDefault(args, defaultFlag) + defaults, short, err := getInfoDefault(args, defaultFlag, secondFlag) if err != nil { return nil, err } if isEnv { + if short { + return config.Environ(), nil + } return config.ListEnvironmentVariables(!defaults), nil } return GenerateCompletions(command == BashCommand, defaults) @@ -60,23 +65,29 @@ func info(command string, args []string) ([]string, error) { return nil, nil } -func getInfoDefault(args []string, possibleArg string) (bool, error) { - defaults := false +func getInfoDefault(args []string, possibleArg, otherArg string) (bool, bool, error) { + first := false + second := false invalid := false switch len(args) { case 0: break case 1: - if args[0] == possibleArg { - defaults = true + arg := args[0] + if arg == possibleArg { + first = true } else { invalid = true + if otherArg != "" && arg == otherArg { + invalid = false + second = true + } } default: invalid = true } if invalid { - return false, errors.New("invalid argument") + return false, false, errors.New("invalid argument") } - return defaults, nil + return first, second, nil } diff --git a/internal/app/info_test.go b/internal/app/info_test.go @@ -67,6 +67,9 @@ func TestBashInfo(t *testing.T) { if _, err = app.Info(&buf, "bash", []string{"test", "default"}); err.Error() != "invalid argument" { t.Errorf("invalid error: %v", err) } + if _, err = app.Info(&buf, "bash", []string{"short"}); err.Error() != "invalid argument" { + t.Errorf("invalid error: %v", err) + } } func TestEnvInfo(t *testing.T) { @@ -93,6 +96,24 @@ func TestEnvInfo(t *testing.T) { if _, err = app.Info(&buf, "env", []string{"test", "default"}); err.Error() != "invalid argument" { t.Errorf("invalid error: %v", err) } + os.Clearenv() + buf = bytes.Buffer{} + ok, err = app.Info(&buf, "env", []string{"short"}) + if ok || err != nil { + t.Errorf("invalid error: %v", err) + } + if buf.String() != "" { + t.Error("something written") + } + os.Setenv("LOCKBOX_TEST", "1") + buf = bytes.Buffer{} + ok, err = app.Info(&buf, "env", []string{"short"}) + if !ok || err != nil { + t.Errorf("invalid error: %v", err) + } + if buf.String() == "" { + t.Error("nothing written") + } } func TestZshInfo(t *testing.T) { diff --git a/internal/config/core.go b/internal/config/core.go @@ -7,6 +7,7 @@ import ( "os" "os/exec" "path/filepath" + "sort" "strconv" "strings" @@ -318,3 +319,15 @@ func IsUnset(k, v string) (bool, error) { } return false, nil } + +// Environ will list the current environment keys +func Environ() []string { + var results []string + for _, k := range os.Environ() { + if strings.HasPrefix(k, prefixKey) { + results = append(results, k) + } + } + sort.Strings(results) + return results +} diff --git a/internal/config/core_test.go b/internal/config/core_test.go @@ -141,3 +141,17 @@ func TestIsUnset(t *testing.T) { t.Error("found unset var") } } + +func TestEnviron(t *testing.T) { + os.Clearenv() + e := config.Environ() + if len(e) != 0 { + t.Error("invalid environ") + } + os.Setenv("LOCKBOX_1", "1") + os.Setenv("LOCKBOX_2", "2") + e = config.Environ() + if len(e) != 2 || fmt.Sprintf("%v", e) != "[LOCKBOX_1=1 LOCKBOX_2=2]" { + t.Errorf("invalid environ: %v", e) + } +}