diff --git a/server/errors.json b/server/errors.json index 3ea6351468..92f664ba74 100644 --- a/server/errors.json +++ b/server/errors.json @@ -1398,5 +1398,15 @@ "help": "", "url": "", "deprecates": "" + }, + { + "constant": "JSMirrorInvalidStreamName", + "code": 400, + "error_code": 10142, + "description": "source stream name is invalid", + "comment": "", + "help": "", + "url": "", + "deprecates": "" } ] \ No newline at end of file diff --git a/server/jetstream_errors_generated.go b/server/jetstream_errors_generated.go index b5e758313a..75ece6ea43 100644 --- a/server/jetstream_errors_generated.go +++ b/server/jetstream_errors_generated.go @@ -224,6 +224,9 @@ const ( // JSMirrorConsumerSetupFailedErrF generic mirror consumer setup failure string ({err}) JSMirrorConsumerSetupFailedErrF ErrorIdentifier = 10029 + // JSMirrorInvalidStreamName source stream name is invalid + JSMirrorInvalidStreamName ErrorIdentifier = 10142 + // JSMirrorMaxMessageSizeTooBigErr stream mirror must have max message size >= source JSMirrorMaxMessageSizeTooBigErr ErrorIdentifier = 10030 @@ -501,6 +504,7 @@ var ( JSMaximumStreamsLimitErr: {Code: 400, ErrCode: 10027, Description: "maximum number of streams reached"}, JSMemoryResourcesExceededErr: {Code: 500, ErrCode: 10028, Description: "insufficient memory resources available"}, JSMirrorConsumerSetupFailedErrF: {Code: 500, ErrCode: 10029, Description: "{err}"}, + JSMirrorInvalidStreamName: {Code: 400, ErrCode: 10142, Description: "source stream name is invalid"}, JSMirrorMaxMessageSizeTooBigErr: {Code: 400, ErrCode: 10030, Description: "stream mirror must have max message size >= source"}, JSMirrorWithSourcesErr: {Code: 400, ErrCode: 10031, Description: "stream mirrors can not also contain other sources"}, JSMirrorWithStartSeqAndTimeErr: {Code: 400, ErrCode: 10032, Description: "stream mirrors can not have both start seq and start time configured"}, @@ -1389,6 +1393,16 @@ func NewJSMirrorConsumerSetupFailedError(err error, opts ...ErrorOption) *ApiErr } } +// NewJSMirrorInvalidStreamNameError creates a new JSMirrorInvalidStreamName error: "source stream name is invalid" +func NewJSMirrorInvalidStreamNameError(opts ...ErrorOption) *ApiError { + eopts := parseOpts(opts) + if ae, ok := eopts.err.(*ApiError); ok { + return ae + } + + return ApiErrors[JSMirrorInvalidStreamName] +} + // NewJSMirrorMaxMessageSizeTooBigError creates a new JSMirrorMaxMessageSizeTooBigErr error: "stream mirror must have max message size >= source" func NewJSMirrorMaxMessageSizeTooBigError(opts ...ErrorOption) *ApiError { eopts := parseOpts(opts) diff --git a/server/jetstream_super_cluster_test.go b/server/jetstream_super_cluster_test.go index 8abbe17c40..779de18b88 100644 --- a/server/jetstream_super_cluster_test.go +++ b/server/jetstream_super_cluster_test.go @@ -550,7 +550,7 @@ func TestJetStreamSuperClusterConnectionCount(t *testing.T) { require_NoError(t, err) _, err = js.AddStream(&nats.StreamConfig{ Name: "src", - Sources: []*nats.StreamSource{{Name: "foo.1"}, {Name: "foo.2"}}, + Sources: []*nats.StreamSource{{Name: "foo1"}, {Name: "foo2"}}, Replicas: 3}) require_NoError(t, err) }() @@ -561,7 +561,7 @@ func TestJetStreamSuperClusterConnectionCount(t *testing.T) { require_NoError(t, err) _, err = js.AddStream(&nats.StreamConfig{ Name: "mir", - Mirror: &nats.StreamSource{Name: "foo.2"}, + Mirror: &nats.StreamSource{Name: "foo2"}, Replicas: 3}) require_NoError(t, err) }() diff --git a/server/stream.go b/server/stream.go index 976ee60013..6bced4495c 100644 --- a/server/stream.go +++ b/server/stream.go @@ -1164,6 +1164,9 @@ func (s *Server) checkStreamCfg(config *StreamConfig, acc *Account) (StreamConfi // Do not perform checks if External is provided, as it could lead to // checking against itself (if sourced stream name is the same on different JetStream) if cfg.Mirror.External == nil { + if !isValidName(cfg.Mirror.Name) { + return StreamConfig{}, NewJSMirrorInvalidStreamNameError() + } // We do not require other stream to exist anymore, but if we can see it check payloads. exists, maxMsgSize, subs := hasStream(cfg.Mirror.Name) if len(subs) > 0 {