Skip to content

Commit b39b6f4

Browse files
committed
[FIX] update when adding operator key, updated before adding the signing key to the jwt
[FIX] changed save logic depended which depended on `Loaded` field which only has second resolution to be based out of `Modified` [FIX] nscprovider expected an account key to have an operator prefix instead of an account prefix [FIX] nscprovider saving of users depended on the account being modified
1 parent 8fe7459 commit b39b6f4

File tree

11 files changed

+137
-15
lines changed

11 files changed

+137
-15
lines changed

accounts.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ func (a *AccountData) issue(key *Key) error {
2525
}
2626
a.Claim = claim
2727
a.Token = token
28+
a.Modified = true
2829
return nil
2930
}
3031

operator.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ func (o *OperatorData) update() error {
148148
}
149149
o.Claim = claims
150150
o.Token = token
151+
o.Modified = true
151152

152153
return nil
153154
}

operator_signingkeys.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@ func (os *operatorSigningKeys) add() (*Key, error) {
1919
if err != nil {
2020
return nil, err
2121
}
22+
os.data.Claim.SigningKeys.Add(key.Public)
2223
err = os.data.update()
2324
if err != nil {
2425
return nil, err
2526
}
2627
os.data.AddedKeys = append(os.data.AddedKeys, key)
2728
os.data.OperatorSigningKeys = append(os.data.OperatorSigningKeys, key)
28-
os.data.Claim.SigningKeys = append(os.data.Claim.SigningKeys, key.Public)
2929
return key, nil
3030
}
3131

