14
14
package server
15
15
16
16
import (
17
+ "encoding/base64"
18
+ "encoding/json"
17
19
"fmt"
18
20
"os"
19
21
"strings"
20
22
"testing"
23
+
24
+ "github.com/nats-io/nkeys"
21
25
)
22
26
23
27
func simpleAccountServer (t * testing.T ) (* Server , * Account , * Account ) {
@@ -45,9 +49,6 @@ func TestRegisterDuplicateAccounts(t *testing.T) {
45
49
46
50
func TestAccountIsolation (t * testing.T ) {
47
51
s , fooAcc , barAcc := simpleAccountServer (t )
48
- if fooAcc == nil || barAcc == nil {
49
- t .Fatalf ("Error retrieving accounts for 'foo' and 'bar'" )
50
- }
51
52
cfoo , crFoo , _ := newClientForServer (s )
52
53
if err := cfoo .registerWithAccount (fooAcc ); err != nil {
53
54
t .Fatalf ("Error register client with 'foo' account: %v" , err )
@@ -135,10 +136,18 @@ func TestNewAccountsFromClients(t *testing.T) {
135
136
opts .AllowNewAccounts = true
136
137
s = New (& opts )
137
138
138
- c , _ , _ = newClientForServer (s )
139
+ c , cr , _ = newClientForServer (s )
139
140
err := c .parse (connectOp )
140
141
if err != nil {
141
- t .Fatalf ("Received an error trying to create an account: %v" , err )
142
+ t .Fatalf ("Received an error trying to connect: %v" , err )
143
+ }
144
+ go c .parse ([]byte ("PING\r \n " ))
145
+ l , err = cr .ReadString ('\n' )
146
+ if err != nil {
147
+ t .Fatalf ("Error reading response for client from server: %v" , err )
148
+ }
149
+ if ! strings .HasPrefix (l , "PONG\r \n " ) {
150
+ t .Fatalf ("PONG response incorrect: %q" , l )
142
151
}
143
152
}
144
153
@@ -255,7 +264,6 @@ func TestAccountParseConfig(t *testing.T) {
255
264
if u .Username == "derek" {
256
265
if u .Account != natsAcc {
257
266
t .Fatalf ("Expected to see the 'nats.io' account, but received %+v" , u .Account )
258
- break
259
267
}
260
268
}
261
269
}
@@ -302,8 +310,7 @@ func TestAccountParseConfigImportsExports(t *testing.T) {
302
310
for _ , acc := range opts .Accounts {
303
311
if acc .Name == "nats.io" {
304
312
natsAcc = acc
305
- }
306
- if acc .Name == "synadia" {
313
+ } else if acc .Name == "synadia" {
307
314
synAcc = acc
308
315
}
309
316
}
@@ -420,7 +427,7 @@ func TestImportExportConfigFailures(t *testing.T) {
420
427
cf = createConfFile (t , []byte (`
421
428
accounts {
422
429
nats.io {
423
- exports = [{service: {account: nats.io, subject:"foo.*"}]
430
+ exports = [{service: {account: nats.io, subject:"foo.*"}} ]
424
431
}
425
432
}
426
433
` ))
@@ -490,6 +497,7 @@ func TestImportAuthorized(t *testing.T) {
490
497
}
491
498
492
499
func TestSimpleMapping (t * testing.T ) {
500
+ t .Helper ()
493
501
s , fooAcc , barAcc := simpleAccountServer (t )
494
502
defer s .Shutdown ()
495
503
@@ -555,7 +563,7 @@ func TestSimpleMapping(t *testing.T) {
555
563
556
564
l , err = crBar .ReadString ('\n' )
557
565
if err != nil {
558
- t .Fatalf ("Error reading from client 'baz ': %v" , err )
566
+ t .Fatalf ("Error reading from client 'bar ': %v" , err )
559
567
}
560
568
checkMsg (l , "2" )
561
569
checkPayload (crBar , []byte ("hello\r \n " ), t )
@@ -578,11 +586,11 @@ func TestNoPrefixWildcardMapping(t *testing.T) {
578
586
t .Fatalf ("Error registering client with 'bar' account: %v" , err )
579
587
}
580
588
581
- if err := cfoo .acc .addStreamExport (">" , []* Account {barAcc }); err != nil { // Public with no accounts defined.
582
- t .Fatalf ("Error adding account export to client foo: %v" , err )
589
+ if err := cfoo .acc .addStreamExport (">" , []* Account {barAcc }); err != nil {
590
+ t .Fatalf ("Error adding stream export to client foo: %v" , err )
583
591
}
584
592
if err := cbar .acc .addStreamImport (fooAcc , "*" , "" ); err != nil {
585
- t .Fatalf ("Error adding account import to client bar: %v" , err )
593
+ t .Fatalf ("Error adding stream import to client bar: %v" , err )
586
594
}
587
595
588
596
// Normal Subscription on bar client for literal "foo".
@@ -631,11 +639,12 @@ func TestPrefixWildcardMapping(t *testing.T) {
631
639
t .Fatalf ("Error registering client with 'bar' account: %v" , err )
632
640
}
633
641
634
- if err := cfoo .acc .addStreamExport (">" , []* Account {barAcc }); err != nil { // Public with no accounts defined.
635
- t .Fatalf ("Error adding account export to client foo: %v" , err )
642
+ if err := cfoo .acc .addStreamExport (">" , []* Account {barAcc }); err != nil {
643
+ t .Fatalf ("Error adding stream export to client foo: %v" , err )
636
644
}
645
+ // Checking that trailing '.' is accepted, tested that it is auto added above.
637
646
if err := cbar .acc .addStreamImport (fooAcc , "*" , "pub.imports." ); err != nil {
638
- t .Fatalf ("Error adding account import to client bar: %v" , err )
647
+ t .Fatalf ("Error adding stream import to client bar: %v" , err )
639
648
}
640
649
641
650
// Normal Subscription on bar client for wildcard.
@@ -684,11 +693,11 @@ func TestPrefixWildcardMappingWithLiteralSub(t *testing.T) {
684
693
t .Fatalf ("Error registering client with 'bar' account: %v" , err )
685
694
}
686
695
687
- if err := cfoo .acc .addStreamExport (">" , []* Account {barAcc }); err != nil { // Public with no accounts defined.
688
- t .Fatalf ("Error adding account export to client foo: %v" , err )
696
+ if err := cfoo .acc .addStreamExport (">" , []* Account {barAcc }); err != nil {
697
+ t .Fatalf ("Error adding stream export to client foo: %v" , err )
689
698
}
690
699
if err := cbar .acc .addStreamImport (fooAcc , "*" , "pub.imports." ); err != nil {
691
- t .Fatalf ("Error adding account import to client bar: %v" , err )
700
+ t .Fatalf ("Error adding stream import to client bar: %v" , err )
692
701
}
693
702
694
703
// Normal Subscription on bar client for wildcard.
@@ -819,6 +828,133 @@ func TestCrossAccountRequestReply(t *testing.T) {
819
828
}
820
829
}
821
830
831
+ func TestAccountMapsUsers (t * testing.T ) {
832
+ // Used for the nkey users to properly sign.
833
+ seed1 := "SUAPM67TC4RHQLKBX55NIQXSMATZDOZK6FNEOSS36CAYA7F7TY66LP4BOM"
834
+ seed2 := "SUAIS5JPX4X4GJ7EIIJEQ56DH2GWPYJRPWN5XJEDENJOZHCBLI7SEPUQDE"
835
+
836
+ confFileName := createConfFile (t , []byte (`
837
+ accounts {
838
+ synadia {
839
+ users = [
840
+ {user: derek, password: foo},
841
+ {nkey: UCNGL4W5QX66CFX6A6DCBVDH5VOHMI7B2UZZU7TXAUQQSI2JPHULCKBR}
842
+ ]
843
+ }
844
+ nats {
845
+ users = [
846
+ {user: ivan, password: bar},
847
+ {nkey: UDPGQVFIWZ7Q5UH4I5E6DBCZULQS6VTVBG6CYBD7JV3G3N2GMQOMNAUH}
848
+ ]
849
+ }
850
+ }
851
+ ` ))
852
+ defer os .Remove (confFileName )
853
+ opts , err := ProcessConfigFile (confFileName )
854
+ if err != nil {
855
+ t .Fatalf ("Unexpected error parsing config file: %v" , err )
856
+ }
857
+ s := New (opts )
858
+ synadia := s .LookupAccount ("synadia" )
859
+ nats := s .LookupAccount ("nats" )
860
+
861
+ if synadia == nil || nats == nil {
862
+ t .Fatalf ("Expected non nil accounts during lookup" )
863
+ }
864
+
865
+ // Make sure a normal log in maps the accounts correctly.
866
+ c , _ , _ := newClientForServer (s )
867
+ connectOp := []byte ("CONNECT {\" user\" :\" derek\" ,\" pass\" :\" foo\" }\r \n " )
868
+ c .parse (connectOp )
869
+ if c .acc != synadia {
870
+ t .Fatalf ("Expected the client's account to match 'synadia', got %v" , c .acc )
871
+ }
872
+ // Also test client sublist.
873
+ if c .sl != synadia .sl {
874
+ t .Fatalf ("Expected the client's sublist to match 'synadia' account" )
875
+ }
876
+
877
+ c , _ , _ = newClientForServer (s )
878
+ connectOp = []byte ("CONNECT {\" user\" :\" ivan\" ,\" pass\" :\" bar\" }\r \n " )
879
+ c .parse (connectOp )
880
+ if c .acc != nats {
881
+ t .Fatalf ("Expected the client's account to match 'nats', got %v" , c .acc )
882
+ }
883
+ // Also test client sublist.
884
+ if c .sl != nats .sl {
885
+ t .Fatalf ("Expected the client's sublist to match 'nats' account" )
886
+ }
887
+
888
+ // Now test nkeys as well.
889
+ kp , _ := nkeys .FromSeed (seed1 )
890
+ pubKey , _ := kp .PublicKey ()
891
+
892
+ c , cr , l := newClientForServer (s )
893
+ // Check for Nonce
894
+ var info nonceInfo
895
+ err = json .Unmarshal ([]byte (l [5 :]), & info )
896
+ if err != nil {
897
+ t .Fatalf ("Could not parse INFO json: %v\n " , err )
898
+ }
899
+ if info .Nonce == "" {
900
+ t .Fatalf ("Expected a non-empty nonce with nkeys defined" )
901
+ }
902
+ sigraw , err := kp .Sign ([]byte (info .Nonce ))
903
+ if err != nil {
904
+ t .Fatalf ("Failed signing nonce: %v" , err )
905
+ }
906
+ sig := base64 .StdEncoding .EncodeToString (sigraw )
907
+
908
+ // PING needed to flush the +OK to us.
909
+ cs := fmt .Sprintf ("CONNECT {\" nkey\" :%q,\" sig\" :\" %s\" ,\" verbose\" :true,\" pedantic\" :true}\r \n PING\r \n " , pubKey , sig )
910
+ go c .parse ([]byte (cs ))
911
+ l , _ = cr .ReadString ('\n' )
912
+ if ! strings .HasPrefix (l , "+OK" ) {
913
+ t .Fatalf ("Expected an OK, got: %v" , l )
914
+ }
915
+ if c .acc != synadia {
916
+ t .Fatalf ("Expected the nkey client's account to match 'synadia', got %v" , c .acc )
917
+ }
918
+ // Also test client sublist.
919
+ if c .sl != synadia .sl {
920
+ t .Fatalf ("Expected the client's sublist to match 'synadia' account" )
921
+ }
922
+
923
+ // Now nats account nkey user.
924
+ kp , _ = nkeys .FromSeed (seed2 )
925
+ pubKey , _ = kp .PublicKey ()
926
+
927
+ c , cr , l = newClientForServer (s )
928
+ // Check for Nonce
929
+ err = json .Unmarshal ([]byte (l [5 :]), & info )
930
+ if err != nil {
931
+ t .Fatalf ("Could not parse INFO json: %v\n " , err )
932
+ }
933
+ if info .Nonce == "" {
934
+ t .Fatalf ("Expected a non-empty nonce with nkeys defined" )
935
+ }
936
+ sigraw , err = kp .Sign ([]byte (info .Nonce ))
937
+ if err != nil {
938
+ t .Fatalf ("Failed signing nonce: %v" , err )
939
+ }
940
+ sig = base64 .StdEncoding .EncodeToString (sigraw )
941
+
942
+ // PING needed to flush the +OK to us.
943
+ cs = fmt .Sprintf ("CONNECT {\" nkey\" :%q,\" sig\" :\" %s\" ,\" verbose\" :true,\" pedantic\" :true}\r \n PING\r \n " , pubKey , sig )
944
+ go c .parse ([]byte (cs ))
945
+ l , _ = cr .ReadString ('\n' )
946
+ if ! strings .HasPrefix (l , "+OK" ) {
947
+ t .Fatalf ("Expected an OK, got: %v" , l )
948
+ }
949
+ if c .acc != nats {
950
+ t .Fatalf ("Expected the nkey client's account to match 'nats', got %v" , c .acc )
951
+ }
952
+ // Also test client sublist.
953
+ if c .sl != nats .sl {
954
+ t .Fatalf ("Expected the client's sublist to match 'nats' account" )
955
+ }
956
+ }
957
+
822
958
func BenchmarkNewRouteReply (b * testing.B ) {
823
959
opts := defaultServerOptions
824
960
s := New (& opts )
0 commit comments