lockbox

password manager
Log | Files | Refs | README | LICENSE

commit c6bec61a984ebe1dd61b5bacc3e826d7d58fd742
parent 6233ead43d7f5f5677e035054b67ddecb98997c3
Author: Sean Enck <sean@ttypty.com>
Date:   Wed, 26 Jul 2023 20:47:45 -0400

more string and command transitions

Diffstat:
Minternal/app/totp.go | 2+-
Minternal/inputs/env.go | 16++++++++++++++--
Minternal/inputs/vars.go | 26+++++++++++++-------------
Minternal/platform/clipboard.go | 13++-----------
4 files changed, 30 insertions(+), 27 deletions(-)

diff --git a/internal/app/totp.go b/internal/app/totp.go @@ -81,7 +81,7 @@ func clear() { } func colorWhenRules() ([]inputs.ColorWindow, error) { - envTime := inputs.EnvironOrDefault(inputs.ColorBetweenEnv, inputs.TOTPDefaultBetween) + envTime := inputs.EnvColorBetween.Get() if envTime == inputs.TOTPDefaultBetween { return inputs.TOTPDefaultColorWindow, nil } diff --git a/internal/inputs/env.go b/internal/inputs/env.go @@ -52,10 +52,13 @@ type ( canDefault bool defaultValue string } + // EnvironmentCommand are settings that are parsed as shell commands + EnvironmentCommand struct { + environmentBase + } ) -// Shlex will do simple shell command lex-ing -func Shlex(in string) ([]string, error) { +func shlex(in string) ([]string, error) { return shell.Fields(in, os.Getenv) } @@ -128,3 +131,12 @@ func (e EnvironmentString) Get() string { } return EnvironOrDefault(e.key, e.defaultValue) } + +// Get will read (and shlex) the value if set +func (e EnvironmentCommand) Get() ([]string, error) { + value := EnvironOrDefault(e.key, "") + if strings.TrimSpace(value) == "" { + return nil, nil + } + return shlex(value) +} diff --git a/internal/inputs/vars.go b/internal/inputs/vars.go @@ -21,15 +21,9 @@ const ( keyModeEnv = prefixKey + "KEYMODE" keyEnv = prefixKey + "KEY" // KeyFileEnv is an OPTIONAL keyfile for the database - KeyFileEnv = prefixKey + "KEYFILE" - plainKeyMode = "plaintext" - commandKeyMode = "command" - // ColorBetweenEnv is a comma-delimited list of times to color totp outputs (e.g. 0:5,30:35 which is the default). - ColorBetweenEnv = fieldTOTPEnv + "_BETWEEN" - // ClipPasteEnv allows overriding the clipboard paste command - ClipPasteEnv = clipBaseEnv + "PASTE" - // ClipCopyEnv allows overriding the clipboard copy command - ClipCopyEnv = clipBaseEnv + "COPY" + KeyFileEnv = prefixKey + "KEYFILE" + plainKeyMode = "plaintext" + commandKeyMode = "command" defaultTOTPField = "totp" commandArgsExample = "[cmd args...]" detectedValue = "(detected)" @@ -74,6 +68,12 @@ var ( EnvStore = EnvironmentString{environmentBase: environmentBase{key: prefixKey + "STORE"}, canDefault: false} // EnvHookDir is the directory of hooks to execute EnvHookDir = EnvironmentString{environmentBase: environmentBase{key: prefixKey + "HOOKDIR"}, canDefault: true, defaultValue: ""} + // EnvClipCopy allows overriding the clipboard copy command + EnvClipCopy = EnvironmentCommand{environmentBase: environmentBase{key: clipBaseEnv + "COPY"}} + // EnvClipPaste allows overriding the clipboard paste command + EnvClipPaste = EnvironmentCommand{environmentBase: environmentBase{key: clipBaseEnv + "PASTE"}} + // EnvColorBetween handles terminal coloring for TOTP windows (seconds) + EnvColorBetween = EnvironmentString{environmentBase: environmentBase{key: fieldTOTPEnv + "_BETWEEN"}, canDefault: true, defaultValue: TOTPDefaultBetween} ) type ( @@ -137,7 +137,7 @@ func GetKey() ([]byte, error) { var data []byte switch useKeyMode { case commandKeyMode: - parts, err := Shlex(useKey) + parts, err := shlex(useKey) if err != nil { return nil, err } @@ -185,9 +185,9 @@ func ListEnvironmentVariables(showValues bool) []string { results = append(results, e.formatEnvironmentVariable(false, fieldTOTPEnv, defaultTOTPField, "attribute name to store TOTP tokens within the database", []string{"string"})) results = append(results, e.formatEnvironmentVariable(false, formatTOTPEnv, strings.ReplaceAll(strings.ReplaceAll(FormatTOTP("%s"), "%25s", "%s"), "&", " \\\n &"), "override the otpauth url used to store totp tokens. It must have ONE format\nstring ('%s') to insert the totp base code", []string{"otpauth//url/%s/args..."})) results = append(results, e.formatEnvironmentVariable(false, EnvMaxTOTP.key, fmt.Sprintf("%d", EnvMaxTOTP.defaultValue), "time, in seconds, in which to show a TOTP token before automatically exiting", intArgs)) - results = append(results, e.formatEnvironmentVariable(false, ColorBetweenEnv, TOTPDefaultBetween, "override when to set totp generated outputs to different colors, must be a\nlist of one (or more) rules where a semicolon delimits the start and end\nsecond (0-60 for each)", []string{"start:end,start:end,start:end..."})) - results = append(results, e.formatEnvironmentVariable(false, ClipPasteEnv, detectedValue, "override the detected platform paste command", []string{commandArgsExample})) - results = append(results, e.formatEnvironmentVariable(false, ClipCopyEnv, detectedValue, "override the detected platform copy command", []string{commandArgsExample})) + results = append(results, e.formatEnvironmentVariable(false, EnvColorBetween.key, TOTPDefaultBetween, "override when to set totp generated outputs to different colors, must be a\nlist of one (or more) rules where a semicolon delimits the start and end\nsecond (0-60 for each)", []string{"start:end,start:end,start:end..."})) + results = append(results, e.formatEnvironmentVariable(false, EnvClipPaste.key, detectedValue, "override the detected platform paste command", []string{commandArgsExample})) + results = append(results, e.formatEnvironmentVariable(false, EnvClipCopy.key, detectedValue, "override the detected platform copy command", []string{commandArgsExample})) results = append(results, e.formatEnvironmentVariable(false, EnvClipboardMax.key, fmt.Sprintf("%d", EnvClipboardMax.defaultValue), "override the amount of time before totp clears the clipboard (e.g. 10),\nmust be an integer", intArgs)) results = append(results, e.formatEnvironmentVariable(false, EnvPlatform.key, detectedValue, "override the detected platform", PlatformSet())) results = append(results, e.formatEnvironmentVariable(false, EnvNoTOTP.key, no, "disable TOTP integrations", isYesNoArgs)) diff --git a/internal/platform/clipboard.go b/internal/platform/clipboard.go @@ -6,7 +6,6 @@ import ( "fmt" "os" "os/exec" - "strings" osc "github.com/aymanbagabas/go-osc52" "github.com/enckse/lockbox/internal/inputs" @@ -30,14 +29,6 @@ func newClipboard(copying, pasting []string) (Clipboard, error) { return Clipboard{copying: copying, pasting: pasting, MaxTime: max, isOSC52: false}, nil } -func overrideCommand(v string) ([]string, error) { - value := inputs.EnvironOrDefault(v, "") - if strings.TrimSpace(value) == "" { - return nil, nil - } - return inputs.Shlex(value) -} - // NewClipboard will retrieve the commands to use for clipboard operations. func NewClipboard() (Clipboard, error) { noClip, err := inputs.EnvNoClip.Get() @@ -47,11 +38,11 @@ func NewClipboard() (Clipboard, error) { if noClip { return Clipboard{}, errors.New("clipboard is off") } - overridePaste, err := overrideCommand(inputs.ClipPasteEnv) + overridePaste, err := inputs.EnvClipPaste.Get() if err != nil { return Clipboard{}, err } - overrideCopy, err := overrideCommand(inputs.ClipCopyEnv) + overrideCopy, err := inputs.EnvClipCopy.Get() if err != nil { return Clipboard{}, err }