From b02320aace7a8dd0fcb7435c4f86b8a0736670b0 Mon Sep 17 00:00:00 2001 From: Priya Wadhwa Date: Mon, 29 Aug 2022 12:03:40 -0400 Subject: [PATCH] Add maxItems:10 for SearchLogQuery Signed-off-by: Priya Wadhwa --- openapi.yaml | 7 ++++-- pkg/api/entries.go | 2 +- pkg/generated/models/search_log_query.go | 27 ++++++++++++++++++++++++ pkg/generated/restapi/embedded_spec.go | 14 +++++++++--- tests/e2e_test.go | 4 ++-- 5 files changed, 46 insertions(+), 8 deletions(-) diff --git a/openapi.yaml b/openapi.yaml index 0946c93fb..93af089b6 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -519,21 +519,24 @@ definitions: properties: entryUUIDs: type: array + minItems: 1 + maxItems: 10 items: type: string - minItems: 1 pattern: '^([0-9a-fA-F]{64}|[0-9a-fA-F]{80})$' logIndexes: type: array minItems: 1 + maxItems: 10 items: type: integer minimum: 0 entries: type: array + minItems: 1 + maxItems: 10 items: $ref: '#/definitions/ProposedEntry' - minItems: 1 LogInfo: type: object diff --git a/pkg/api/entries.go b/pkg/api/entries.go index 19c39aa9b..abc3cefad 100644 --- a/pkg/api/entries.go +++ b/pkg/api/entries.go @@ -322,7 +322,7 @@ func SearchLogQueryHandler(params entries.SearchLogQueryParams) middleware.Respo totalQueries := len(params.Entry.EntryUUIDs) + len(params.Entry.Entries()) + len(params.Entry.LogIndexes) if totalQueries > maxSearchQueries { - return handleRekorAPIError(params, http.StatusBadRequest, fmt.Errorf(maxSearchQueryLimit, maxSearchQueries), maxSearchQueryLimit, maxSearchQueries) + return handleRekorAPIError(params, http.StatusUnprocessableEntity, fmt.Errorf(maxSearchQueryLimit, maxSearchQueries), fmt.Sprintf(maxSearchQueryLimit, maxSearchQueries)) } if len(params.Entry.EntryUUIDs) > 0 || len(params.Entry.Entries()) > 0 { diff --git a/pkg/generated/models/search_log_query.go b/pkg/generated/models/search_log_query.go index 37beafab7..6838b8a76 100644 --- a/pkg/generated/models/search_log_query.go +++ b/pkg/generated/models/search_log_query.go @@ -42,9 +42,12 @@ type SearchLogQuery struct { entriesField []ProposedEntry // entry u UI ds + // Max Items: 10 + // Min Items: 1 EntryUUIDs []string `json:"entryUUIDs"` // log indexes + // Max Items: 10 // Min Items: 1 LogIndexes []*int64 `json:"logIndexes"` } @@ -158,6 +161,16 @@ func (m *SearchLogQuery) validateEntries(formats strfmt.Registry) error { return nil } + iEntriesSize := int64(len(m.Entries())) + + if err := validate.MinItems("entries", "body", iEntriesSize, 1); err != nil { + return err + } + + if err := validate.MaxItems("entries", "body", iEntriesSize, 10); err != nil { + return err + } + for i := 0; i < len(m.Entries()); i++ { if err := m.entriesField[i].Validate(formats); err != nil { @@ -179,6 +192,16 @@ func (m *SearchLogQuery) validateEntryUUIDs(formats strfmt.Registry) error { return nil } + iEntryUUIDsSize := int64(len(m.EntryUUIDs)) + + if err := validate.MinItems("entryUUIDs", "body", iEntryUUIDsSize, 1); err != nil { + return err + } + + if err := validate.MaxItems("entryUUIDs", "body", iEntryUUIDsSize, 10); err != nil { + return err + } + for i := 0; i < len(m.EntryUUIDs); i++ { if err := validate.Pattern("entryUUIDs"+"."+strconv.Itoa(i), "body", m.EntryUUIDs[i], `^([0-9a-fA-F]{64}|[0-9a-fA-F]{80})$`); err != nil { @@ -201,6 +224,10 @@ func (m *SearchLogQuery) validateLogIndexes(formats strfmt.Registry) error { return err } + if err := validate.MaxItems("logIndexes", "body", iLogIndexesSize, 10); err != nil { + return err + } + for i := 0; i < len(m.LogIndexes); i++ { if swag.IsZero(m.LogIndexes[i]) { // not required continue diff --git a/pkg/generated/restapi/embedded_spec.go b/pkg/generated/restapi/embedded_spec.go index ef89e89cb..792cfaade 100644 --- a/pkg/generated/restapi/embedded_spec.go +++ b/pkg/generated/restapi/embedded_spec.go @@ -634,21 +634,24 @@ func init() { "properties": { "entries": { "type": "array", + "maxItems": 10, + "minItems": 1, "items": { - "minItems": 1, "$ref": "#/definitions/ProposedEntry" } }, "entryUUIDs": { "type": "array", + "maxItems": 10, + "minItems": 1, "items": { "type": "string", - "pattern": "^([0-9a-fA-F]{64}|[0-9a-fA-F]{80})$", - "minItems": 1 + "pattern": "^([0-9a-fA-F]{64}|[0-9a-fA-F]{80})$" } }, "logIndexes": { "type": "array", + "maxItems": 10, "minItems": 1, "items": { "type": "integer" @@ -2517,12 +2520,16 @@ func init() { "properties": { "entries": { "type": "array", + "maxItems": 10, + "minItems": 1, "items": { "$ref": "#/definitions/ProposedEntry" } }, "entryUUIDs": { "type": "array", + "maxItems": 10, + "minItems": 1, "items": { "type": "string", "pattern": "^([0-9a-fA-F]{64}|[0-9a-fA-F]{80})$" @@ -2530,6 +2537,7 @@ func init() { }, "logIndexes": { "type": "array", + "maxItems": 10, "minItems": 1, "items": { "type": "integer", diff --git a/tests/e2e_test.go b/tests/e2e_test.go index 5222beba8..e28c4bd1d 100644 --- a/tests/e2e_test.go +++ b/tests/e2e_test.go @@ -954,10 +954,10 @@ func TestSearchQueryLimit(t *testing.T) { if resp.StatusCode != 200 && !test.shouldErr { t.Fatalf("expected test to pass but it failed") } - if resp.StatusCode != 400 && test.shouldErr { + if resp.StatusCode != 422 && test.shouldErr { t.Fatal("expected test to fail but it passed") } - if test.shouldErr && !strings.Contains(string(c), "more than max allowed") { + if test.shouldErr && !strings.Contains(string(c), "logIndexes in body should have at most 10 items") { t.Fatal("expected max limit error but didn't get it") } })