From 4b72e37f270f70695e0ccc51817035cee74df273 Mon Sep 17 00:00:00 2001 From: Tomasz Pietrek Date: Wed, 11 Jan 2023 15:48:38 +0100 Subject: [PATCH] Fix not validating single token filtered consumer Signed-off-by: Tomasz Pietrek Signed-off-by: Neil Twigg --- server/jetstream_api.go | 10 +++++----- server/jetstream_test.go | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/server/jetstream_api.go b/server/jetstream_api.go index 831ff972..18f26686 100644 --- a/server/jetstream_api.go +++ b/server/jetstream_api.go @@ -3766,11 +3766,11 @@ func (s *Server) jsConsumerCreateRequest(sub *subscription, c *client, a *Accoun } else { streamName = streamNameFromSubject(subject) consumerName = consumerNameFromSubject(subject) - } - // New has optional filtered subject as part of main subject.. - if n > 7 { - tokens := strings.Split(subject, tsep) - filteredSubject = strings.Join(tokens[6:], tsep) + // New has optional filtered subject as part of main subject.. + if n > 6 { + tokens := strings.Split(subject, tsep) + filteredSubject = strings.Join(tokens[6:], tsep) + } } } diff --git a/server/jetstream_test.go b/server/jetstream_test.go index 611aeb59..7b2e8561 100644 --- a/server/jetstream_test.go +++ b/server/jetstream_test.go @@ -19481,6 +19481,45 @@ func TestJetStreamMetaDataFailOnKernelFault(t *testing.T) { require_True(t, si.State.Msgs == 10) } +func TestJetstreamConsumerSingleTokenSubject(t *testing.T) { + + s := RunBasicJetStreamServer(t) + defer s.Shutdown() + + nc, js := jsClientConnect(t, s) + defer nc.Close() + + filterSubject := "foo" + _, err := js.AddStream(&nats.StreamConfig{ + Name: "TEST", + Subjects: []string{filterSubject}, + }) + require_NoError(t, err) + + req, err := json.Marshal(&CreateConsumerRequest{Stream: "TEST", Config: ConsumerConfig{ + FilterSubject: filterSubject, + Name: "name", + }}) + + if err != nil { + t.Fatalf("failed to marshal consumer create request: %v", err) + } + + resp, err := nc.Request(fmt.Sprintf("$JS.API.CONSUMER.CREATE.%s.%s.%s", "TEST", "name", "not_filter_subject"), req, time.Second*10) + + var apiResp ApiResponse + json.Unmarshal(resp.Data, &apiResp) + if err != nil { + t.Fatalf("failed to unmarshal response: %v", err) + } + if apiResp.Error == nil { + t.Fatalf("expected error, got nil") + } + if apiResp.Error.ErrCode != 10131 { + t.Fatalf("expected error 10131, got %v", apiResp.Error) + } +} + // https://github.com/nats-io/nats-server/issues/3734 func TestJetStreamMsgBlkFailOnKernelFault(t *testing.T) { s := RunBasicJetStreamServer(t)