From 6cb89f7c6e680151a3364182a4b6554ca7911936 Mon Sep 17 00:00:00 2001 From: Horia Culea Date: Wed, 1 Dec 2021 14:41:55 +0000 Subject: [PATCH 1/7] Add uuid validation --- connect/client.go | 78 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 72 insertions(+), 6 deletions(-) diff --git a/connect/client.go b/connect/client.go index 0f40ed2..4f28089 100644 --- a/connect/client.go +++ b/connect/client.go @@ -12,6 +12,7 @@ import ( "os" "path/filepath" "reflect" + "regexp" "github.com/opentracing/opentracing-go" "github.com/opentracing/opentracing-go/ext" @@ -35,8 +36,8 @@ type Client interface { GetItemsByTitle(title string, vaultUUID string) ([]onepassword.Item, error) GetItemByTitle(title string, vaultUUID string) (*onepassword.Item, error) CreateItem(item *onepassword.Item, vaultUUID string) (*onepassword.Item, error) - UpdateItem(item *onepassword.Item, vaultUUID string) (*onepassword.Item, error) - DeleteItem(item *onepassword.Item, vaultUUID string) error + UpdateItem(item *onepassword.Item) (*onepassword.Item, error) + DeleteItem(item *onepassword.Item) error DeleteItemByID(itemUUID string, vaultUUID string) error GetFiles(itemUUID string, vaultUUID string) ([]onepassword.File, error) GetFile(fileUUID string, itemUUID string, vaultUUID string) (*onepassword.File, error) @@ -135,8 +136,8 @@ func (rs *restClient) GetVaults() ([]onepassword.Vault, error) { // GetVaults Get a list of all available vaults func (rs *restClient) GetVault(uuid string) (*onepassword.Vault, error) { - if uuid == "" { - return nil, errors.New("no uuid provided") + if !isValidUUID(uuid) { + return nil, errors.New("malformed vault uuid provided") } span := rs.tracer.StartSpan("GetVault") @@ -186,6 +187,13 @@ func (rs *restClient) GetVaultsByTitle(title string) ([]onepassword.Vault, error // GetItem Get a specific Item from the 1Password Connect API func (rs *restClient) GetItem(uuid string, vaultUUID string) (*onepassword.Item, error) { + if !isValidUUID(uuid) { + return nil, errors.New("malformed item uuid provided") + } + if !isValidUUID(vaultUUID) { + return nil, errors.New("malformed vault uuid provided") + } + span := rs.tracer.StartSpan("GetItem") defer span.Finish() @@ -208,6 +216,10 @@ func (rs *restClient) GetItem(uuid string, vaultUUID string) (*onepassword.Item, } func (rs *restClient) GetItemByTitle(title string, vaultUUID string) (*onepassword.Item, error) { + if !isValidUUID(vaultUUID) { + return nil, errors.New("malformed vault uuid provided") + } + span := rs.tracer.StartSpan("GetItemByTitle") defer span.Finish() items, err := rs.GetItemsByTitle(title, vaultUUID) @@ -223,6 +235,10 @@ func (rs *restClient) GetItemByTitle(title string, vaultUUID string) (*onepasswo } func (rs *restClient) GetItemsByTitle(title string, vaultUUID string) ([]onepassword.Item, error) { + if !isValidUUID(vaultUUID) { + return nil, errors.New("malformed vault uuid provided") + } + span := rs.tracer.StartSpan("GetItemsByTitle") defer span.Finish() @@ -247,6 +263,10 @@ func (rs *restClient) GetItemsByTitle(title string, vaultUUID string) ([]onepass } func (rs *restClient) GetItems(vaultUUID string) ([]onepassword.Item, error) { + if !isValidUUID(vaultUUID) { + return nil, errors.New("malformed vault uuid provided") + } + span := rs.tracer.StartSpan("GetItems") defer span.Finish() @@ -271,6 +291,10 @@ func (rs *restClient) GetItems(vaultUUID string) ([]onepassword.Item, error) { // CreateItem Create a new item in a specified vault func (rs *restClient) CreateItem(item *onepassword.Item, vaultUUID string) (*onepassword.Item, error) { + if !isValidUUID(vaultUUID) { + return nil, errors.New("malformed vault uuid provided") + } + span := rs.tracer.StartSpan("CreateItem") defer span.Finish() @@ -299,7 +323,7 @@ func (rs *restClient) CreateItem(item *onepassword.Item, vaultUUID string) (*one } // UpdateItem Update a new item in a specified vault -func (rs *restClient) UpdateItem(item *onepassword.Item, vaultUUID string) (*onepassword.Item, error) { +func (rs *restClient) UpdateItem(item *onepassword.Item) (*onepassword.Item, error) { span := rs.tracer.StartSpan("UpdateItem") defer span.Finish() @@ -328,7 +352,7 @@ func (rs *restClient) UpdateItem(item *onepassword.Item, vaultUUID string) (*one } // DeleteItem Delete a new item in a specified vault -func (rs *restClient) DeleteItem(item *onepassword.Item, vaultUUID string) error { +func (rs *restClient) DeleteItem(item *onepassword.Item) error { span := rs.tracer.StartSpan("DeleteItem") defer span.Finish() @@ -352,6 +376,13 @@ func (rs *restClient) DeleteItem(item *onepassword.Item, vaultUUID string) error // DeleteItem Delete a new item in a specified vault, specifying the item's uuid func (rs *restClient) DeleteItemByID(itemUUID string, vaultUUID string) error { + if !isValidUUID(itemUUID) { + return errors.New("malformed item uuid provided") + } + if !isValidUUID(vaultUUID) { + return errors.New("malformed vault uuid provided") + } + span := rs.tracer.StartSpan("DeleteItemByID") defer span.Finish() @@ -374,6 +405,13 @@ func (rs *restClient) DeleteItemByID(itemUUID string, vaultUUID string) error { } func (rs *restClient) GetFiles(itemUUID string, vaultUUID string) ([]onepassword.File, error) { + if !isValidUUID(vaultUUID) { + return nil, errors.New("malformed vault uuid provided") + } + if !isValidUUID(itemUUID) { + return nil, errors.New("malformed item uuid provided") + } + span := rs.tracer.StartSpan("GetFiles") defer span.Finish() @@ -400,6 +438,16 @@ func (rs *restClient) GetFiles(itemUUID string, vaultUUID string) ([]onepassword // GetFile Get a specific File in a specified item. // This does not include the file contents. Call GetFileContent() to load the file's content. func (rs *restClient) GetFile(uuid string, itemUUID string, vaultUUID string) (*onepassword.File, error) { + if !isValidUUID(uuid) { + return nil, errors.New("malformed file uuid provided") + } + if !isValidUUID(itemUUID) { + return nil, errors.New("malformed item uuid provided") + } + if !isValidUUID(vaultUUID) { + return nil, errors.New("malformed vault uuid provided") + } + span := rs.tracer.StartSpan("GetFile") defer span.Finish() @@ -546,6 +594,12 @@ func loadToStruct(item *parsedItem, config reflect.Value) error { } func (rs *restClient) LoadStructFromItem(i interface{}, itemUUID string, vaultUUID string) error { + if !isValidUUID(itemUUID) { + return errors.New("malformed item uuid provided") + } + if !isValidUUID(vaultUUID) { + return errors.New("malformed vault uuid provided") + } config, err := checkStruct(i) if err != nil { return err @@ -566,6 +620,10 @@ func (rs *restClient) LoadStructFromItem(i interface{}, itemUUID string, vaultUU // LoadConfigFromItem Load configuration values based on struct tag from one 1P item func (rs *restClient) LoadStructFromItemByTitle(i interface{}, itemTitle string, vaultUUID string) error { + if !isValidUUID(vaultUUID) { + return errors.New("malformed vault uuid provided") + } + config, err := checkStruct(i) if err != nil { return err @@ -616,6 +674,9 @@ func (rs *restClient) LoadStruct(i interface{}) error { if err != nil { return err } + if !isValidUUID(itemVault) { + return errors.New("malformed vault uuid provided") + } key := fmt.Sprintf("%s/%s", itemVault, tag) parsed := items[key] @@ -663,3 +724,8 @@ func readResponseBody(resp *http.Response, expectedStatusCode int) ([]byte, erro } return body, nil } + +func isValidUUID(u string) bool { + r := regexp.MustCompile("^[a-z0-9]{26}$") + return r.MatchString(u) +} From 5a79fec7dd380a734a5ff409f52d1e31bc728cb7 Mon Sep 17 00:00:00 2001 From: Horia Culea Date: Wed, 1 Dec 2021 14:44:07 +0000 Subject: [PATCH 2/7] Fix failing tests --- connect/client_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/connect/client_test.go b/connect/client_test.go index 8064710..7923847 100644 --- a/connect/client_test.go +++ b/connect/client_test.go @@ -353,7 +353,7 @@ func Test_restClient_CreateItemError(t *testing.T) { func Test_restClient_UpdateItem(t *testing.T) { mockHTTPClient.Dofunc = updateItem - item, err := testClient.UpdateItem(generateItem(defaultVault), defaultVault) + item, err := testClient.UpdateItem(generateItem(defaultVault)) if err != nil { t.Logf("Unable to update item: %s", err.Error()) @@ -370,7 +370,7 @@ func Test_restClient_UpdateItemError(t *testing.T) { errResult := apiError(http.StatusBadRequest, "Missing required field") mockHTTPClient.Dofunc = respondError(errResult) - item, err := testClient.UpdateItem(generateItem(defaultVault), defaultVault) + item, err := testClient.UpdateItem(generateItem(defaultVault)) assert.ErrorIs(t, err, errResult) if item != nil { @@ -381,7 +381,7 @@ func Test_restClient_UpdateItemError(t *testing.T) { func Test_restClient_DeleteItem(t *testing.T) { mockHTTPClient.Dofunc = deleteItem - err := testClient.DeleteItem(generateItem(defaultVault), defaultVault) + err := testClient.DeleteItem(generateItem(defaultVault)) if err != nil { t.Logf("Unable to delete item: %s", err.Error()) @@ -403,7 +403,7 @@ func Test_restClient_DeleteItemError(t *testing.T) { errResult := apiError(http.StatusNotFound, "Vault not found") mockHTTPClient.Dofunc = respondError(errResult) - err := testClient.DeleteItem(generateItem(defaultVault), defaultVault) + err := testClient.DeleteItem(generateItem(defaultVault)) assert.ErrorIs(t, err, errResult) } From e6adae656bdb15d38d0c1e9e2f6b98f1fe230b62 Mon Sep 17 00:00:00 2001 From: Horia Culea Date: Wed, 1 Dec 2021 14:48:38 +0000 Subject: [PATCH 3/7] Fix failing tests --- connect/client_test.go | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/connect/client_test.go b/connect/client_test.go index 7923847..8591a8a 100644 --- a/connect/client_test.go +++ b/connect/client_test.go @@ -35,6 +35,8 @@ type mockClient struct { Dofunc func(req *http.Request) (*http.Response, error) } +const testVaultID = "4eh55wjehsta5f376ggwsplxs4" + func (mc *mockClient) Do(req *http.Request) (*http.Response, error) { resp, err := mc.Dofunc(req) if err != nil { @@ -191,7 +193,7 @@ func Test_restClient_GetVault(t *testing.T) { expectedVault := &onepassword.Vault{ Name: "Test vault", Description: "Test Vault description", - ID: uuid.New().String(), + ID: "4eh55wjehsta5f376ggwsplxs4", } mockHTTPClient.Dofunc = getVault(expectedVault) @@ -212,7 +214,7 @@ func Test_restClient_GetVaultEmptyUUID(t *testing.T) { func Test_restClient_GetVaultError(t *testing.T) { errResult := apiError(http.StatusNotFound, "Vault not found") mockHTTPClient.Dofunc = respondError(errResult) - _, err := testClient.GetVault(uuid.New().String()) + _, err := testClient.GetVault("4eh55wjehsta5f376ggwsplxs4") assert.ErrorIs(t, err, errResult) } @@ -234,7 +236,7 @@ func Test_restClient_GetVaultsByTitle(t *testing.T) { func Test_restClient_GetItem(t *testing.T) { mockHTTPClient.Dofunc = getItem - item, err := testClient.GetItem(uuid.New().String(), uuid.New().String()) + item, err := testClient.GetItem("4eh55wjehsta5f376ggwsplxs4", "4eh55wjehsta5f376ggwsplxs4") if err != nil { t.Logf("Unable to get items: %s", err.Error()) @@ -250,7 +252,7 @@ func Test_restClient_GetItem(t *testing.T) { func Test_restClient_GetItemNotFound(t *testing.T) { errResult := apiError(http.StatusNotFound, "item not found") mockHTTPClient.Dofunc = respondError(errResult) - item, err := testClient.GetItem(uuid.New().String(), uuid.New().String()) + item, err := testClient.GetItem("4eh55wjehsta5f376ggwsplxs4", "4eh55wjehsta5f376ggwsplxs4") assert.ErrorIs(t, err, errResult) if item != nil { @@ -261,7 +263,7 @@ func Test_restClient_GetItemNotFound(t *testing.T) { func Test_restClient_GetItems(t *testing.T) { mockHTTPClient.Dofunc = listItems - items, err := testClient.GetItems(uuid.New().String()) + items, err := testClient.GetItems("4eh55wjehsta5f376ggwsplxs4") if err != nil { t.Logf("Unable to get item: %s", err.Error()) @@ -276,7 +278,7 @@ func Test_restClient_GetItems(t *testing.T) { func Test_restClient_GetItemsByTitle(t *testing.T) { mockHTTPClient.Dofunc = listItems - items, err := testClient.GetItemsByTitle("test", uuid.New().String()) + items, err := testClient.GetItemsByTitle("test", "4eh55wjehsta5f376ggwsplxs4") if err != nil { t.Logf("Unable to get item: %s", err.Error()) @@ -293,7 +295,7 @@ func Test_restClient_GetItemByTitle(t *testing.T) { defer reset() mockHTTPClient.Dofunc = getItemByID - item, err := testClient.GetItemByTitle("test", uuid.New().String()) + item, err := testClient.GetItemByTitle("test", "4eh55wjehsta5f376ggwsplxs4") if err != nil { t.Logf("Unable to get item: %s", err.Error()) @@ -311,7 +313,7 @@ func Test_restClient_GetItemByNonUniqueTitle(t *testing.T) { defer reset() mockHTTPClient.Dofunc = getItemByID - item, err := testClient.GetItemByTitle("test", uuid.New().String()) + item, err := testClient.GetItemByTitle("test", "4eh55wjehsta5f376ggwsplxs4") if err == nil { t.Log("Expected too many items") @@ -419,7 +421,7 @@ func Test_restClient_DeleteItemByIdError(t *testing.T) { func Test_restClient_GetFile(t *testing.T) { mockHTTPClient.Dofunc = getFile - file, err := testClient.GetFile(uuid.New().String(), uuid.New().String(), uuid.New().String()) + file, err := testClient.GetFile("4eh55wjehsta5f376ggwsplxs4", "4eh55wjehsta5f376ggwsplxs4", "4eh55wjehsta5f376ggwsplxs4") assert.Nil(t, err) assert.NotNil(t, file) @@ -428,7 +430,7 @@ func Test_restClient_GetFile(t *testing.T) { func Test_restClient_GetFileNotFound(t *testing.T) { errResult := apiError(http.StatusNotFound, "File not found") mockHTTPClient.Dofunc = respondError(errResult) - _, err := testClient.GetFile(uuid.New().String(), uuid.New().String(), uuid.New().String()) + _, err := testClient.GetFile("4eh55wjehsta5f376ggwsplxs4", "4eh55wjehsta5f376ggwsplxs4", "4eh55wjehsta5f376ggwsplxs4") assert.ErrorIs(t, err, errResult) } @@ -499,7 +501,7 @@ func listVaults(req *http.Request) (*http.Response, error) { vaults := []onepassword.Vault{ { Description: "Test Vault", - ID: uuid.New().String(), + ID: "4eh55wjehsta5f376ggwsplxs4", }, } @@ -535,11 +537,11 @@ func generateComplexItem(vaultUUID string, itemUUID string) *onepassword.Item { Label: "section", }}, Fields: []*onepassword.ItemField{{ - ID: uuid.New().String(), + ID: "4eh55wjehsta5f376ggwsplxs4", Label: "username", Value: "wendy", }, { - ID: uuid.New().String(), + ID: "4eh55wjehsta5f376ggwsplxs4", Label: "password", Value: "appleseed", Section: &onepassword.ItemSection{ @@ -553,7 +555,7 @@ func generateComplexItem(vaultUUID string, itemUUID string) *onepassword.Item { func generateItem(vaultUUID string) *onepassword.Item { return &onepassword.Item{ - ID: uuid.New().String(), + ID: "4eh55wjehsta5f376ggwsplxs4", Vault: onepassword.ItemVault{ ID: vaultUUID, }, @@ -703,7 +705,7 @@ func deleteItem(req *http.Request) (*http.Response, error) { func generateFile() *onepassword.File { return &onepassword.File{ - ID: uuid.New().String(), + ID: "4eh55wjehsta5f376ggwsplxs4", Name: "testfile.txt", ContentPath: "/v1/files/xbqdtnehinocwuz23c7l7jiagy/content", } From df50b1575a25c5aa2df30c7c97ddbfc5a1f3f03a Mon Sep 17 00:00:00 2001 From: Horia Culea Date: Wed, 1 Dec 2021 14:52:13 +0000 Subject: [PATCH 4/7] Fix failing tests --- connect/client_test.go | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/connect/client_test.go b/connect/client_test.go index 8591a8a..4a8af08 100644 --- a/connect/client_test.go +++ b/connect/client_test.go @@ -35,7 +35,7 @@ type mockClient struct { Dofunc func(req *http.Request) (*http.Response, error) } -const testVaultID = "4eh55wjehsta5f376ggwsplxs4" +const testID = "4eh55wjehsta5f376ggwsplxs4" func (mc *mockClient) Do(req *http.Request) (*http.Response, error) { resp, err := mc.Dofunc(req) @@ -193,7 +193,7 @@ func Test_restClient_GetVault(t *testing.T) { expectedVault := &onepassword.Vault{ Name: "Test vault", Description: "Test Vault description", - ID: "4eh55wjehsta5f376ggwsplxs4", + ID: testID, } mockHTTPClient.Dofunc = getVault(expectedVault) @@ -208,13 +208,13 @@ func Test_restClient_GetVaultEmptyUUID(t *testing.T) { mockHTTPClient.Dofunc = respondError(errResult) _, err := testClient.GetVault("") - assert.EqualError(t, err, "no uuid provided") + assert.EqualError(t, err, "malformed vault uuid provided") } func Test_restClient_GetVaultError(t *testing.T) { errResult := apiError(http.StatusNotFound, "Vault not found") mockHTTPClient.Dofunc = respondError(errResult) - _, err := testClient.GetVault("4eh55wjehsta5f376ggwsplxs4") + _, err := testClient.GetVault(testID) assert.ErrorIs(t, err, errResult) } @@ -236,7 +236,7 @@ func Test_restClient_GetVaultsByTitle(t *testing.T) { func Test_restClient_GetItem(t *testing.T) { mockHTTPClient.Dofunc = getItem - item, err := testClient.GetItem("4eh55wjehsta5f376ggwsplxs4", "4eh55wjehsta5f376ggwsplxs4") + item, err := testClient.GetItem(testID, testID) if err != nil { t.Logf("Unable to get items: %s", err.Error()) @@ -252,7 +252,7 @@ func Test_restClient_GetItem(t *testing.T) { func Test_restClient_GetItemNotFound(t *testing.T) { errResult := apiError(http.StatusNotFound, "item not found") mockHTTPClient.Dofunc = respondError(errResult) - item, err := testClient.GetItem("4eh55wjehsta5f376ggwsplxs4", "4eh55wjehsta5f376ggwsplxs4") + item, err := testClient.GetItem(testID, testID) assert.ErrorIs(t, err, errResult) if item != nil { @@ -263,7 +263,7 @@ func Test_restClient_GetItemNotFound(t *testing.T) { func Test_restClient_GetItems(t *testing.T) { mockHTTPClient.Dofunc = listItems - items, err := testClient.GetItems("4eh55wjehsta5f376ggwsplxs4") + items, err := testClient.GetItems(testID) if err != nil { t.Logf("Unable to get item: %s", err.Error()) @@ -278,7 +278,7 @@ func Test_restClient_GetItems(t *testing.T) { func Test_restClient_GetItemsByTitle(t *testing.T) { mockHTTPClient.Dofunc = listItems - items, err := testClient.GetItemsByTitle("test", "4eh55wjehsta5f376ggwsplxs4") + items, err := testClient.GetItemsByTitle("test", testID) if err != nil { t.Logf("Unable to get item: %s", err.Error()) @@ -295,7 +295,7 @@ func Test_restClient_GetItemByTitle(t *testing.T) { defer reset() mockHTTPClient.Dofunc = getItemByID - item, err := testClient.GetItemByTitle("test", "4eh55wjehsta5f376ggwsplxs4") + item, err := testClient.GetItemByTitle("test", testID) if err != nil { t.Logf("Unable to get item: %s", err.Error()) @@ -313,7 +313,7 @@ func Test_restClient_GetItemByNonUniqueTitle(t *testing.T) { defer reset() mockHTTPClient.Dofunc = getItemByID - item, err := testClient.GetItemByTitle("test", "4eh55wjehsta5f376ggwsplxs4") + item, err := testClient.GetItemByTitle("test", testID) if err == nil { t.Log("Expected too many items") @@ -421,7 +421,7 @@ func Test_restClient_DeleteItemByIdError(t *testing.T) { func Test_restClient_GetFile(t *testing.T) { mockHTTPClient.Dofunc = getFile - file, err := testClient.GetFile("4eh55wjehsta5f376ggwsplxs4", "4eh55wjehsta5f376ggwsplxs4", "4eh55wjehsta5f376ggwsplxs4") + file, err := testClient.GetFile(testID, testID, testID) assert.Nil(t, err) assert.NotNil(t, file) @@ -430,7 +430,7 @@ func Test_restClient_GetFile(t *testing.T) { func Test_restClient_GetFileNotFound(t *testing.T) { errResult := apiError(http.StatusNotFound, "File not found") mockHTTPClient.Dofunc = respondError(errResult) - _, err := testClient.GetFile("4eh55wjehsta5f376ggwsplxs4", "4eh55wjehsta5f376ggwsplxs4", "4eh55wjehsta5f376ggwsplxs4") + _, err := testClient.GetFile(testID, testID, testID) assert.ErrorIs(t, err, errResult) } @@ -464,8 +464,8 @@ func Test_restClient_loadStructFromItem(t *testing.T) { mockHTTPClient.Dofunc = getComplexItem item := parsedItem{ - vaultUUID: "", - itemUUID: "", + vaultUUID: testID, + itemUUID: testID, } c := testConfig{} @@ -501,7 +501,7 @@ func listVaults(req *http.Request) (*http.Response, error) { vaults := []onepassword.Vault{ { Description: "Test Vault", - ID: "4eh55wjehsta5f376ggwsplxs4", + ID: testID, }, } @@ -537,11 +537,11 @@ func generateComplexItem(vaultUUID string, itemUUID string) *onepassword.Item { Label: "section", }}, Fields: []*onepassword.ItemField{{ - ID: "4eh55wjehsta5f376ggwsplxs4", + ID: testID, Label: "username", Value: "wendy", }, { - ID: "4eh55wjehsta5f376ggwsplxs4", + ID: testID, Label: "password", Value: "appleseed", Section: &onepassword.ItemSection{ @@ -555,7 +555,7 @@ func generateComplexItem(vaultUUID string, itemUUID string) *onepassword.Item { func generateItem(vaultUUID string) *onepassword.Item { return &onepassword.Item{ - ID: "4eh55wjehsta5f376ggwsplxs4", + ID: testID, Vault: onepassword.ItemVault{ ID: vaultUUID, }, @@ -705,7 +705,7 @@ func deleteItem(req *http.Request) (*http.Response, error) { func generateFile() *onepassword.File { return &onepassword.File{ - ID: "4eh55wjehsta5f376ggwsplxs4", + ID: testID, Name: "testfile.txt", ContentPath: "/v1/files/xbqdtnehinocwuz23c7l7jiagy/content", } From 541a5642f7c504a0aed05c1414bd2a0d99719a65 Mon Sep 17 00:00:00 2001 From: Horia Culea Date: Wed, 1 Dec 2021 15:02:53 +0000 Subject: [PATCH 5/7] Fix failing tests --- connect/client_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/connect/client_test.go b/connect/client_test.go index 4a8af08..64b9709 100644 --- a/connect/client_test.go +++ b/connect/client_test.go @@ -581,7 +581,7 @@ func listItems(req *http.Request) (*http.Response, error) { } func getItemByID(req *http.Request) (*http.Response, error) { - vaultUUID := "" + vaultUUID := testID excessPath := "" fmt.Sscanf(req.URL.Path, "/v1/vaults/%s%s", vaultUUID, excessPath) From e0909c93b4d9b0cbf872d72ca6a84c36d60397b3 Mon Sep 17 00:00:00 2001 From: Horia Culea <45151601+hculea@users.noreply.github.com> Date: Fri, 10 Dec 2021 11:33:12 +0100 Subject: [PATCH 6/7] Add vaultUUID to all function signatures --- connect/client.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/connect/client.go b/connect/client.go index 4f28089..61c48cc 100644 --- a/connect/client.go +++ b/connect/client.go @@ -36,8 +36,8 @@ type Client interface { GetItemsByTitle(title string, vaultUUID string) ([]onepassword.Item, error) GetItemByTitle(title string, vaultUUID string) (*onepassword.Item, error) CreateItem(item *onepassword.Item, vaultUUID string) (*onepassword.Item, error) - UpdateItem(item *onepassword.Item) (*onepassword.Item, error) - DeleteItem(item *onepassword.Item) error + UpdateItem(item *onepassword.Item, vaultUUID string) (*onepassword.Item, error) + DeleteItem(item *onepassword.Item, vaultUUID string) error DeleteItemByID(itemUUID string, vaultUUID string) error GetFiles(itemUUID string, vaultUUID string) ([]onepassword.File, error) GetFile(fileUUID string, itemUUID string, vaultUUID string) (*onepassword.File, error) @@ -323,7 +323,7 @@ func (rs *restClient) CreateItem(item *onepassword.Item, vaultUUID string) (*one } // UpdateItem Update a new item in a specified vault -func (rs *restClient) UpdateItem(item *onepassword.Item) (*onepassword.Item, error) { +func (rs *restClient) UpdateItem(item *onepassword.Item, vaultUUID string) (*onepassword.Item, error) { span := rs.tracer.StartSpan("UpdateItem") defer span.Finish() @@ -352,7 +352,7 @@ func (rs *restClient) UpdateItem(item *onepassword.Item) (*onepassword.Item, err } // DeleteItem Delete a new item in a specified vault -func (rs *restClient) DeleteItem(item *onepassword.Item) error { +func (rs *restClient) DeleteItem(item *onepassword.Item, vaultUUID string) error { span := rs.tracer.StartSpan("DeleteItem") defer span.Finish() From f5226937cda98a9e65f6bb69110aad035b962e85 Mon Sep 17 00:00:00 2001 From: Horia Culea Date: Fri, 10 Dec 2021 11:56:24 +0100 Subject: [PATCH 7/7] Export uuid-related errors --- connect/client.go | 61 +++++++++++++++++++++++------------------- connect/client_test.go | 8 +++--- 2 files changed, 37 insertions(+), 32 deletions(-) diff --git a/connect/client.go b/connect/client.go index 61c48cc..32c9135 100644 --- a/connect/client.go +++ b/connect/client.go @@ -3,7 +3,6 @@ package connect import ( "bytes" "encoding/json" - "errors" "fmt" "io" "io/ioutil" @@ -26,6 +25,12 @@ const ( defaultUserAgent = "connect-sdk-go/%s" ) +var ( + vaultUUIDError = fmt.Errorf("malformed vault uuid provided") + itemUUIDError = fmt.Errorf("malformed item uuid provided") + fileUUIDError = fmt.Errorf("malformed file uuid provided") +) + // Client Represents an available 1Password Connect API to connect to type Client interface { GetVaults() ([]onepassword.Vault, error) @@ -137,7 +142,7 @@ func (rs *restClient) GetVaults() ([]onepassword.Vault, error) { // GetVaults Get a list of all available vaults func (rs *restClient) GetVault(uuid string) (*onepassword.Vault, error) { if !isValidUUID(uuid) { - return nil, errors.New("malformed vault uuid provided") + return nil, vaultUUIDError } span := rs.tracer.StartSpan("GetVault") @@ -188,12 +193,12 @@ func (rs *restClient) GetVaultsByTitle(title string) ([]onepassword.Vault, error // GetItem Get a specific Item from the 1Password Connect API func (rs *restClient) GetItem(uuid string, vaultUUID string) (*onepassword.Item, error) { if !isValidUUID(uuid) { - return nil, errors.New("malformed item uuid provided") + return nil, itemUUIDError } if !isValidUUID(vaultUUID) { - return nil, errors.New("malformed vault uuid provided") + return nil, vaultUUIDError } - + span := rs.tracer.StartSpan("GetItem") defer span.Finish() @@ -217,9 +222,9 @@ func (rs *restClient) GetItem(uuid string, vaultUUID string) (*onepassword.Item, func (rs *restClient) GetItemByTitle(title string, vaultUUID string) (*onepassword.Item, error) { if !isValidUUID(vaultUUID) { - return nil, errors.New("malformed vault uuid provided") + return nil, vaultUUIDError } - + span := rs.tracer.StartSpan("GetItemByTitle") defer span.Finish() items, err := rs.GetItemsByTitle(title, vaultUUID) @@ -236,9 +241,9 @@ func (rs *restClient) GetItemByTitle(title string, vaultUUID string) (*onepasswo func (rs *restClient) GetItemsByTitle(title string, vaultUUID string) ([]onepassword.Item, error) { if !isValidUUID(vaultUUID) { - return nil, errors.New("malformed vault uuid provided") + return nil, vaultUUIDError } - + span := rs.tracer.StartSpan("GetItemsByTitle") defer span.Finish() @@ -264,9 +269,9 @@ func (rs *restClient) GetItemsByTitle(title string, vaultUUID string) ([]onepass func (rs *restClient) GetItems(vaultUUID string) ([]onepassword.Item, error) { if !isValidUUID(vaultUUID) { - return nil, errors.New("malformed vault uuid provided") + return nil, vaultUUIDError } - + span := rs.tracer.StartSpan("GetItems") defer span.Finish() @@ -292,9 +297,9 @@ func (rs *restClient) GetItems(vaultUUID string) ([]onepassword.Item, error) { // CreateItem Create a new item in a specified vault func (rs *restClient) CreateItem(item *onepassword.Item, vaultUUID string) (*onepassword.Item, error) { if !isValidUUID(vaultUUID) { - return nil, errors.New("malformed vault uuid provided") + return nil, vaultUUIDError } - + span := rs.tracer.StartSpan("CreateItem") defer span.Finish() @@ -377,12 +382,12 @@ func (rs *restClient) DeleteItem(item *onepassword.Item, vaultUUID string) error // DeleteItem Delete a new item in a specified vault, specifying the item's uuid func (rs *restClient) DeleteItemByID(itemUUID string, vaultUUID string) error { if !isValidUUID(itemUUID) { - return errors.New("malformed item uuid provided") + return itemUUIDError } if !isValidUUID(vaultUUID) { - return errors.New("malformed vault uuid provided") + return vaultUUIDError } - + span := rs.tracer.StartSpan("DeleteItemByID") defer span.Finish() @@ -406,12 +411,12 @@ func (rs *restClient) DeleteItemByID(itemUUID string, vaultUUID string) error { func (rs *restClient) GetFiles(itemUUID string, vaultUUID string) ([]onepassword.File, error) { if !isValidUUID(vaultUUID) { - return nil, errors.New("malformed vault uuid provided") + return nil, vaultUUIDError } if !isValidUUID(itemUUID) { - return nil, errors.New("malformed item uuid provided") + return nil, itemUUIDError } - + span := rs.tracer.StartSpan("GetFiles") defer span.Finish() @@ -439,15 +444,15 @@ func (rs *restClient) GetFiles(itemUUID string, vaultUUID string) ([]onepassword // This does not include the file contents. Call GetFileContent() to load the file's content. func (rs *restClient) GetFile(uuid string, itemUUID string, vaultUUID string) (*onepassword.File, error) { if !isValidUUID(uuid) { - return nil, errors.New("malformed file uuid provided") + return nil, fileUUIDError } if !isValidUUID(itemUUID) { - return nil, errors.New("malformed item uuid provided") + return nil, itemUUIDError } if !isValidUUID(vaultUUID) { - return nil, errors.New("malformed vault uuid provided") + return nil, vaultUUIDError } - + span := rs.tracer.StartSpan("GetFile") defer span.Finish() @@ -595,10 +600,10 @@ func loadToStruct(item *parsedItem, config reflect.Value) error { func (rs *restClient) LoadStructFromItem(i interface{}, itemUUID string, vaultUUID string) error { if !isValidUUID(itemUUID) { - return errors.New("malformed item uuid provided") + return itemUUIDError } if !isValidUUID(vaultUUID) { - return errors.New("malformed vault uuid provided") + return vaultUUIDError } config, err := checkStruct(i) if err != nil { @@ -621,9 +626,9 @@ func (rs *restClient) LoadStructFromItem(i interface{}, itemUUID string, vaultUU // LoadConfigFromItem Load configuration values based on struct tag from one 1P item func (rs *restClient) LoadStructFromItemByTitle(i interface{}, itemTitle string, vaultUUID string) error { if !isValidUUID(vaultUUID) { - return errors.New("malformed vault uuid provided") + return vaultUUIDError } - + config, err := checkStruct(i) if err != nil { return err @@ -675,7 +680,7 @@ func (rs *restClient) LoadStruct(i interface{}) error { return err } if !isValidUUID(itemVault) { - return errors.New("malformed vault uuid provided") + return vaultUUIDError } key := fmt.Sprintf("%s/%s", itemVault, tag) diff --git a/connect/client_test.go b/connect/client_test.go index 64b9709..f9c17ca 100644 --- a/connect/client_test.go +++ b/connect/client_test.go @@ -355,7 +355,7 @@ func Test_restClient_CreateItemError(t *testing.T) { func Test_restClient_UpdateItem(t *testing.T) { mockHTTPClient.Dofunc = updateItem - item, err := testClient.UpdateItem(generateItem(defaultVault)) + item, err := testClient.UpdateItem(generateItem(defaultVault), "") if err != nil { t.Logf("Unable to update item: %s", err.Error()) @@ -372,7 +372,7 @@ func Test_restClient_UpdateItemError(t *testing.T) { errResult := apiError(http.StatusBadRequest, "Missing required field") mockHTTPClient.Dofunc = respondError(errResult) - item, err := testClient.UpdateItem(generateItem(defaultVault)) + item, err := testClient.UpdateItem(generateItem(defaultVault), "") assert.ErrorIs(t, err, errResult) if item != nil { @@ -383,7 +383,7 @@ func Test_restClient_UpdateItemError(t *testing.T) { func Test_restClient_DeleteItem(t *testing.T) { mockHTTPClient.Dofunc = deleteItem - err := testClient.DeleteItem(generateItem(defaultVault)) + err := testClient.DeleteItem(generateItem(defaultVault), "") if err != nil { t.Logf("Unable to delete item: %s", err.Error()) @@ -405,7 +405,7 @@ func Test_restClient_DeleteItemError(t *testing.T) { errResult := apiError(http.StatusNotFound, "Vault not found") mockHTTPClient.Dofunc = respondError(errResult) - err := testClient.DeleteItem(generateItem(defaultVault)) + err := testClient.DeleteItem(generateItem(defaultVault), "") assert.ErrorIs(t, err, errResult) }