Skip to content

Commit

Permalink
CV Add Change Password function to file backend (#3)
Browse files Browse the repository at this point in the history
* CV Add Change Password function to file backend

* CV file backend storage directory option

* CV prompt for new password inside change function

* CV remove new password function

* CV revert module name change
  • Loading branch information
chillyvee authored Sep 11, 2024
1 parent 35d2f7c commit 89b81c5
Show file tree
Hide file tree
Showing 5 changed files with 107 additions and 12 deletions.
9 changes: 6 additions & 3 deletions cmd/keyring/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ func main() {
backend := flag.String("backend", "", "A specific backend to use")
debug := flag.Bool("debug", false, "Whether to enable debugging in keyring")
listBackends := flag.Bool("list-backends", false, "Whether to list backends")
fileDir := flag.String("filedir", "", "file backend storage directory")

// actions to take
actionListKeys := flag.Bool("list-keys", false, "Whether to list keys")
Expand Down Expand Up @@ -49,9 +50,11 @@ func main() {
}

ring, err := keyring.Open(keyring.Config{
ServiceName: *serviceName,
AllowedBackends: allowedBackends,
KeychainName: *keychainName,
ServiceName: *serviceName,
AllowedBackends: allowedBackends,
KeychainName: *keychainName,
FileDir: *fileDir,
FilePasswordFunc: keyring.TerminalPrompt,
})
if err != nil {
log.Fatal(err)
Expand Down
39 changes: 39 additions & 0 deletions file.go
Original file line number Diff line number Diff line change
Expand Up @@ -178,3 +178,42 @@ func (k *fileKeyring) Keys() ([]string, error) {

return keys, nil
}

func (k *fileKeyring) Changepw(key string) error {
filename, err := k.filename(key)
if err != nil {
return err
}

bytes, err := os.ReadFile(filename)
if os.IsNotExist(err) {
return ErrKeyNotFound
} else if err != nil {
return err
}

if err = k.unlock(); err != nil {
return err
}

newPassword, err := k.passwordFunc(fmt.Sprintf("Enter new passphrase for %q", key))
if err != nil {
return err
}

payload, _, err := jose.Decode(string(bytes), k.password)
if err != nil {
return err
}

token, err := jose.Encrypt(payload, jose.PBES2_HS256_A128KW, jose.A256GCM, newPassword,
jose.Headers(map[string]interface{}{
"created": time.Now().String(),
}))

if err != nil {
return err
}

return os.WriteFile(filename, []byte(token), 0600)
}
54 changes: 54 additions & 0 deletions file_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,57 @@ func TestFilenameWithBadChars(t *testing.T) {
t.Fatal("Unexpected filenameEscape")
}
}

type ChangePwGenerator struct {
changePwIndex int
changePwStrings []string
}

func (generator *ChangePwGenerator) nextPassword() string {
nextPassword := generator.changePwStrings[generator.changePwIndex]
generator.changePwIndex++
return nextPassword
}

func ChangePwStringPrompt(values []string) PromptFunc {
generator := &ChangePwGenerator{
changePwStrings: values,
}
return func(_ string) (string, error) {
return generator.nextPassword(), nil
}
}

func TestFileKeyringChangepw(t *testing.T) {
k := &fileKeyring{
dir: os.TempDir(),
passwordFunc: ChangePwStringPrompt([]string{"no more secrets", "new secrets"}),
}
item := Item{Key: "llamas", Data: []byte("llamas are great")}

if err := k.Set(item); err != nil {
t.Fatal(err)
}

if err := k.Changepw(item.Key); err != nil {
t.Fatal(err)
}

k2 := &fileKeyring{
dir: os.TempDir(),
passwordFunc: FixedStringPrompt("new secrets"),
}

foundItem, err := k2.Get(`llamas`)
if err != nil {
t.Fatal(err)
}

if string(foundItem.Data) != "llamas are great" {
t.Fatalf("Value stored was not the value retrieved: %q", foundItem.Data)
}

if foundItem.Key != "llamas" {
t.Fatalf("Key wasn't persisted: %q", foundItem.Key)
}
}
8 changes: 4 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,19 @@ go 1.17

require (
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4
github.com/99designs/keyring v0.0.0-00010101000000-000000000000
github.com/danieljoos/wincred v1.1.2
github.com/dvsekhvalnov/jose2go v1.5.0
github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2
github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c
github.com/mtibben/percent v0.2.1
github.com/stretchr/testify v1.7.0
golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211
golang.org/x/sys v0.3.0
golang.org/x/term v0.3.0
)

require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/stretchr/objx v0.3.0 // indirect
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
)
)
9 changes: 4 additions & 5 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,11 @@ github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoH
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a h1:ppl5mZgokTT8uPkmYOyEUmPTr3ypaKkg5eFOGrAmxxE=
golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ=
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI=
golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U=
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
Expand Down

0 comments on commit 89b81c5

Please sign in to comment.