From 6bc6f5abc611f4b7d5c30b927eece5fbf9f5fde5 Mon Sep 17 00:00:00 2001 From: jongwhan Date: Wed, 31 Mar 2021 14:52:14 +0900 Subject: [PATCH] fix reading in gnome keyring remove debug code tidy up remove un-necessary condition add unit test --- libsecret.go | 27 ++++++++++++++++++++++++++- libsecret_test.go | 23 +++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/libsecret.go b/libsecret.go index ca4913d..1c796a6 100644 --- a/libsecret.go +++ b/libsecret.go @@ -3,9 +3,12 @@ package keyring import ( + "encoding/hex" "encoding/json" "errors" + "strings" + "github.com/godbus/dbus" "github.com/gsterjov/go-libsecret" ) @@ -56,6 +59,28 @@ func (e *secretsError) Error() string { var errCollectionNotFound = errors.New("The collection does not exist. Please add a key first") +func decodeKeyringString(src string) string { + + var dst strings.Builder + for i := 0; i < len(src); i++ { + if src[i] != '_' { + dst.WriteString(string(src[i])) + } else { + if i+3 > len(src) { + return src + } + hexstring := src[i+1 : i+3] + decoded, err := hex.DecodeString(hexstring) + if err != nil { + return src + } + dst.Write(decoded) + i += 2 + } + } + return dst.String() +} + func (k *secretsKeyring) openSecrets() error { session, err := k.service.Open() if err != nil { @@ -72,7 +97,7 @@ func (k *secretsKeyring) openSecrets() error { path := libsecret.DBusPath + "/collection/" + k.name for _, collection := range collections { - if string(collection.Path()) == path { + if decodeKeyringString(string(collection.Path())) == path { k.collection = &collection return nil } diff --git a/libsecret_test.go b/libsecret_test.go index f165aec..d605976 100644 --- a/libsecret_test.go +++ b/libsecret_test.go @@ -141,3 +141,26 @@ func TestLibSecretRemoveWhenNotEmpty(t *testing.T) { t.Fatal(err) } } + +func TestLibSpecialCharacters(t *testing.T) { + + decoded := decodeKeyringString("keyring_2dtest") + if decoded != "keyring-test" { + t.Fatal("incorrect decodeKeyringString") + } + + decoded = decodeKeyringString("keyring_2d_2dtest") + if decoded != "keyring--test" { + t.Fatal("incorrect decodeKeyringString") + } + + decoded = decodeKeyringString("keyring_2dtest_2d_2d") + if decoded != "keyring-test--" { + t.Fatal("incorrect decodeKeyringString") + } + + decoded = decodeKeyringString("_2d_2dkeyring_2dtest_2d_2d") + if decoded != "--keyring-test--" { + t.Fatal("incorrect decodeKeyringString") + } +}