Repository: nats-io/nsc
Pull request #674 (2024-10-10 21:10:26)

[CHANGE] [BREAKING] retracts --strict-tags support
This change reverts #672 


Patch:
diff --git a/cmd/deleteimport.go b/cmd/deleteimport.go
index 9bf2ca7..cc936f7 100644
--- a/cmd/deleteimport.go
+++ b/cmd/deleteimport.go
@@ -16,6 +16,7 @@
 package cmd
 
 import (
+	"errors"
 	"fmt"
 	"strings"
 
@@ -172,7 +173,7 @@ func (p *DeleteImportParams) Validate(ctx ActionCtx) error {
 		if p.srcAccount != "" {
 			m = fmt.Sprintf("%s from account %s", m, p.srcAccount)
 		}
-		return fmt.Errorf(m)
+		return errors.New(m)
 	}
 
 	if err = p.SignerParams.Resolve(ctx); err != nil {
diff --git a/cmd/editaccount.go b/cmd/editaccount.go
index e881447..08ecf7a 100644
--- a/cmd/editaccount.go
+++ b/cmd/editaccount.go
@@ -57,7 +57,6 @@ func createEditAccount() *cobra.Command {
 			return RunAction(cmd, args, params)
 		},
 	}
-	cmd.Flags().BoolVarP(&params.strictTags, "strict-tags", "", false, "allow tags to be case-sensitive, default false")
 	cmd.Flags().StringSliceVarP(&params.tags, "tag", "", nil, "add tags for user - comma separated list or option can be specified multiple times")
 	cmd.Flags().StringSliceVarP(&params.rmTags, "rm-tag", "", nil, "remove tag - comma separated list or option can be specified multiple times")
 	params.conns = -1
diff --git a/cmd/editoperator.go b/cmd/editoperator.go
index f9d5fc0..ab36974 100644
--- a/cmd/editoperator.go
+++ b/cmd/editoperator.go
@@ -40,7 +40,6 @@ func createEditOperatorCmd() *cobra.Command {
 	}
 	params.signingKeys.BindFlags("sk", "", nkeys.PrefixByteOperator, cmd)
 	cmd.Flags().StringSliceVarP(&params.rmSigningKeys, "rm-sk", "", nil, "remove signing key - comma separated list or option can be specified multiple times")
-	cmd.Flags().BoolVarP(&params.strictTags, "strict-tags", "", false, "allow tags to be case-sensitive, default false")
 	cmd.Flags().StringSliceVarP(&params.tags, "tag", "", nil, "add tags for user - comma separated list or option can be specified multiple times")
 	cmd.Flags().StringSliceVarP(&params.rmTags, "rm-tag", "", nil, "remove tag - comma separated list or option can be specified multiple times")
 	cmd.Flags().StringVarP(&params.asu, "account-jwt-server-url", "u", "", "set account jwt server url for nsc sync (only http/https or nats service (nats/tls/ws/wss) urls supported if updating with nsc)")
diff --git a/cmd/edituser.go b/cmd/edituser.go
index 7b2eaac..0338590 100644
--- a/cmd/edituser.go
+++ b/cmd/edituser.go
@@ -71,7 +71,6 @@ nsc edit user --name <n> --rm-response-perms
 			return RunAction(cmd, args, &params)
 		},
 	}
-	cmd.Flags().BoolVarP(&params.strictTags, "strict-tags", "", false, "allow tags to be case-sensitive, default false")
 	cmd.Flags().StringSliceVarP(&params.tags, "tag", "", nil, "add tags for user - comma separated list or option can be specified multiple times")
 	cmd.Flags().StringSliceVarP(&params.rmTags, "rm-tag", "", nil, "remove tag - comma separated list or option can be specified multiple times")
 	cmd.Flags().StringVarP(&params.name, "name", "n", "", "user name")
