diff --git a/libsecret.go b/libsecret.go index 779096e..6780a94 100644 --- a/libsecret.go +++ b/libsecret.go @@ -4,9 +4,12 @@ package keyring import ( + "encoding/hex" "encoding/json" "errors" + "strings" + "github.com/godbus/dbus" "github.com/gsterjov/go-libsecret" ) @@ -57,6 +60,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 { @@ -73,7 +98,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 56cebc3..6c2fe6e 100644 --- a/libsecret_test.go +++ b/libsecret_test.go @@ -142,3 +142,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") + } +}