From e1ceb1e62904abc3586ca9d35ac85685e600c0f6 Mon Sep 17 00:00:00 2001 From: Jeff Malnick Date: Mon, 5 Oct 2020 20:36:16 -0700 Subject: [PATCH] feat: refactor prefix format errors --- .../handlers/host_sets/host_set_service.go | 18 +++++++++++++----- .../servers/controller/handlers/verifiers.go | 2 ++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/internal/servers/controller/handlers/host_sets/host_set_service.go b/internal/servers/controller/handlers/host_sets/host_set_service.go index 0b8389afc4..0d548d1394 100644 --- a/internal/servers/controller/handlers/host_sets/host_set_service.go +++ b/internal/servers/controller/handlers/host_sets/host_set_service.go @@ -412,6 +412,10 @@ func toProto(in *static.HostSet, hs []*static.Host) *pb.HostSet { return &out } +func invalidResourcePrefix(r, p string) string { + return fmt.Sprintf("The resource ID prefix is incorrectly formatted, '%s' resources begin with '%s'", r, p) +} + // A validateX method should exist for each method above. These methods do not make calls to any backing service but enforce // requirements on the structure of the request. They verify that: // * The path passed in is correctly formatted @@ -426,14 +430,15 @@ func validateGetRequest(req *pbs.GetHostSetRequest) error { func validateCreateRequest(req *pbs.CreateHostSetRequest) error { return handlers.ValidateCreateRequest(req.GetItem(), func() map[string]string { badFields := map[string]string{} - if !handlers.ValidId(static.HostCatalogPrefix, req.GetItem().GetHostCatalogId()) { - badFields["host_catalog_id"] = "The field is incorrectly formatted." - } + switch host.SubtypeFromId(req.GetItem().GetHostCatalogId()) { case host.StaticSubtype: if req.GetItem().GetType() != "" && req.GetItem().GetType() != host.StaticSubtype.String() { badFields["type"] = "Doesn't match the parent resource's type." } + if !handlers.ValidId(static.HostCatalogPrefix, req.GetItem().GetHostCatalogId()) { + badFields["host_catalog_id"] = invalidResourcePrefix("Host Catalog", static.HostCatalogPrefix) + } } return badFields }) @@ -458,8 +463,11 @@ func validateDeleteRequest(req *pbs.DeleteHostSetRequest) error { func validateListRequest(req *pbs.ListHostSetsRequest) error { badFields := map[string]string{} - if !handlers.ValidId(static.HostCatalogPrefix, req.GetHostCatalogId()) { - badFields["host_catalog_id"] = "The field is incorrectly formatted." + switch host.SubtypeFromId(req.GetItem().GetHostCatalogId()) { + case host.StaticSubtype: + if !handlers.ValidId(static.HostCatalogPrefix, req.GetItem().GetHostCatalogId()) { + badFields["host_catalog_id"] = invalidResourcePrefix("Host Catalog", static.HostCatalogPrefix) + } } if len(badFields) > 0 { return handlers.InvalidArgumentErrorf("Improperly formatted identifier.", badFields) diff --git a/internal/servers/controller/handlers/verifiers.go b/internal/servers/controller/handlers/verifiers.go index ea7feeca68..71d4ca08aa 100644 --- a/internal/servers/controller/handlers/verifiers.go +++ b/internal/servers/controller/handlers/verifiers.go @@ -149,6 +149,8 @@ func ValidateDeleteRequest(prefix string, r DeleteRequest, fn CustomValidatorFun var reInvalidID = regexp.MustCompile("[^A-Za-z0-9]") +// ValidId verifies the resource prefix to ensure it's a valid resource in the +// Boundary domain model func ValidId(prefix, id string) bool { prefix = prefix + "_" if !strings.HasPrefix(id, prefix) {