diff --git a/cmd/genericclaimparams.go b/cmd/genericclaimparams.go
index 4cd7b74..d9ed387 100644
--- a/cmd/genericclaimparams.go
+++ b/cmd/genericclaimparams.go
@@ -30,9 +30,8 @@ import (
 // GenericClaimsParams - TimeParams and tags
 type GenericClaimsParams struct {
 	TimeParams
-	tags       []string
-	rmTags     []string
-	strictTags bool
+	tags   []string
+	rmTags []string
 }
 
 func (sp *GenericClaimsParams) Edit(current []string) error {
@@ -101,21 +100,6 @@ func (sp *GenericClaimsParams) Valid() error {
 	if err := sp.TimeParams.Validate(); err != nil {
 		return err
 	}
-	if !sp.strictTags {
-		for _, t := range sp.tags {
-			tt := strings.ToLower(t)
-			if t != tt {
-				return fmt.Errorf("--tag %q is not lowercased, specify option --strict-tags to honor non-lowercased values", t)
-			}
-		}
-		for _, t := range sp.rmTags {
-			tt := strings.ToLower(t)
-			if t != tt {
-				return fmt.Errorf("--rm-tag %q is not lowercased, specify option --strict-tags", t)
-			}
-		}
-	}
-
 	return nil
 }
 
@@ -161,19 +145,15 @@ func (sp *GenericClaimsParams) Run(ctx ActionCtx, claim jwt.Claims, r *store.Rep
 	}
 
 	tags.Add(sp.tags...)
-	if err := tags.Remove(sp.rmTags...); err != nil {
-		return err
-	}
+	tags.Remove(sp.rmTags...)
 	sort.Strings(*tags)
 
 	if r != nil {
 		for _, t := range sp.tags {
-			t = strings.TrimSpace(t)
-			r.AddOK("added tag %q", t)
+			r.AddOK("added tag %q", strings.ToLower(t))
 		}
 		for _, t := range sp.rmTags {
-			t = strings.TrimSpace(t)
-			r.AddOK("removed tag %q", t)
+			r.AddOK("removed tag %q", strings.ToLower(t))
 		}
 	}
 	return nil
diff --git a/go.mod b/go.mod
index e282967..b4e38fd 100644
--- a/go.mod
+++ b/go.mod
@@ -1,6 +1,8 @@
 module github.com/nats-io/nsc/v2
 
-go 1.21
+go 1.22
+
+toolchain go1.22.5
 
 require (
 	github.com/blang/semver v3.5.1+incompatible
@@ -9,7 +11,7 @@ require (
 	github.com/mitchellh/go-homedir v1.1.0
 	github.com/nats-io/cliprompts/v2 v2.0.0-20231014115920-801ca035562a
 	github.com/nats-io/jsm.go v0.1.2
-	github.com/nats-io/jwt/v2 v2.7.0
+	github.com/nats-io/jwt/v2 v2.7.2
 	github.com/nats-io/nats-server/v2 v2.10.18
 	github.com/nats-io/nats.go v1.37.0
 	github.com/nats-io/nkeys v0.4.7
@@ -19,12 +21,12 @@ require (
 	github.com/spf13/pflag v1.0.5
 	github.com/stretchr/testify v1.9.0
 	github.com/xlab/tablewriter v0.0.0-20160610135559-80b567a11ad5
-	golang.org/x/text v0.18.0
+	golang.org/x/text v0.19.0
 )
 
 require (
 	github.com/AlecAivazis/survey/v2 v2.3.7 // indirect
-	github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
+	github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect
 	github.com/davecgh/go-spew v1.1.1 // indirect
 	github.com/fatih/color v1.17.0 // indirect
 	github.com/google/go-github/v30 v30.1.0 // indirect
@@ -43,11 +45,11 @@ require (
 	github.com/russross/blackfriday/v2 v2.1.0 // indirect
 	github.com/tcnksm/go-gitconfig v0.1.2 // indirect
 	github.com/ulikunitz/xz v0.5.12 // indirect
-	golang.org/x/crypto v0.27.0 // indirect
+	golang.org/x/crypto v0.28.0 // indirect
 	golang.org/x/net v0.29.0 // indirect
 	golang.org/x/oauth2 v0.23.0 // indirect
-	golang.org/x/sys v0.25.0 // indirect
-	golang.org/x/term v0.24.0 // indirect
+	golang.org/x/sys v0.26.0 // indirect
+	golang.org/x/term v0.25.0 // indirect
 	golang.org/x/time v0.5.0 // indirect
 	gopkg.in/yaml.v2 v2.4.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
diff --git a/go.sum b/go.sum
index 1f6fd7f..038adb4 100644
--- a/go.sum
+++ b/go.sum
@@ -8,9 +8,8 @@ github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdn
 github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
 github.com/briandowns/spinner v1.23.1 h1:t5fDPmScwUjozhDj4FA46p5acZWIPXYE30qW2Ptu650=
 github.com/briandowns/spinner v1.23.1/go.mod h1:LaZeM4wm2Ywy6vO571mvhQNRcWfRUnXOs0RcKV0wYKM=
+github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4=
 github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
-github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc=
-github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
 github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI=
 github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -70,8 +69,8 @@ github.com/nats-io/cliprompts/v2 v2.0.0-20231014115920-801ca035562a h1:28qvB6peS
 github.com/nats-io/cliprompts/v2 v2.0.0-20231014115920-801ca035562a/go.mod h1:oweZn7AeaVJYKlNHfCIhznJVsdySLSng55vfuINE/d0=
 github.com/nats-io/jsm.go v0.1.2 h1:T4Fq88a03sPAPWYwrOLQ85oanYsC2Bs6517rUiWBMpQ=
 github.com/nats-io/jsm.go v0.1.2/go.mod h1:tnubE70CAKi5TNfQiq6XHFqWTuSIe1H7X4sDwfq6ZK8=
-github.com/nats-io/jwt/v2 v2.7.0 h1:J+ZnaaMGQi3xSB8iOhVM5ipiWCDrQvgEoitTwWFyOYw=
-github.com/nats-io/jwt/v2 v2.7.0/go.mod h1:ZdWS1nZa6WMZfFwwgpEaqBV8EPGVgOTDHN/wTbz0Y5A=
+github.com/nats-io/jwt/v2 v2.7.2 h1:SCRjfDLJ2q8naXp8YlGJJS5/yj3wGSODFYVi4nnwVMw=
+github.com/nats-io/jwt/v2 v2.7.2/go.mod h1:kB6QUmqHG6Wdrzj0KP2L+OX4xiTPBeV+NHVstFaATXU=
 github.com/nats-io/nats-server/v2 v2.10.18 h1:tRdZmBuWKVAFYtayqlBB2BuCHNGAQPvoQIXOKwU3WSM=
 github.com/nats-io/nats-server/v2 v2.10.18/go.mod h1:97Qyg7YydD8blKlR8yBsUlPlWyZKjA7Bp5cl3MUE9K8=
 github.com/nats-io/nats.go v1.37.0 h1:07rauXbVnnJvv1gfIyghFEo6lUcYRY0WXc3x7x0vUxE=
@@ -111,8 +110,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
 golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A=
-golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
+golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
+golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -143,20 +142,20 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
-golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
+golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM=
-golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8=
+golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
+golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
-golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
+golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
+golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
 golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
 golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=


Test patch:
diff --git a/cmd/editaccount_test.go b/cmd/editaccount_test.go
index 057e036..5bb8464 100644
--- a/cmd/editaccount_test.go
+++ b/cmd/editaccount_test.go
@@ -37,7 +37,7 @@ func Test_EditAccount(t *testing.T) {
 		{createEditAccount(), []string{"edit", "account"}, nil, []string{"specify an edit option"}, true},
 		{createEditAccount(), []string{"edit", "account", "--info-url", "http://foo/bar"}, nil, []string{"changed info url to"}, false},
 		{createEditAccount(), []string{"edit", "account", "--description", "my account is about this"}, nil, []string{"changed description to"}, false},
-		{createEditAccount(), []string{"edit", "account", "--tag", "a", "--name", "A"}, nil, []string{"edited account \"A\""}, false},
+		{createEditAccount(), []string{"edit", "account", "--tag", "A", "--name", "A"}, nil, []string{"edited account \"A\""}, false},
 	}
 
 	tests.Run(t, "root", "edit")
@@ -60,7 +60,7 @@ func Test_EditAccount_Tag(t *testing.T) {
 	defer ts.Done(t)
 
 	ts.AddAccount(t, "A")
-	_, _, err := ExecuteCmd(createEditAccount(), "--tag", "a,b,c")
+	_, _, err := ExecuteCmd(createEditAccount(), "--tag", "A,B,C")
 	require.NoError(t, err)
 
 	ac, err := ts.Store.ReadAccountClaim("A")
@@ -75,17 +75,17 @@ func Test_EditAccount_RmTag(t *testing.T) {
 	defer ts.Done(t)
 
 	ts.AddAccount(t, "A")
-	_, _, err := ExecuteCmd(createEditAccount(), "--tag", "A,B,C", "--strict-tags")
+	_, _, err := ExecuteCmd(createEditAccount(), "--tag", "A,B,C")
 	require.NoError(t, err)
 
-	_, _, err = ExecuteCmd(createEditAccount(), "--rm-tag", "A,B", "--strict-tags")
+	_, _, err = ExecuteCmd(createEditAccount(), "--rm-tag", "A,B")
 	require.NoError(t, err)
 
 	ac, err := ts.Store.ReadAccountClaim("A")
 	require.NoError(t, err)
 
 	require.Len(t, ac.Tags, 1)
-	require.ElementsMatch(t, ac.Tags, []string{"C"})
+	require.ElementsMatch(t, ac.Tags, []string{"c"})
 }
 
 func Test_EditAccount_Times(t *testing.T) {
@@ -380,17 +380,17 @@ func Test_EditSysAccount(t *testing.T) {
 	for idx, n := range jsOptions {
 		flag := fmt.Sprintf("--%s", n)
 		if idx > 0 {
-			_, _, err = ExecuteCmd(createEditAccount(), "SYS", "--tag", "a", flag, "1")
+			_, _, err = ExecuteCmd(createEditAccount(), "SYS", "--tag", "A", flag, "1")
 			require.Error(t, err)
 			require.Contains(t, err.Error(), flag)
 		} else {
-			_, _, err = ExecuteCmd(createEditAccount(), "SYS", "--tag", "a", flag)
+			_, _, err = ExecuteCmd(createEditAccount(), "SYS", "--tag", "A", flag)
 			require.Error(t, err)
 			require.Contains(t, err.Error(), flag)
 		}
 	}
 	// defaults are removed automatically
-	_, _, err = ExecuteCmd(createEditAccount(), "SYS", "--tag", "a")
+	_, _, err = ExecuteCmd(createEditAccount(), "SYS", "--tag", "A")
 	require.NoError(t, err)
 }
 
@@ -524,28 +524,3 @@ func Test_EnableTierNoOtherFlag(t *testing.T) {
 	require.Error(t, err)
 	require.Equal(t, "rm-js-tier is exclusive of all other js options", err.Error())
 }
-
-func TestEditAccountStrictTags(t *testing.T) {
-	ts := NewTestStore(t, "O")
-	defer ts.Done(t)
-
-	ts.AddAccount(t, "A")
-
-	_, _, err := ExecuteCmd(createEditAccount(), "--tag", "a")
-	require.NoError(t, err)
-
-	_, _, err = ExecuteCmd(createEditAccount(), "--rm-tag", "A")
-	require.Error(t, err)
-	require.Contains(t, err.Error(), "--rm-tag \"A\" is not lowercased")
-
-	_, _, err = ExecuteCmd(createEditAccount(), "--rm-tag", "A", "--strict-tags")
-	require.Error(t, err)
-	require.Contains(t, err.Error(), "unable to remove tag: \"A\" - not found")
-
-	_, _, err = ExecuteCmd(createEditAccount(), "--tag", "A", "--strict-tags")
-	require.NoError(t, err)
-
-	uc, err := ts.Store.ReadAccountClaim("A")
-	require.NoError(t, err)
-	require.True(t, uc.Tags.Equals(&jwt.TagList{"A", "a"}))
-}
diff --git a/cmd/editoperator_test.go b/cmd/editoperator_test.go
index 0ceb3bd..9cfb35f 100644
--- a/cmd/editoperator_test.go
+++ b/cmd/editoperator_test.go
@@ -43,7 +43,7 @@ func Test_EditOperator(t *testing.T) {
 		{createEditOperatorCmd(), []string{"edit", "operator", "--sk"}, nil, []string{"flag needs an argument"}, true},
 		{createEditOperatorCmd(), []string{"edit", "operator", "--sk", "SAADOZRUTPZS6LIXS6CSSSW5GXY3DNMQMSDTVWHQNHQTIBPGNSADSMBPEU"}, nil, []string{"invalid operator signing key"}, true},
 		{createEditOperatorCmd(), []string{"edit", "operator", "--sk", "OBMWGGURAFWMH3AFDX65TVIH4ZYSL7UKZ3LOH2ZRWIAU7PGZ3IJNR6W5"}, nil, []string{"edited operator"}, false},
-		{createEditOperatorCmd(), []string{"edit", "operator", "--tag", "o", "--start", "2019-04-13", "--expiry", "2050-01-01"}, nil, []string{"edited operator"}, false},
+		{createEditOperatorCmd(), []string{"edit", "operator", "--tag", "O", "--start", "2019-04-13", "--expiry", "2050-01-01"}, nil, []string{"edited operator"}, false},
 		{createEditOperatorCmd(), []string{"edit", "operator", "--require-signing-keys"}, nil, []string{"needs to be issued with a signing key first"}, true},
 	}
 
@@ -420,29 +420,3 @@ func Test_CannotSetRequireSKWithoutSK(t *testing.T) {
 	require.False(t, oc.StrictSigningKeyUsage)
 	require.Empty(t, oc.SigningKeys)
 }
-
-func TestEditOperatorStrictTags(t *testing.T) {
-	ts := NewTestStore(t, "O")
-	defer ts.Done(t)
-
-	_, _, err := ExecuteCmd(createEditOperatorCmd(), "--tag", "A")
-	require.Error(t, err)
-
-	_, _, err = ExecuteCmd(createEditOperatorCmd(), "--tag", "a")
-	require.NoError(t, err)
-
-	_, _, err = ExecuteCmd(createEditOperatorCmd(), "--rm-tag", "A")
-	require.Error(t, err)
-	require.Contains(t, err.Error(), "--rm-tag \"A\" is not lowercased")
-
-	_, _, err = ExecuteCmd(createEditOperatorCmd(), "--rm-tag", "A", "--strict-tags")
-	require.Error(t, err)
-	require.Contains(t, err.Error(), "unable to remove tag: \"A\" - not found")
-
-	_, _, err = ExecuteCmd(createEditOperatorCmd(), "--tag", "A", "--strict-tags")
-	require.NoError(t, err)
-
-	oc, err := ts.Store.ReadOperatorClaim()
-	require.NoError(t, err)
-	require.True(t, oc.Tags.Equals(&jwt.TagList{"A", "a"}))
-}
diff --git a/cmd/edituser_test.go b/cmd/edituser_test.go
index b86157b..7a4b706 100644
--- a/cmd/edituser_test.go
+++ b/cmd/edituser_test.go
@@ -16,12 +16,11 @@
 package cmd
 
 import (
+	"github.com/nats-io/nsc/v2/cmd/store"
 	"strings"
 	"testing"
 	"time"
 
-	"github.com/nats-io/nsc/v2/cmd/store"
-
 	"github.com/nats-io/nkeys"
 
 	cli "github.com/nats-io/cliprompts/v2"
@@ -39,13 +38,12 @@ func Test_EditUser(t *testing.T) {
 
 	tests := CmdTests{
 		{createEditUserCmd(), []string{"edit", "user"}, nil, []string{"specify an edit option"}, true},
-		{createEditUserCmd(), []string{"edit", "user", "--tag", "A", "--account", "A"}, nil, []string{"--tag \"A\" is not lowercased"}, true},
-		{createEditUserCmd(), []string{"edit", "user", "--tag", "a", "--account", "A"}, nil, []string{"edited user \"a\""}, false},
+		{createEditUserCmd(), []string{"edit", "user", "--tag", "A", "--account", "A"}, nil, []string{"edited user \"a\""}, false},
 		{createEditUserCmd(), []string{"edit", "user", "--conn-type", "MQTT", "--rm-conn-type", "LEAFNODE", "--account", "A"}, nil, []string{"added connection type MQTT", "added connection type MQTT"}, false},
 		{createEditUserCmd(), []string{"edit", "user", "--conn-type", "LEAFNODE_WS", "--account", "A"}, nil, []string{"added connection type LEAFNODE_WS"}, false},
 		{createEditUserCmd(), []string{"edit", "user", "--conn-type", "MQTT_WS", "--account", "A"}, nil, []string{"added connection type MQTT_WS"}, false},
-		{createEditUserCmd(), []string{"edit", "user", "--tag", "b", "--account", "B"}, nil, []string{"user name is required"}, true},
-		{createEditUserCmd(), []string{"edit", "user", "--tag", "b", "--account", "B", "--name", "bb"}, nil, []string{"edited user \"bb\""}, false},
+		{createEditUserCmd(), []string{"edit", "user", "--tag", "B", "--account", "B"}, nil, []string{"user name is required"}, true},
+		{createEditUserCmd(), []string{"edit", "user", "--tag", "B", "--account", "B", "--name", "bb"}, nil, []string{"edited user \"bb\""}, false},
 	}
 
 	tests.Run(t, "root", "edit")
@@ -109,7 +107,7 @@ func Test_EditUser_Tag(t *testing.T) {
 	defer ts.Done(t)
 
 	ts.AddUser(t, "A", "a")
-	_, _, err := ExecuteCmd(createEditUserCmd(), "--tag", "A,B,C", "--strict-tags")
+	_, _, err := ExecuteCmd(createEditUserCmd(), "--tag", "A,B,C")
 	require.NoError(t, err)
 
 	cc, err := ts.Store.ReadUserClaim("A", "a")
@@ -117,9 +115,9 @@ func Test_EditUser_Tag(t *testing.T) {
 	require.NotNil(t, cc)
 
 	require.Len(t, cc.Tags, 3)
-	require.ElementsMatch(t, cc.Tags, []string{"A", "B", "C"})
+	require.ElementsMatch(t, cc.Tags, []string{"a", "b", "c"})
 
-	_, _, err = ExecuteCmd(createEditUserCmd(), "--rm-tag", "A,B", "--strict-tags")
+	_, _, err = ExecuteCmd(createEditUserCmd(), "--rm-tag", "A,B")
 	require.NoError(t, err)
 
 	cc, err = ts.Store.ReadUserClaim("A", "a")
@@ -127,7 +125,7 @@ func Test_EditUser_Tag(t *testing.T) {
 	require.NotNil(t, cc)
 
 	require.Len(t, cc.Tags, 1)
-	require.ElementsMatch(t, cc.Tags, []string{"C"})
+	require.ElementsMatch(t, cc.Tags, []string{"c"})
 
 }
 
@@ -597,29 +595,3 @@ func Test_EditUserConnectionDeleteCase(t *testing.T) {
 	require.NoError(t, err)
 	require.Len(t, claim.AllowedConnectionTypes, 0)
 }
-
-func TestEditUserStrictTags(t *testing.T) {
-	ts := NewTestStore(t, "O")
-	defer ts.Done(t)
-
-	ts.AddAccount(t, "A")
-	ts.AddUser(t, "A", "U")
-
-	_, _, err := ExecuteCmd(createEditUserCmd(), "--tag", "a")
-	require.NoError(t, err)
-
-	_, _, err = ExecuteCmd(createEditUserCmd(), "--rm-tag", "A")
-	require.Error(t, err)
-	require.Contains(t, err.Error(), "--rm-tag \"A\" is not lowercased")
-
-	_, _, err = ExecuteCmd(createEditUserCmd(), "--rm-tag", "A", "--strict-tags")
-	require.Error(t, err)
-	require.Contains(t, err.Error(), "unable to remove tag: \"A\" - not found")
-
-	_, _, err = ExecuteCmd(createEditUserCmd(), "--tag", "A", "--strict-tags")
-	require.NoError(t, err)
-
-	uc, err := ts.Store.ReadUserClaim("A", "U")
-	require.NoError(t, err)
-	require.True(t, uc.Tags.Equals(&jwt.TagList{"A", "a"}))
-}
diff --git a/cmd/push_test.go b/cmd/push_test.go
index 8dbf503..07c3fab 100644
--- a/cmd/push_test.go
+++ b/cmd/push_test.go
@@ -40,7 +40,7 @@ func Test_SyncOK(t *testing.T) {
 	ts.AddAccount(t, "A")
 
 	// edit the jwt
-	_, _, err = ExecuteCmd(createEditAccount(), "--tag", "A", "--strict-tags")
+	_, _, err = ExecuteCmd(createEditAccount(), "--tag", "A")
 	require.NoError(t, err)
 
 	// sync the store
@@ -50,8 +50,7 @@ func Test_SyncOK(t *testing.T) {
 	// verify the tag was stored
 	ac, err := ts.Store.ReadAccountClaim("A")
 	require.NoError(t, err)
-	require.Contains(t, ac.Tags, "A")
-	require.True(t, ac.Tags.Contains("A"))
+	require.Contains(t, ac.Tags, "a")
 }
 
 func Test_SyncNoURL(t *testing.T) {
@@ -121,7 +120,7 @@ func Test_SyncManualServer(t *testing.T) {
 	ts.AddAccount(t, "A")
 
 	// edit the jwt
-	_, _, err = ExecuteCmd(createEditAccount(), "--tag", "a")
+	_, _, err = ExecuteCmd(createEditAccount(), "--tag", "A")
 	require.NoError(t, err)
 
 	// sync the store