diff --git a/pkg/types/alpine/v0.0.1/entry.go b/pkg/types/alpine/v0.0.1/entry.go index c27a3ae49f0ca76de42579a8aaec7059a94776c8..18c1c7fe43534ee0d78f8425d789c4405bbe9522 100644 --- a/pkg/types/alpine/v0.0.1/entry.go +++ b/pkg/types/alpine/v0.0.1/entry.go @@ -138,19 +138,7 @@ func (v *V001Entry) fetchExternalEntities(ctx context.Context) error { defer hashR.Close() defer apkR.Close() - closePipesOnError := func(err error) error { - pipeReaders := []*io.PipeReader{hashR, apkR} - pipeWriters := []*io.PipeWriter{hashW, apkW} - for idx := range pipeReaders { - if e := pipeReaders[idx].CloseWithError(err); e != nil { - log.Logger.Error(fmt.Errorf("error closing pipe: %w", e)) - } - if e := pipeWriters[idx].CloseWithError(err); e != nil { - log.Logger.Error(fmt.Errorf("error closing pipe: %w", e)) - } - } - return err - } + closePipesOnError := types.PipeCloser(hashR, hashW, apkR, apkW) oldSHA := "" if v.AlpineModel.Package.Hash != nil && v.AlpineModel.Package.Hash.Value != nil { diff --git a/pkg/types/helm/v0.0.1/entry.go b/pkg/types/helm/v0.0.1/entry.go index 627ecd62ff8dd9d49782671d9c2ba63ef3a69d20..530764bb87de9c0fb93c1221603a2dd788947cba 100644 --- a/pkg/types/helm/v0.0.1/entry.go +++ b/pkg/types/helm/v0.0.1/entry.go @@ -142,22 +142,9 @@ func (v *V001Entry) fetchExternalEntities(ctx context.Context) error { g, ctx := errgroup.WithContext(ctx) provenanceR, provenanceW := io.Pipe() - defer provenanceR.Close() - closePipesOnError := func(err error) error { - pipeReaders := []*io.PipeReader{provenanceR} - pipeWriters := []*io.PipeWriter{provenanceW} - for idx := range pipeReaders { - if e := pipeReaders[idx].CloseWithError(err); e != nil { - log.Logger.Error(fmt.Errorf("error closing pipe: %w", e)) - } - if e := pipeWriters[idx].CloseWithError(err); e != nil { - log.Logger.Error(fmt.Errorf("error closing pipe: %w", e)) - } - } - return err - } + closePipesOnError := types.PipeCloser(provenanceR, provenanceW) g.Go(func() error { defer provenanceW.Close() diff --git a/pkg/types/rekord/v0.0.1/entry.go b/pkg/types/rekord/v0.0.1/entry.go index 24f89970928f0ff7199c8df0f0f9c8083e425a7d..d0423f973c8de1133b53b68dff25e3a1b5945fb5 100644 --- a/pkg/types/rekord/v0.0.1/entry.go +++ b/pkg/types/rekord/v0.0.1/entry.go @@ -129,19 +129,7 @@ func (v *V001Entry) FetchExternalEntities(ctx context.Context) error { defer hashR.Close() defer sigR.Close() - closePipesOnError := func(err error) error { - pipeReaders := []*io.PipeReader{hashR, sigR} - pipeWriters := []*io.PipeWriter{hashW, sigW} - for idx := range pipeReaders { - if e := pipeReaders[idx].CloseWithError(err); e != nil { - log.Logger.Error(fmt.Errorf("error closing pipe: %w", e)) - } - if e := pipeWriters[idx].CloseWithError(err); e != nil { - log.Logger.Error(fmt.Errorf("error closing pipe: %w", e)) - } - } - return err - } + closePipesOnError := types.PipeCloser(hashR, hashW, sigR, sigW) oldSHA := "" if v.RekordObj.Data.Hash != nil && v.RekordObj.Data.Hash.Value != nil { @@ -282,12 +270,6 @@ func (v *V001Entry) Canonicalize(ctx context.Context) ([]byte, error) { if err := v.FetchExternalEntities(ctx); err != nil { return nil, err } - if v.sigObj == nil { - return nil, errors.New("signature object not initialized before canonicalization") - } - if v.keyObj == nil { - return nil, errors.New("key object not initialized before canonicalization") - } canonicalEntry := models.RekordV001Schema{} @@ -329,7 +311,7 @@ func (v *V001Entry) Canonicalize(ctx context.Context) ([]byte, error) { // validate performs cross-field validation for fields in object func (v V001Entry) validate() error { sig := v.RekordObj.Signature - if sig == nil { + if v.RekordObj.Signature == nil { return errors.New("missing signature") } if len(sig.Content) == 0 && sig.URL.String() == "" { diff --git a/pkg/types/rpm/v0.0.1/entry.go b/pkg/types/rpm/v0.0.1/entry.go index 5e915f1ab3357365c035d9df1625fabab40cb329..ae6bbf49f02a79c7d7a08a63f70a98aa58c80057 100644 --- a/pkg/types/rpm/v0.0.1/entry.go +++ b/pkg/types/rpm/v0.0.1/entry.go @@ -139,19 +139,7 @@ func (v *V001Entry) FetchExternalEntities(ctx context.Context) error { defer sigR.Close() defer rpmR.Close() - closePipesOnError := func(err error) error { - pipeReaders := []*io.PipeReader{hashR, sigR, rpmR} - pipeWriters := []*io.PipeWriter{hashW, sigW, rpmW} - for idx := range pipeReaders { - if e := pipeReaders[idx].CloseWithError(err); e != nil { - log.Logger.Error(fmt.Errorf("error closing pipe: %w", e)) - } - if e := pipeWriters[idx].CloseWithError(err); e != nil { - log.Logger.Error(fmt.Errorf("error closing pipe: %w", e)) - } - } - return err - } + closePipesOnError := types.PipeCloser(hashR, hashW, sigR, sigW, rpmR, rpmW) oldSHA := "" if v.RPMModel.Package.Hash != nil && v.RPMModel.Package.Hash.Value != nil { diff --git a/pkg/types/tuf/v0.0.1/entry.go b/pkg/types/tuf/v0.0.1/entry.go index 2af629161f52098c15790aa8fa341675aa8f0e29..f92dc2c579042ad0060299abbf9687312a5f7684 100644 --- a/pkg/types/tuf/v0.0.1/entry.go +++ b/pkg/types/tuf/v0.0.1/entry.go @@ -161,19 +161,7 @@ func (v *V001Entry) fetchExternalEntities(ctx context.Context) error { defer metaR.Close() defer rootR.Close() - closePipesOnError := func(err error) error { - pipeReaders := []*io.PipeReader{metaR, rootR} - pipeWriters := []*io.PipeWriter{metaW, rootW} - for idx := range pipeReaders { - if e := pipeReaders[idx].CloseWithError(err); e != nil { - log.Logger.Error(fmt.Errorf("error closing pipe: %w", e)) - } - if e := pipeWriters[idx].CloseWithError(err); e != nil { - log.Logger.Error(fmt.Errorf("error closing pipe: %w", e)) - } - } - return err - } + closePipesOnError := types.PipeCloser(metaR, metaW, rootR, rootW) // verify artifact signature artifactFactory, err := pki.NewArtifactFactory(pki.Tuf) diff --git a/pkg/types/types.go b/pkg/types/types.go index 85961f8b92cd62c1f079227cbb5b257fa05e9c62..b271fd7611f7e493fc810d15bd0e47b5d4a5a67f 100644 --- a/pkg/types/types.go +++ b/pkg/types/types.go @@ -22,6 +22,7 @@ import ( "sync" "github.com/sigstore/rekor/pkg/generated/models" + "github.com/sigstore/rekor/pkg/log" ) // TypeMap stores mapping between type strings and entry constructors @@ -78,3 +79,18 @@ func ListImplementedTypes() []string { }) return retVal } + +type errCloser interface { + CloseWithError(error) error +} + +func PipeCloser(errClosers ...errCloser) func(err error) error { + return func(err error) error { + for _, p := range errClosers { + if err := p.CloseWithError(err); err != nil { + log.Logger.Error(fmt.Errorf("error closing pipe: %w", err)) + } + } + return err + } +}