From 5f93bbdab636ff7b13fcdc121e94fcbb9a13b804 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20R=C3=BCdiger?= Date: Wed, 13 Apr 2022 15:59:57 +0200 Subject: [PATCH] improve vault and item parsing By replacing string.Split in ParseVaultAndItemFromPath with a regexp, you can use vault and item names containing slashes --- pkg/onepassword/items.go | 10 +++--- pkg/onepassword/items_test.go | 57 +++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 pkg/onepassword/items_test.go diff --git a/pkg/onepassword/items.go b/pkg/onepassword/items.go index c022f5d5..108932b2 100644 --- a/pkg/onepassword/items.go +++ b/pkg/onepassword/items.go @@ -2,7 +2,7 @@ package onepassword import ( "fmt" - "strings" + "regexp" "github.com/1Password/connect-sdk-go/connect" "github.com/1Password/connect-sdk-go/onepassword" @@ -42,9 +42,11 @@ func GetOnePasswordItemByPath(opConnectClient connect.Client, path string) (*one } func ParseVaultAndItemFromPath(path string) (string, string, error) { - splitPath := strings.Split(path, "/") - if len(splitPath) == 4 && splitPath[0] == "vaults" && splitPath[2] == "items" { - return splitPath[1], splitPath[3], nil + r := regexp.MustCompile("vaults/(.*)/items/(.*)") + splitPath := r.FindAllStringSubmatch(path, -1) + + if len(splitPath) == 1 && len(splitPath[0]) == 3 { + return splitPath[0][1], splitPath[0][2], nil } return "", "", fmt.Errorf("%q is not an acceptable path for One Password item. Must be of the format: `vaults/{vault_id}/items/{item_id}`", path) } diff --git a/pkg/onepassword/items_test.go b/pkg/onepassword/items_test.go new file mode 100644 index 00000000..f97bac58 --- /dev/null +++ b/pkg/onepassword/items_test.go @@ -0,0 +1,57 @@ +package onepassword + +import ( + "fmt" + "testing" +) + +func TestParseVaultAndItemFromPath(t *testing.T) { + cases := []struct { + Path string + Vault string + Item string + Error error + }{ + { + "vaults/foo/items/bar", + "foo", + "bar", + nil, + }, + { + "vaults/foo/items/bar/baz", + "foo", + "bar/baz", + nil, + }, + { + "vaults/foo/bar/items/baz", + "foo/bar", + "baz", + nil, + }, + { + "foo/bar", + "", + "", + fmt.Errorf("\"foo/bar\" is not an acceptable path for One Password item. Must be of the format: `vaults/{vault_id}/items/{item_id}`"), + }, + } + + for _, c := range cases { + vault, item, err := ParseVaultAndItemFromPath(c.Path) + + if err != c.Error && err.Error() != c.Error.Error() { + t.Errorf("unexpected error %v: %v", err, c.Error) + } + + if vault != c.Vault { + t.Errorf("couldn't extract vault out of path %s: %s", c.Path, vault) + } + + if item != c.Item { + t.Errorf("couldn't extract item out of path %s: %s != %s", c.Path, item, c.Item) + } + + } +}