From 03f0dcc7b433d99cfb86a2d8c611386f1ea4ea53 Mon Sep 17 00:00:00 2001 From: Miguel Martinez Trivino Date: Wed, 20 Nov 2024 14:23:43 +0100 Subject: [PATCH] chore: do not validate contract on reading (#1552) Signed-off-by: Miguel Martinez --- app/controlplane/pkg/biz/workflowcontract.go | 2 +- app/controlplane/pkg/data/workflowcontract.go | 5 +++- .../pkg/policies/policyprovider.go | 2 +- app/controlplane/pkg/unmarshal/unmarshal.go | 28 +++++++++++++------ 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/app/controlplane/pkg/biz/workflowcontract.go b/app/controlplane/pkg/biz/workflowcontract.go index f2c792a87..46f306d58 100644 --- a/app/controlplane/pkg/biz/workflowcontract.go +++ b/app/controlplane/pkg/biz/workflowcontract.go @@ -476,7 +476,7 @@ func (uc *WorkflowContractUseCase) findProvider(providerName string) (*policies. // UnmarshalAndValidateRawContract Takes the raw contract + format and will unmarshal the contract and validate it func UnmarshalAndValidateRawContract(raw []byte, format unmarshal.RawFormat) (*Contract, error) { contract := &schemav1.CraftingSchema{} - err := unmarshal.UnmarshalFromRaw(raw, format, contract) + err := unmarshal.FromRaw(raw, format, contract, true) if err != nil { return nil, NewErrValidation(err) } diff --git a/app/controlplane/pkg/data/workflowcontract.go b/app/controlplane/pkg/data/workflowcontract.go index fb3ce5a25..a05517939 100644 --- a/app/controlplane/pkg/data/workflowcontract.go +++ b/app/controlplane/pkg/data/workflowcontract.go @@ -28,6 +28,7 @@ import ( "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/workflow" "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/workflowcontract" "github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/workflowcontractversion" + "github.com/chainloop-dev/chainloop/app/controlplane/pkg/unmarshal" "github.com/go-kratos/kratos/v2/log" "github.com/google/uuid" "google.golang.org/protobuf/proto" @@ -311,10 +312,12 @@ func entContractVersionToBizContractVersion(w *ent.WorkflowContractVersion) (*bi // Scenario 2: contracts that have been updated after the introduction of the raw_body field will have the raw_body field populated // but we also want to keep the Body field populated for backward compatibility } else if len(w.Body) == 0 { - contract, err = biz.UnmarshalAndValidateRawContract(w.RawBody, w.RawBodyFormat) + schema := &schemav1.CraftingSchema{} + err := unmarshal.FromRaw(w.RawBody, w.RawBodyFormat, schema, false) if err != nil { return nil, fmt.Errorf("failed to unmarshal raw body: %w", err) } + contract.Schema = schema } return &biz.WorkflowContractVersion{ diff --git a/app/controlplane/pkg/policies/policyprovider.go b/app/controlplane/pkg/policies/policyprovider.go index ff07b3136..04f7e0691 100644 --- a/app/controlplane/pkg/policies/policyprovider.go +++ b/app/controlplane/pkg/policies/policyprovider.go @@ -191,7 +191,7 @@ func unmarshalFromRaw(raw *RawMessage, out proto.Message) error { return fmt.Errorf("unsupported format: %s", raw.Format) } - err := unmarshal.UnmarshalFromRaw(raw.Body, format, out) + err := unmarshal.FromRaw(raw.Body, format, out, false) if err != nil { return fmt.Errorf("error unmarshalling policy response: %w", err) } diff --git a/app/controlplane/pkg/unmarshal/unmarshal.go b/app/controlplane/pkg/unmarshal/unmarshal.go index 94e97fa03..bca04a0cd 100644 --- a/app/controlplane/pkg/unmarshal/unmarshal.go +++ b/app/controlplane/pkg/unmarshal/unmarshal.go @@ -45,10 +45,15 @@ func (RawFormat) Values() (kinds []string) { return } -func UnmarshalFromRaw(body []byte, format RawFormat, out proto.Message) error { - validator, err := protovalidate.New() - if err != nil { - return fmt.Errorf("could not create validator: %w", err) +func FromRaw(body []byte, format RawFormat, out proto.Message, doValidate bool) error { + var validator *protovalidate.Validator + var err error + + if doValidate { + validator, err = protovalidate.New() + if err != nil { + return fmt.Errorf("could not create validator: %w", err) + } } switch format { @@ -58,7 +63,11 @@ func UnmarshalFromRaw(body []byte, format RawFormat, out proto.Message) error { } case RawFormatYAML: // protoyaml allows validating the contract while unmarshalling - yamlOpts := protoyaml.UnmarshalOptions{Validator: validator} + yamlOpts := protoyaml.UnmarshalOptions{} + if doValidate { + yamlOpts.Validator = validator + } + if err := yamlOpts.Unmarshal(body, out); err != nil { return fmt.Errorf("error unmarshalling raw message: %w", err) } @@ -77,10 +86,13 @@ func UnmarshalFromRaw(body []byte, format RawFormat, out proto.Message) error { return fmt.Errorf("unsupported format: %s", format) } - err = validator.Validate(out) - if err != nil { - return fmt.Errorf("error validating raw message: %w", err) + if validator != nil { + err = validator.Validate(out) + if err != nil { + return fmt.Errorf("error validating raw message: %w", err) + } } + return nil }