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:
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,
} {