From 278902db1a079f393d5dfd9082de15cb28d6b89a Mon Sep 17 00:00:00 2001 From: Todd Knight Date: Wed, 23 Sep 2020 08:30:25 -0700 Subject: [PATCH] Allow target type field to be included in an update. (#412) --- .../handlers/accounts/account_service.go | 2 +- .../authmethods/authmethod_service.go | 2 +- .../handlers/targets/target_service.go | 8 ++++---- .../handlers/targets/target_service_test.go | 19 ++++--------------- 4 files changed, 10 insertions(+), 21 deletions(-) diff --git a/internal/servers/controller/handlers/accounts/account_service.go b/internal/servers/controller/handlers/accounts/account_service.go index b22bb20d4..dbd69f087 100644 --- a/internal/servers/controller/handlers/accounts/account_service.go +++ b/internal/servers/controller/handlers/accounts/account_service.go @@ -448,7 +448,7 @@ func validateUpdateRequest(req *pbs.UpdateAccountRequest) error { switch auth.SubtypeFromId(req.GetId()) { case auth.PasswordSubtype: if req.GetItem().GetType() != "" && req.GetItem().GetType() != auth.PasswordSubtype.String() { - badFields["type"] = "Cannot modify resource type." + badFields["type"] = "Cannot modify the resource type." } pwAttrs := &pb.PasswordAccountAttributes{} if err := handlers.StructToProto(req.GetItem().GetAttributes(), pwAttrs); err != nil { diff --git a/internal/servers/controller/handlers/authmethods/authmethod_service.go b/internal/servers/controller/handlers/authmethods/authmethod_service.go index 55bc8a3b7..2215d10d4 100644 --- a/internal/servers/controller/handlers/authmethods/authmethod_service.go +++ b/internal/servers/controller/handlers/authmethods/authmethod_service.go @@ -365,7 +365,7 @@ func validateUpdateRequest(req *pbs.UpdateAuthMethodRequest) error { switch auth.SubtypeFromId(req.GetId()) { case auth.PasswordSubtype: if req.GetItem().GetType() != "" && auth.SubtypeFromType(req.GetItem().GetType()) != auth.PasswordSubtype { - badFields["type"] = "Cannot modify resource type." + badFields["type"] = "Cannot modify the resource type." } pwAttrs := &pb.PasswordAuthMethodAttributes{} if err := handlers.StructToProto(req.GetItem().GetAttributes(), pwAttrs); err != nil { diff --git a/internal/servers/controller/handlers/targets/target_service.go b/internal/servers/controller/handlers/targets/target_service.go index 65e0e260f..7d656a9d5 100644 --- a/internal/servers/controller/handlers/targets/target_service.go +++ b/internal/servers/controller/handlers/targets/target_service.go @@ -749,8 +749,11 @@ func validateUpdateRequest(req *pbs.UpdateTargetRequest) error { if req.GetItem().GetSessionMaxSeconds() != nil && req.GetItem().GetSessionMaxSeconds().GetValue() == 0 { badFields["session_max_seconds"] = "This must be greater than zero." } - switch target.SubtypeFromType(req.GetItem().GetType()) { + switch target.SubtypeFromId(req.GetItem().GetType()) { case target.TcpSubType: + if req.GetItem().GetType() != "" && target.SubtypeFromType(req.GetItem().GetType()) != target.TcpSubType { + badFields["type"] = "Cannot modify the resource type." + } tcpAttrs := &pb.TcpTargetAttributes{} if err := handlers.StructToProto(req.GetItem().GetAttributes(), tcpAttrs); err != nil { badFields["attributes"] = "Attribute fields do not match the expected format." @@ -759,9 +762,6 @@ func validateUpdateRequest(req *pbs.UpdateTargetRequest) error { badFields["attributes.default_port"] = "This optional field cannot be set to 0." } } - if req.GetItem().GetType() != "" { - badFields["type"] = "This field cannot be updated." - } return badFields }) } diff --git a/internal/servers/controller/handlers/targets/target_service_test.go b/internal/servers/controller/handlers/targets/target_service_test.go index 725fdae5d..4b8f3d422 100644 --- a/internal/servers/controller/handlers/targets/target_service_test.go +++ b/internal/servers/controller/handlers/targets/target_service_test.go @@ -462,13 +462,14 @@ func TestUpdate(t *testing.T) { name: "Update an Existing Target", req: &pbs.UpdateTargetRequest{ UpdateMask: &field_mask.FieldMask{ - Paths: []string{"name", "description", "session_max_seconds", "session_connection_limit"}, + Paths: []string{"name", "description", "session_max_seconds", "session_connection_limit", "type"}, }, Item: &pb.Target{ Name: wrapperspb.String("name"), Description: wrapperspb.String("desc"), SessionMaxSeconds: wrapperspb.UInt32(3600), SessionConnectionLimit: wrapperspb.Int32(5), + Type: target.TcpSubType.String(), }, }, res: &pbs.UpdateTargetResponse{ @@ -494,11 +495,12 @@ func TestUpdate(t *testing.T) { name: "Multiple Paths in single string", req: &pbs.UpdateTargetRequest{ UpdateMask: &field_mask.FieldMask{ - Paths: []string{"name,description"}, + Paths: []string{"name,description,type"}, }, Item: &pb.Target{ Name: wrapperspb.String("name"), Description: wrapperspb.String("desc"), + Type: target.TcpSubType.String(), }, }, res: &pbs.UpdateTargetResponse{ @@ -721,19 +723,6 @@ func TestUpdate(t *testing.T) { res: nil, err: handlers.ApiErrorWithCode(codes.InvalidArgument), }, - { - name: "Valid mask, cant specify type", - req: &pbs.UpdateTargetRequest{ - UpdateMask: &field_mask.FieldMask{ - Paths: []string{"name"}, - }, - Item: &pb.Target{ - Type: "Unknown", - }, - }, - res: nil, - err: handlers.ApiErrorWithCode(codes.InvalidArgument), - }, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) {