providers/kv/kv.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ func (p *KvProvider) LoadOperators() ([]*ab.OperatorData, error) {
225225
return nil, err
226226
}
227227
o.Claim = oc
228+
o.Modified = false
228229
o.Loaded = o.Claim.IssuedAt
229230
o.EntityName = o.Claim.Name
230231
o.Key, err = p.GetKey(o.Claim.Subject)
@@ -260,6 +261,7 @@ func (p *KvProvider) LoadAccounts(od *ab.OperatorData) error {
260261
if err != nil {
261262
return err
262263
}
264+
a.Modified = false
263265
a.Claim = ac
264266
a.Loaded = a.Claim.IssuedAt
265267
a.EntityName = a.Claim.Name
@@ -297,6 +299,7 @@ func (p *KvProvider) LoadUsers(ad *ab.AccountData) error {
297299
return err
298300
}
299301
u.Claim = uc
302+
u.Modified = false
300303
u.Loaded = u.Claim.IssuedAt
301304
u.EntityName = u.Claim.Name
302305
u.Key, err = p.GetKey(u.Claim.Subject)
@@ -400,7 +403,7 @@ func (p *KvProvider) Store(operators []*ab.OperatorData) error {
400403
}
401404

402405
func (p *KvProvider) StoreOperator(o *ab.OperatorData) error {
403-
if o.Loaded > 0 && o.Loaded > o.Claim.IssuedAt {
406+
if !o.Modified {
404407
return nil
405408
}
406409
_, err := p.Kv.Put(context.Background(), fmt.Sprintf("%s.%s", OperatorPrefix, o.Subject()), []byte(o.Token))
@@ -416,11 +419,12 @@ func (p *KvProvider) StoreOperator(o *ab.OperatorData) error {
416419
}
417420
}
418421
o.Loaded = o.Claim.IssuedAt
422+
o.Modified = false
419423
return nil
420424
}
421425

422426
func (p *KvProvider) StoreAccount(a *ab.AccountData) error {
423-
if a.Loaded > 0 && a.Loaded > a.Claim.IssuedAt {
427+
if !a.Modified {
424428
return nil
425429
}
426430
_, err := p.Kv.Put(context.Background(),
@@ -438,11 +442,12 @@ func (p *KvProvider) StoreAccount(a *ab.AccountData) error {
438442
}
439443
}
440444
a.Loaded = a.Claim.IssuedAt
445+
a.Modified = false
441446
return nil
442447
}
443448

444449
func (p *KvProvider) StoreUser(u *ab.UserData) error {
445-
if u.Loaded > 0 && u.Loaded > u.Claim.IssuedAt {
450+
if !u.Modified {
446451
return nil
447452
}
448453
_, err := p.Kv.Put(context.Background(),
@@ -452,6 +457,7 @@ func (p *KvProvider) StoreUser(u *ab.UserData) error {
452457
return err
453458
}
454459
u.Loaded = u.Claim.IssuedAt
460+
u.Modified = false
455461
return nil
456462
}
457463

providers/nsc/nsc.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ func (a *NscProvider) loadAccount(si store.IStore, ks store.KeyStore, name strin
149149
for _, k := range keys {
150150
skp, _ := ks.GetKeyPair(k)
151151
if skp != nil {
152-
sk, _ := authb.KeyFromNkey(skp, nkeys.PrefixByteOperator)
152+
sk, _ := authb.KeyFromNkey(skp, nkeys.PrefixByteAccount)
153153
if sk != nil {
154154
ad.AccountSigningKeys = append(ad.AccountSigningKeys, sk)
155155
}
@@ -229,7 +229,7 @@ func (a *NscProvider) Store(operators []*authb.OperatorData) error {
229229
return err
230230
}
231231
// if the operator changed configuration save it
232-
if o.Claim.IssuedAt > o.Loaded {
232+
if o.Modified {
233233
if err := s.StoreRaw([]byte(o.Token)); err != nil {
234234
return err
235235
}
@@ -252,22 +252,24 @@ func (a *NscProvider) Store(operators []*authb.OperatorData) error {
252252
o.DeletedKeys = nil
253253

254254
for _, account := range o.AccountDatas {
255-
if account.Claim.IssuedAt > account.Loaded {
255+
if account.Modified {
256+
//if account.Claim.IssuedAt > account.Loaded || account.Modified {
256257
if err := s.StoreRaw([]byte(account.Token)); err != nil {
257258
return err
258259
}
259260
// check that signing keys were not modified
260261
account.Loaded = account.Claim.IssuedAt
262+
}
261263

262-
for _, u := range account.UserDatas {
263-
if u.Claim.IssuedAt > u.Loaded {
264-
if err := s.StoreRaw([]byte(u.Token)); err != nil {
265-
return err
266-
}
267-
u.Loaded = u.Claim.IssuedAt
264+
for _, u := range account.UserDatas {
265+
if u.Modified {
266+
if err := s.StoreRaw([]byte(u.Token)); err != nil {
267+
return err
268268
}
269+
u.Loaded = u.Claim.IssuedAt
269270
}
270271
}
272+
271273
for _, u := range account.DeletedUsers {
272274
if err := s.Delete(store.Accounts, account.EntityName, store.Users, store.JwtName(u.EntityName)); err != nil {
273275
return err

tests/accounts_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -551,3 +551,44 @@ func (suite *ProviderSuite) Test_AccountJetStreamLimits() {
551551
require.NoError(t, err)
552552
suite.testTier(auth, b, 1)
553553
}
554+
555+
func (suite *ProviderSuite) Test_AccountSkUpdate() {
556+
t := suite.T()
557+
auth, err := authb.NewAuth(suite.Provider)
558+
require.NoError(t, err)
559+
560+
operators := auth.Operators()
561+
require.Empty(t, operators.List())
562+
563+
o, err := operators.Add("O")
564+
require.NoError(t, err)
565+
require.NotNil(t, o)
566+
567+
a, err := o.Accounts().Add("A")
568+
require.NoError(t, err)
569+
require.NotNil(t, a)
570+
571+
require.NoError(t, auth.Commit())
572+
require.NoError(t, auth.Reload())
573+
574+
o = operators.Get("O")
575+
require.NotNil(t, o)
576+
577+
a = o.Accounts().Get("A")
578+
require.NotNil(t, a)
579+
580+
k, err := a.ScopedSigningKeys().Add()
581+
require.NoError(t, err)
582+
require.NotEmpty(t, k)
583+
584+
require.NoError(t, auth.Commit())
585+
require.NoError(t, auth.Reload())
586+
587+
o = operators.Get("O")
588+
require.NotNil(t, o)
589+
a = o.Accounts().Get("A")
590+
require.NotNil(t, a)
591+
scope, ok := a.ScopedSigningKeys().GetScope(k)
592+
require.Nil(t, scope)
593+
require.True(t, ok)
594+
}

tests/operator_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,41 @@ func (suite *ProviderSuite) Test_OperatorBasics() {
3939
require.Equal(t, oc.Subject, key.Public)
4040
}
4141

42+
func (suite *ProviderSuite) Test_SkUpdate() {
43+
t := suite.T()
44+
auth, err := authb.NewAuth(suite.Provider)
45+
require.NoError(t, err)
46+
47+
operators := auth.Operators()
48+
require.Empty(t, operators.List())
49+
50+
o := auth.Operators().Get("O")
51+
require.NoError(t, err)
52+
require.Nil(t, o)
53+
o, err = operators.Add("O")
54+
require.NoError(t, err)
55+
require.NotNil(t, o)
56+
57+
require.NoError(t, auth.Commit())
58+
require.NoError(t, auth.Reload())
59+
60+
o = operators.Get("O")
61+
require.NotNil(t, o)
62+
63+
k, err := o.SigningKeys().Add()
64+
require.NoError(t, err)
65+
require.NotEmpty(t, k)
66+
67+
require.NoError(t, auth.Commit())
68+
require.NoError(t, auth.Reload())
69+
70+
o = operators.Get("O")
71+
require.NotNil(t, o)
72+
keys := o.SigningKeys().List()
73+
require.Len(t, keys, 1)
74+
require.Contains(t, keys, k)
75+
}
76+
4277
func (suite *ProviderSuite) Test_OperatorValidation() {
4378
t := suite.T()
4479
auth, err := authb.NewAuth(suite.Provider)

tests/users_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,3 +337,35 @@ func (suite *ProviderSuite) Test_Creds() {
337337
ud := u.(*authb.UserData)
338338
require.Equal(t, int64(0), ud.Claim.Expires)
339339
}
340+
341+
func (suite *ProviderSuite) Test_UsersAddedSave() {
342+
t := suite.T()
343+
auth, err := authb.NewAuth(suite.Provider)
344+
require.NoError(t, err)
345+
o, err := auth.Operators().Add("O")
346+
require.NoError(t, err)
347+
a, err := o.Accounts().Add("A")
348+
require.NoError(t, err)
349+
350+
require.NoError(t, auth.Commit())
351+
require.NoError(t, auth.Reload())
352+
353+
o = auth.Operators().Get("O")
354+
require.NotNil(t, o)
355+
a = o.Accounts().Get("A")
356+
require.NotNil(t, a)
357+
358+
u, err := a.Users().Add("U", "")
359+
require.NoError(t, err)
360+
require.NotNil(t, u)
361+
362+
require.NoError(t, auth.Commit())
363+
require.NoError(t, auth.Reload())
364+
365+
o = auth.Operators().Get("O")
366+
require.NotNil(t, o)
367+
a = o.Accounts().Get("A")
368+
require.NotNil(t, a)
369+
u = a.Users().Get("U")
370+
require.NotNil(t, u)
371+
}

types.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@ type BaseData struct {
3030
// Loaded matches the issue time of a loaded JWT (UTC in seconds). When
3131
// the entity is new, it should be 0. The AuthProvider
3232
// stores claims that have been modified and have
33-
// an issue time greater than this value. On Store(),
33+
// an issue time greater than this value or have been Modified. On Store(),
3434
// it should be set to the tokens issue time.
3535
Loaded int64
36+
// Modified is true if the entity has been modified since it was loaded
37+
Modified bool
3638
// EntityName is the name for the entity - in some cases NSC
3739
// will display simple name which differs from the actual name
3840
// of the entity stored in the JWT.

user.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ func (u *UserData) update() error {
4848
}
4949
u.Claim = claim
5050
u.Token = token
51+
u.Loaded = claim.IssuedAt
52+
u.Modified = true
5153
return nil
5254
}
5355

0 commit comments

Comments
 (0)