Skip to content

Commit 296ba90

Browse files
authored
various fixes regarding enabling/disabling/validation of jetstream on system account
[FIX] added check for --js-enable=tier on system account (#685) [FIX] added bypass to allow --js-disable to work on system account in cases where it was enabled by specifying --js-enable=tier [FIX] enhanced validation to check for system accounts with enabled jetstream
1 parent ad42dfb commit 296ba90

File tree

4 files changed

+94
-3
lines changed

4 files changed

+94
-3
lines changed

cmd/editaccount.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -598,7 +598,12 @@ func (p *EditAccountParams) checkSystemAccount(ctx ActionCtx) error {
598598
return nil
599599
}
600600

601-
if p.claim.Limits.JetStreamTieredLimits != nil {
601+
// allow the js to be disabled
602+
if p.disableJetStream {
603+
return nil
604+
}
605+
606+
if p.claim.Limits.JetStreamTieredLimits != nil || p.enableJetStream > -1 {
602607
return errors.New("system account cannot have JetStream limits - please rerun with --js-disable")
603608
}
604609

cmd/editaccount_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -524,3 +524,55 @@ func Test_EnableTierNoOtherFlag(t *testing.T) {
524524
require.Error(t, err)
525525
require.Equal(t, "rm-js-tier is exclusive of all other js options", err.Error())
526526
}
527+
528+
func Test_CannotEnableJsInSys(t *testing.T) {
529+
ts := NewTestStore(t, "O")
530+
defer ts.Done(t)
531+
ts.AddAccount(t, "SYS")
532+
_, _, err := ExecuteCmd(createEditOperatorCmd(), "--system-account", "SYS")
533+
require.NoError(t, err)
534+
535+
_, _, err = ExecuteCmd(createEditAccount(), "--js-enable", "1")
536+
require.Error(t, err)
537+
538+
_, _, err = ExecuteCmd(createEditAccount(), "--js-disable")
539+
require.NoError(t, err)
540+
541+
sys, err := ts.Store.ReadAccountClaim("SYS")
542+
require.NoError(t, err)
543+
544+
require.False(t, sys.Limits.IsJSEnabled())
545+
}
546+
547+
func Test_AllowSysToDisableJs(t *testing.T) {
548+
ts := NewTestStore(t, "O")
549+
defer ts.Done(t)
550+
ts.AddAccount(t, "SYS")
551+
_, _, err := ExecuteCmd(createEditOperatorCmd(), "--system-account", "SYS")
552+
require.NoError(t, err)
553+
554+
sys, err := ts.Store.ReadAccountClaim("SYS")
555+
require.NoError(t, err)
556+
require.False(t, sys.Limits.IsJSEnabled())
557+
558+
sys.Limits.JetStreamTieredLimits = make(map[string]jwt.JetStreamLimits)
559+
sys.Limits.JetStreamTieredLimits["R1"] = jwt.JetStreamLimits{DiskStorage: -1, MemoryStorage: -1}
560+
561+
okp, err := ts.KeyStore.GetKeyPair(ts.GetOperatorPublicKey(t))
562+
require.NoError(t, err)
563+
token, err := sys.Encode(okp)
564+
require.NoError(t, err)
565+
require.NoError(t, ts.Store.StoreRaw([]byte(token)))
566+
567+
sys, err = ts.Store.ReadAccountClaim("SYS")
568+
require.NoError(t, err)
569+
require.True(t, sys.Limits.IsJSEnabled())
570+
571+
_, _, err = ExecuteCmd(createEditAccount(), "--js-disable")
572+
require.NoError(t, err)
573+
574+
sys, err = ts.Store.ReadAccountClaim("SYS")
575+
require.NoError(t, err)
576+
577+
require.False(t, sys.Limits.IsJSEnabled())
578+
}

cmd/validate.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2018-2019 The NATS Authors
2+
* Copyright 2018-2024 The NATS Authors
33
* Licensed under the Apache License, Version 2.0 (the "License");
44
* you may not use this file except in compliance with the License.
55
* You may obtain a copy of the License at
@@ -220,6 +220,14 @@ func (p *ValidateCmdParams) validate(ctx ActionCtx) error {
220220
if aci != nil {
221221
p.accountValidations[v] = aci
222222
}
223+
if oc.SystemAccount == ac.Subject {
224+
if ac.Limits.IsJSEnabled() {
225+
if p.accountValidations[v] == nil {
226+
p.accountValidations[v] = &jwt.ValidationResults{}
227+
}
228+
p.accountValidations[v].AddError("JetStream should not be enabled for system account")
229+
}
230+
}
223231
if !oc.DidSign(ac) {
224232
if p.accountValidations[v] == nil {
225233
p.accountValidations[v] = &jwt.ValidationResults{}

cmd/validate_test.go

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2018-2023 The NATS Authors
2+
* Copyright 2018-2024 The NATS Authors
33
* Licensed under the Apache License, Version 2.0 (the "License");
44
* you may not use this file except in compliance with the License.
55
* You may obtain a copy of the License at
@@ -21,6 +21,7 @@ import (
2121
"strings"
2222
"testing"
2323

24+
"github.com/nats-io/jwt/v2"
2425
"github.com/nats-io/nsc/v2/cmd/store"
2526
"github.com/stretchr/testify/require"
2627
)
@@ -201,3 +202,28 @@ func Test_ValidateInteractive(t *testing.T) {
201202
require.NoError(t, err)
202203
require.Contains(t, stderr, "Account \"B\"")
203204
}
205+
206+
func Test_ValidateJsSys(t *testing.T) {
207+
ts := NewTestStore(t, "O")
208+
defer ts.Done(t)
209+
ts.AddAccount(t, "SYS")
210+
_, _, err := ExecuteCmd(createEditOperatorCmd(), "--system-account", "SYS")
211+
require.NoError(t, err)
212+
213+
sys, err := ts.Store.ReadAccountClaim("SYS")
214+
require.NoError(t, err)
215+
require.False(t, sys.Limits.IsJSEnabled())
216+
217+
sys.Limits.JetStreamTieredLimits = make(map[string]jwt.JetStreamLimits)
218+
sys.Limits.JetStreamTieredLimits["R1"] = jwt.JetStreamLimits{DiskStorage: -1, MemoryStorage: -1}
219+
220+
okp, err := ts.KeyStore.GetKeyPair(ts.GetOperatorPublicKey(t))
221+
require.NoError(t, err)
222+
token, err := sys.Encode(okp)
223+
require.NoError(t, err)
224+
require.NoError(t, ts.Store.StoreRaw([]byte(token)))
225+
226+
_, stderr, err := ExecuteInteractiveCmd(HoistRootFlags(createValidateCommand()), []interface{}{1})
227+
require.Error(t, err)
228+
require.Contains(t, stderr, "JetStream should not be enabled for system account")
229+
}

0 commit comments

Comments
 (0)