From b419227a92593de352e0aadb1a187ca3f01b4ec8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 26 May 2026 06:09:07 +0000 Subject: [PATCH] fix: return empty CVE graphql results when cve disabled Agent-Logs-Url: https://github.com/project-zot/zot/sessions/1ad9a48e-b34b-4cf5-8672-fcad1eec752f Co-authored-by: rchincha <45800463+rchincha@users.noreply.github.com> --- pkg/cli/server/extensions_test.go | 4 ++ pkg/extensions/search/resolver_test.go | 56 ++++++++++++++++++++++- pkg/extensions/search/schema.resolvers.go | 31 +++++++++++-- 3 files changed, 85 insertions(+), 6 deletions(-) diff --git a/pkg/cli/server/extensions_test.go b/pkg/cli/server/extensions_test.go index 213311d6..3ca69c8b 100644 --- a/pkg/cli/server/extensions_test.go +++ b/pkg/cli/server/extensions_test.go @@ -1168,6 +1168,10 @@ func TestServeSearchEnabledNoCVE(t *testing.T) { found, err = ReadLogFileAndSearchString(logPath, "cve config not provided, skipping cve-db update", readLogFileTimeout) So(found, ShouldBeTrue) So(err, ShouldBeNil) + + found, err = ReadLogFileAndSearchString(logPath, "updating cve-db", readLogFileTimeout) + So(found, ShouldBeFalse) + So(err, ShouldBeNil) }) } diff --git a/pkg/extensions/search/resolver_test.go b/pkg/extensions/search/resolver_test.go index 90726750..381ced18 100644 --- a/pkg/extensions/search/resolver_test.go +++ b/pkg/extensions/search/resolver_test.go @@ -754,7 +754,61 @@ func TestQueryResolverErrors(t *testing.T) { _, err := qr.CVEDiffListForImages(ctx, gql_generated.ImageInput{}, gql_generated.ImageInput{}, &gql_generated.PageInput{}, nil, nil) - So(err, ShouldNotBeNil) + So(err, ShouldBeNil) + }) + + Convey("CVEListForImage nil cveinfo returns empty result", func() { + resolverConfig := NewResolver( + log, + storage.StoreController{DefaultStore: mocks.MockedImageStore{}}, + mocks.MetaDBMock{}, + nil, + ) + + qr := queryResolver{resolverConfig} + + result, err := qr.CVEListForImage(ctx, "repo1:1.0.0", &gql_generated.PageInput{}, nil, nil, nil) + So(err, ShouldBeNil) + So(result, ShouldNotBeNil) + So(result.Page, ShouldNotBeNil) + So(result.CVEList, ShouldNotBeNil) + So(len(result.CVEList), ShouldEqual, 0) + }) + + Convey("ImageListForCve nil cveinfo returns empty result", func() { + resolverConfig := NewResolver( + log, + storage.StoreController{DefaultStore: mocks.MockedImageStore{}}, + mocks.MetaDBMock{}, + nil, + ) + + qr := queryResolver{resolverConfig} + + result, err := qr.ImageListForCve(ctx, "CVE-123", &gql_generated.Filter{}, &gql_generated.PageInput{}) + So(err, ShouldBeNil) + So(result, ShouldNotBeNil) + So(result.Page, ShouldNotBeNil) + So(result.Results, ShouldNotBeNil) + So(len(result.Results), ShouldEqual, 0) + }) + + Convey("ImageListWithCVEFixed nil cveinfo returns empty result", func() { + resolverConfig := NewResolver( + log, + storage.StoreController{DefaultStore: mocks.MockedImageStore{}}, + mocks.MetaDBMock{}, + nil, + ) + + qr := queryResolver{resolverConfig} + + result, err := qr.ImageListWithCVEFixed(ctx, "CVE-123", "repo1", &gql_generated.Filter{}, &gql_generated.PageInput{}) + So(err, ShouldBeNil) + So(result, ShouldNotBeNil) + So(result.Page, ShouldNotBeNil) + So(result.Results, ShouldNotBeNil) + So(len(result.Results), ShouldEqual, 0) }) Convey("CVEDiffListForImages error", func() { diff --git a/pkg/extensions/search/schema.resolvers.go b/pkg/extensions/search/schema.resolvers.go index 797869bf..7155a879 100644 --- a/pkg/extensions/search/schema.resolvers.go +++ b/pkg/extensions/search/schema.resolvers.go @@ -9,7 +9,6 @@ import ( "context" "github.com/vektah/gqlparser/v2/gqlerror" - zerr "zotregistry.dev/zot/v2/errors" "zotregistry.dev/zot/v2/pkg/common" "zotregistry.dev/zot/v2/pkg/extensions/search/convert" "zotregistry.dev/zot/v2/pkg/extensions/search/gql_generated" @@ -18,7 +17,10 @@ import ( // CVEListForImage is the resolver for the CVEListForImage field. func (r *queryResolver) CVEListForImage(ctx context.Context, image string, requestedPage *gql_generated.PageInput, searchedCve *string, excludedCve *string, severity *string) (*gql_generated.CVEResultForImage, error) { if r.cveInfo == nil { - return &gql_generated.CVEResultForImage{}, zerr.ErrCVESearchDisabled + return &gql_generated.CVEResultForImage{ + CVEList: []*gql_generated.Cve{}, + Page: &gql_generated.PageInfo{}, + }, nil } return getCVEListForImage(ctx, image, r.cveInfo, requestedPage, deref(searchedCve, ""), deref(excludedCve, ""), deref(severity, ""), r.log) @@ -27,7 +29,20 @@ func (r *queryResolver) CVEListForImage(ctx context.Context, image string, reque // CVEDiffListForImages is the resolver for the CVEDiffListForImages field. func (r *queryResolver) CVEDiffListForImages(ctx context.Context, minuend gql_generated.ImageInput, subtrahend gql_generated.ImageInput, requestedPage *gql_generated.PageInput, searchedCve *string, excludedCve *string) (*gql_generated.CVEDiffResult, error) { if r.cveInfo == nil { - return &gql_generated.CVEDiffResult{}, zerr.ErrCVESearchDisabled + return &gql_generated.CVEDiffResult{ + Minuend: &gql_generated.ImageIdentifier{ + Repo: minuend.Repo, + Tag: minuend.Tag, + Digest: minuend.Digest, + }, + Subtrahend: &gql_generated.ImageIdentifier{ + Repo: subtrahend.Repo, + Tag: subtrahend.Tag, + Digest: subtrahend.Digest, + }, + CVEList: []*gql_generated.Cve{}, + Page: &gql_generated.PageInfo{}, + }, nil } return getCVEDiffListForImages(ctx, minuend, subtrahend, r.metaDB, r.cveInfo, requestedPage, @@ -37,7 +52,10 @@ func (r *queryResolver) CVEDiffListForImages(ctx context.Context, minuend gql_ge // ImageListForCve is the resolver for the ImageListForCVE field. func (r *queryResolver) ImageListForCve(ctx context.Context, id string, filter *gql_generated.Filter, requestedPage *gql_generated.PageInput) (*gql_generated.PaginatedImagesResult, error) { if r.cveInfo == nil { - return &gql_generated.PaginatedImagesResult{}, zerr.ErrCVESearchDisabled + return &gql_generated.PaginatedImagesResult{ + Page: &gql_generated.PageInfo{}, + Results: []*gql_generated.ImageSummary{}, + }, nil } filter = cleanFilter(filter) @@ -48,7 +66,10 @@ func (r *queryResolver) ImageListForCve(ctx context.Context, id string, filter * // ImageListWithCVEFixed is the resolver for the ImageListWithCVEFixed field. func (r *queryResolver) ImageListWithCVEFixed(ctx context.Context, id string, image string, filter *gql_generated.Filter, requestedPage *gql_generated.PageInput) (*gql_generated.PaginatedImagesResult, error) { if r.cveInfo == nil { - return &gql_generated.PaginatedImagesResult{}, zerr.ErrCVESearchDisabled + return &gql_generated.PaginatedImagesResult{ + Page: &gql_generated.PageInfo{}, + Results: []*gql_generated.ImageSummary{}, + }, nil } filter = cleanFilter(filter)