lockbox

password manager
Log | Files | Refs | README | LICENSE

commit 858ab64ecda4b45ec96f67728383cdb4959667ca
parent 8fdf41cf411ae992ffb7348c4dd529dcced0030d
Author: Sean Enck <sean@ttypty.com>
Date:   Fri, 30 May 2025 08:26:54 -0400

do not use case/language from text to do titles -> expect that of word generation

Diffstat:
Mcmd/lb/main_test.go | 1-
Mcmd/lb/tests/expected.log | 3+--
Mgo.mod | 1-
Mgo.sum | 2--
Minternal/app/pwgen.go | 11-----------
Minternal/app/pwgen_test.go | 9+++------
Minternal/config/toml_test.go | 60+++++++++++++++++-------------------------------------------
Minternal/config/vars.go | 20--------------------
Minternal/config/vars_test.go | 5-----
9 files changed, 21 insertions(+), 91 deletions(-)

diff --git a/cmd/lb/main_test.go b/cmd/lb/main_test.go @@ -359,7 +359,6 @@ func test(profile string) error { c["pwgen.template"] = "\"{{range $idx, $val := .}}{{if lt $val.Position.End 5}}{{ $val.Text }}{{end}}{{end}}\"" c["pwgen.characters"] = c.quoteString("b") c["pwgen.word_count"] = "2" - c["pwgen.title"] = "false" r.writeConfig(c) r.run("", "pwgen") diff --git a/cmd/lb/tests/expected.log b/cmd/lb/tests/expected.log @@ -165,7 +165,7 @@ clipboard will clear in 3 seconds Wrong password? HMAC-SHA256 of header mismatching no store set keys/k/one2 -Abc +abc bb '] LOCKBOX_CLIP_COPY_COMMAND=[touch testdata/datadir/clip.copy] @@ -176,7 +176,6 @@ LOCKBOX_JSON_HASH_LENGTH=3 LOCKBOX_JSON_MODE=hash LOCKBOX_PWGEN_CHARACTERS=b LOCKBOX_PWGEN_TEMPLATE={{range $idx, $val := .}}{{if lt $val.Position.End 5}}{{ $val.Text }}{{end}}{{end}} -LOCKBOX_PWGEN_TITLE=false LOCKBOX_PWGEN_WORD_COMMAND=[/bin/sh -c echo abc abc | tr ' ' ' LOCKBOX_PWGEN_WORD_COUNT=2 LOCKBOX_STORE=testdata/datadir/pass.kdbx diff --git a/go.mod b/go.mod @@ -9,7 +9,6 @@ require ( github.com/aymanbagabas/go-osc52 v1.2.2 github.com/pquerna/otp v1.5.0 github.com/tobischo/gokeepasslib/v3 v3.6.1 - golang.org/x/text v0.25.0 ) require ( diff --git a/go.sum b/go.sum @@ -28,7 +28,5 @@ golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8 golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= -golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/app/pwgen.go b/internal/app/pwgen.go @@ -13,8 +13,6 @@ import ( "git.sr.ht/~enckse/lockbox/internal/config" "git.sr.ht/~enckse/lockbox/internal/util" - "golang.org/x/text/cases" - "golang.org/x/text/language" ) // GeneratePassword generates a password @@ -37,15 +35,10 @@ func GeneratePassword(cmd CommandOptions) error { if len(wordList) > 1 { args = wordList[1:] } - capitalize := config.EnvPasswordGenTitle.Get() wordResults, err := exec.Command(exe, args...).Output() if err != nil { return err } - lang, err := language.Parse(config.EnvLanguage.Get()) - if err != nil { - return err - } chars := config.EnvPasswordGenChars.Get() hasChars := len(chars) > 0 var allowedChars []rune @@ -54,7 +47,6 @@ func GeneratePassword(cmd CommandOptions) error { allowedChars = append(allowedChars, c) } } - caser := cases.Title(lang) var choices []string for _, line := range strings.Split(string(wordResults), "\n") { t := strings.TrimSpace(line) @@ -74,9 +66,6 @@ func GeneratePassword(cmd CommandOptions) error { } use = res } - if capitalize { - use = caser.String(use) - } choices = append(choices, use) } found := len(choices) diff --git a/internal/app/pwgen_test.go b/internal/app/pwgen_test.go @@ -77,15 +77,13 @@ func TestGenerate(t *testing.T) { store.SetArray("LOCKBOX_PWGEN_WORD_COMMAND", []string{pwgenPath, "1 1 1 1 1 1 1 1 1 1 1 1"}) testPasswordGen(t, "1-1-1-1-1-1-1-1-1-1") store.SetInt64("LOCKBOX_PWGEN_WORD_COUNT", 4) - store.SetBool("LOCKBOX_PWGEN_TITLE", true) store.SetArray("LOCKBOX_PWGEN_WORD_COMMAND", []string{pwgenPath, "a a a a a a a a a a a a a a a a a a a a a a"}) - testPasswordGen(t, "A-A-A-A") + testPasswordGen(t, "a-a-a-a") store.SetString("LOCKBOX_PWGEN_CHARACTERS", "bc") store.SetArray("LOCKBOX_PWGEN_WORD_COMMAND", []string{pwgenPath, "abc abc abc abc abc abc aaa aa aaa a"}) - testPasswordGen(t, "Bc-Bc-Bc-Bc") + testPasswordGen(t, "bc-bc-bc-bc") store.SetString("LOCKBOX_PWGEN_CHARACTERS", "") store.SetArray("LOCKBOX_PWGEN_WORD_COMMAND", []string{pwgenPath, "a a a a a a a a a a a a a a a a a a a a a a"}) - store.SetBool("LOCKBOX_PWGEN_TITLE", false) testPasswordGen(t, "a-a-a-a") // NOTE: this allows templating below in golang store.SetString("LOCKBOX_PWGEN_TEMPLATE", "{{range $idx, $val := .}}{{if lt $idx 5}}-{{end}}{{ $val.Text }}{{ $val.Position.Start }}{{ $val.Position.End }}{{end}}") @@ -93,14 +91,13 @@ func TestGenerate(t *testing.T) { store.SetString("LOCKBOX_PWGEN_TEMPLATE", "{{range $idx, $val := .}}{{if lt $idx 5}}-{{end}}{{ $val.Text }}{{end}}") testPasswordGen(t, "-a-a-a-a") store.Clear() - store.SetBool("LOCKBOX_PWGEN_TITLE", true) store.SetArray("LOCKBOX_PWGEN_WORD_COMMAND", []string{pwgenPath, "abc axy axY aZZZ aoijafea aoiajfoea afeafa"}) m := newMockCommand(t) if err := app.GeneratePassword(m); err != nil { t.Errorf("invalid error: %v", err) } s := m.buf.String() - if s[0] != 'A' { + if s[0] != 'a' { t.Errorf("no title: %s", s) } if len(s) < 5 { diff --git a/internal/config/toml_test.go b/internal/config/toml_test.go @@ -13,6 +13,10 @@ import ( "git.sr.ht/~enckse/lockbox/internal/config/store" ) +var emptyRead = func(_ string) (io.Reader, error) { + return nil, nil +} + func TestLoadIncludes(t *testing.T) { store.Clear() defer os.Clearenv() @@ -92,10 +96,7 @@ func TestArrayLoad(t *testing.T) { copy_command = ["'xyz/$TEST'", "s", 1] ` r := strings.NewReader(data) - err := config.LoadConfig(r, func(p string) (io.Reader, error) { - return nil, nil - }) - if err == nil || err.Error() != "value is not string in array: 1" { + if err := config.LoadConfig(r, emptyRead); err == nil || err.Error() != "value is not string in array: 1" { t.Errorf("invalid error: %v", err) } data = `include = [] @@ -104,9 +105,7 @@ store="xyz" copy_command = ["'xyz/$TEST'", "s"] ` r = strings.NewReader(data) - if err := config.LoadConfig(r, func(p string) (io.Reader, error) { - return nil, nil - }); err != nil { + if err := config.LoadConfig(r, emptyRead); err != nil { t.Errorf("invalid error: %v", err) } if len(store.List()) != 2 { @@ -126,9 +125,7 @@ store="xyz" copy_command = ["'xyz/$TEST'", "s"] ` r = strings.NewReader(data) - if err := config.LoadConfig(r, func(p string) (io.Reader, error) { - return nil, nil - }); err != nil { + if err := config.LoadConfig(r, emptyRead); err != nil { t.Errorf("invalid error: %v", err) } if len(store.List()) != 2 { @@ -151,10 +148,7 @@ func TestReadInt(t *testing.T) { timeout = true ` r := strings.NewReader(data) - err := config.LoadConfig(r, func(p string) (io.Reader, error) { - return nil, nil - }) - if err == nil || err.Error() != "non-int64 found where expected: true" { + if err := config.LoadConfig(r, emptyRead); err == nil || err.Error() != "non-int64 found where expected: true" { t.Errorf("invalid error: %v", err) } data = `include = [] @@ -162,9 +156,7 @@ timeout = true timeout = 1 ` r = strings.NewReader(data) - if err := config.LoadConfig(r, func(p string) (io.Reader, error) { - return nil, nil - }); err != nil { + if err := config.LoadConfig(r, emptyRead); err != nil { t.Errorf("invalid error: %v", err) } if len(store.List()) != 1 { @@ -179,10 +171,7 @@ timeout = 1 timeout = -1 ` r = strings.NewReader(data) - err = config.LoadConfig(r, func(p string) (io.Reader, error) { - return nil, nil - }) - if err == nil || err.Error() != "-1 is negative (not allowed here)" { + if err := config.LoadConfig(r, emptyRead); err == nil || err.Error() != "-1 is negative (not allowed here)" { t.Errorf("invalid error: %v", err) } } @@ -194,10 +183,7 @@ func TestReadBool(t *testing.T) { enabled = 1 ` r := strings.NewReader(data) - err := config.LoadConfig(r, func(p string) (io.Reader, error) { - return nil, nil - }) - if err == nil || err.Error() != "non-bool found where expected: 1" { + if err := config.LoadConfig(r, emptyRead); err == nil || err.Error() != "non-bool found where expected: 1" { t.Errorf("invalid error: %v", err) } data = `include = [] @@ -205,9 +191,7 @@ enabled = 1 enabled = true ` r = strings.NewReader(data) - if err := config.LoadConfig(r, func(p string) (io.Reader, error) { - return nil, nil - }); err != nil { + if err := config.LoadConfig(r, emptyRead); err != nil { t.Errorf("invalid error: %v", err) } if len(store.List()) != 1 { @@ -222,9 +206,7 @@ enabled = true enabled = false ` r = strings.NewReader(data) - if err := config.LoadConfig(r, func(p string) (io.Reader, error) { - return nil, nil - }); err != nil { + if err := config.LoadConfig(r, emptyRead); err != nil { t.Errorf("invalid error: %v", err) } if len(store.List()) != 1 { @@ -243,10 +225,7 @@ func TestBadValues(t *testing.T) { enabled = "false" ` r := strings.NewReader(data) - err := config.LoadConfig(r, func(p string) (io.Reader, error) { - return nil, nil - }) - if err == nil || err.Error() != "unknown key: totsp_enabled (LOCKBOX_TOTSP_ENABLED)" { + if err := config.LoadConfig(r, emptyRead); err == nil || err.Error() != "unknown key: totsp_enabled (LOCKBOX_TOTSP_ENABLED)" { t.Errorf("invalid error: %v", err) } data = `include = [] @@ -254,10 +233,7 @@ enabled = "false" otp_format = -1 ` r = strings.NewReader(data) - err = config.LoadConfig(r, func(p string) (io.Reader, error) { - return nil, nil - }) - if err == nil || err.Error() != "non-string found where expected: -1" { + if err := config.LoadConfig(r, emptyRead); err == nil || err.Error() != "non-string found where expected: -1" { t.Errorf("invalid error: %v", err) } } @@ -275,7 +251,7 @@ func TestDefaultTOMLToLoadFile(t *testing.T) { if err := config.LoadConfigFile(file); err != nil { t.Errorf("invalid error: %v", err) } - if len(store.List()) != 30 { + if len(store.List()) != 28 { t.Errorf("invalid environment after load") } } @@ -290,9 +266,7 @@ clip.copy_command = ["$TEST", "$TEST"] otp_format = "$TEST" ` r := strings.NewReader(data) - if err := config.LoadConfig(r, func(p string) (io.Reader, error) { - return nil, nil - }); err != nil { + if err := config.LoadConfig(r, emptyRead); err != nil { t.Errorf("invalid error: %v", err) } if len(store.List()) != 3 { diff --git a/internal/config/vars.go b/internal/config/vars.go @@ -259,14 +259,6 @@ Set to '%s' to ignore the set key value`, noKeyMode, IgnoreKeyMode), }), short: "word count", }) - // EnvPasswordGenTitle indicates if titling (e.g. uppercasing) will occur to words - EnvPasswordGenTitle = environmentRegister(EnvironmentBool{ - environmentDefault: newDefaultedEnvironment(true, - environmentBase{ - key: genCategory + "TITLE", - description: "Title words during password generation.", - }), - }) // EnvPasswordGenTemplate is the output template for controlling how output words are placed together EnvPasswordGenTemplate = environmentRegister(EnvironmentString{ environmentStrings: environmentStrings{ @@ -290,18 +282,6 @@ Set to '%s' to ignore the set key value`, noKeyMode, IgnoreKeyMode), flags: []stringsFlags{isCommandFlag}, }, }) - // EnvLanguage is the language to use for everything - EnvLanguage = environmentRegister(EnvironmentString{ - environmentStrings: environmentStrings{ - environmentDefault: newDefaultedEnvironment("en-US", - environmentBase{ - key: "LANGUAGE", - description: "Language to run under.", - }), - allowed: []string{"<language code>"}, - flags: []stringsFlags{canDefaultFlag}, - }, - }) // EnvPasswordGenEnabled indicates if password generation is enabled EnvPasswordGenEnabled = environmentRegister(EnvironmentBool{ environmentDefault: newDefaultedEnvironment(true, diff --git a/internal/config/vars_test.go b/internal/config/vars_test.go @@ -56,10 +56,6 @@ func TestIsNoGeneratePassword(t *testing.T) { checkYesNo("LOCKBOX_PWGEN_ENABLED", t, config.EnvPasswordGenEnabled, true) } -func TestIsTitle(t *testing.T) { - checkYesNo("LOCKBOX_PWGEN_TITLE", t, config.EnvPasswordGenTitle, true) -} - func TestTOTP(t *testing.T) { store.Clear() if config.EnvTOTPEntry.Get() != "totp" { @@ -177,7 +173,6 @@ func TestDefaultStrings(t *testing.T) { for k, v := range map[string]config.EnvironmentString{ "totp": config.EnvTOTPEntry, "hash": config.EnvJSONMode, - "en-US": config.EnvLanguage, "command": config.EnvPasswordMode, "{{range $i, $val := .}}{{if $i}}-{{end}}{{$val.Text}}{{end}}": config.EnvPasswordGenTemplate, } {