store_test.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736
  1. // Copyright 2016 The etcd Authors
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package auth
  15. import (
  16. "context"
  17. "fmt"
  18. "os"
  19. "reflect"
  20. "strings"
  21. "sync"
  22. "testing"
  23. "time"
  24. "github.com/coreos/etcd/auth/authpb"
  25. "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes"
  26. pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
  27. "github.com/coreos/etcd/mvcc/backend"
  28. "go.uber.org/zap"
  29. "golang.org/x/crypto/bcrypt"
  30. "google.golang.org/grpc/metadata"
  31. )
  32. func init() { BcryptCost = bcrypt.MinCost }
  33. func dummyIndexWaiter(index uint64) <-chan struct{} {
  34. ch := make(chan struct{})
  35. go func() {
  36. ch <- struct{}{}
  37. }()
  38. return ch
  39. }
  40. // TestNewAuthStoreRevision ensures newly auth store
  41. // keeps the old revision when there are no changes.
  42. func TestNewAuthStoreRevision(t *testing.T) {
  43. b, tPath := backend.NewDefaultTmpBackend()
  44. defer os.Remove(tPath)
  45. tp, err := NewTokenProvider(zap.NewExample(), "simple", dummyIndexWaiter)
  46. if err != nil {
  47. t.Fatal(err)
  48. }
  49. as := NewAuthStore(zap.NewExample(), b, tp)
  50. err = enableAuthAndCreateRoot(as)
  51. if err != nil {
  52. t.Fatal(err)
  53. }
  54. old := as.Revision()
  55. b.Close()
  56. as.Close()
  57. // no changes to commit
  58. b2 := backend.NewDefaultBackend(tPath)
  59. as = NewAuthStore(zap.NewExample(), b2, tp)
  60. new := as.Revision()
  61. b2.Close()
  62. as.Close()
  63. if old != new {
  64. t.Fatalf("expected revision %d, got %d", old, new)
  65. }
  66. }
  67. func setupAuthStore(t *testing.T) (store *authStore, teardownfunc func(t *testing.T)) {
  68. b, tPath := backend.NewDefaultTmpBackend()
  69. tp, err := NewTokenProvider(zap.NewExample(), "simple", dummyIndexWaiter)
  70. if err != nil {
  71. t.Fatal(err)
  72. }
  73. as := NewAuthStore(zap.NewExample(), b, tp)
  74. err = enableAuthAndCreateRoot(as)
  75. if err != nil {
  76. t.Fatal(err)
  77. }
  78. // adds a new role
  79. _, err = as.RoleAdd(&pb.AuthRoleAddRequest{Name: "role-test"})
  80. if err != nil {
  81. t.Fatal(err)
  82. }
  83. ua := &pb.AuthUserAddRequest{Name: "foo", Password: "bar"}
  84. _, err = as.UserAdd(ua) // add a non-existing user
  85. if err != nil {
  86. t.Fatal(err)
  87. }
  88. tearDown := func(t *testing.T) {
  89. b.Close()
  90. os.Remove(tPath)
  91. as.Close()
  92. }
  93. return as, tearDown
  94. }
  95. func enableAuthAndCreateRoot(as *authStore) error {
  96. _, err := as.UserAdd(&pb.AuthUserAddRequest{Name: "root", Password: "root"})
  97. if err != nil {
  98. return err
  99. }
  100. _, err = as.RoleAdd(&pb.AuthRoleAddRequest{Name: "root"})
  101. if err != nil {
  102. return err
  103. }
  104. _, err = as.UserGrantRole(&pb.AuthUserGrantRoleRequest{User: "root", Role: "root"})
  105. if err != nil {
  106. return err
  107. }
  108. return as.AuthEnable()
  109. }
  110. func TestUserAdd(t *testing.T) {
  111. as, tearDown := setupAuthStore(t)
  112. defer tearDown(t)
  113. ua := &pb.AuthUserAddRequest{Name: "foo"}
  114. _, err := as.UserAdd(ua) // add an existing user
  115. if err == nil {
  116. t.Fatalf("expected %v, got %v", ErrUserAlreadyExist, err)
  117. }
  118. if err != ErrUserAlreadyExist {
  119. t.Fatalf("expected %v, got %v", ErrUserAlreadyExist, err)
  120. }
  121. ua = &pb.AuthUserAddRequest{Name: ""}
  122. _, err = as.UserAdd(ua) // add a user with empty name
  123. if err != ErrUserEmpty {
  124. t.Fatal(err)
  125. }
  126. }
  127. func TestCheckPassword(t *testing.T) {
  128. as, tearDown := setupAuthStore(t)
  129. defer tearDown(t)
  130. // auth a non-existing user
  131. _, err := as.CheckPassword("foo-test", "bar")
  132. if err == nil {
  133. t.Fatalf("expected %v, got %v", ErrAuthFailed, err)
  134. }
  135. if err != ErrAuthFailed {
  136. t.Fatalf("expected %v, got %v", ErrAuthFailed, err)
  137. }
  138. // auth an existing user with correct password
  139. _, err = as.CheckPassword("foo", "bar")
  140. if err != nil {
  141. t.Fatal(err)
  142. }
  143. // auth an existing user but with wrong password
  144. _, err = as.CheckPassword("foo", "")
  145. if err == nil {
  146. t.Fatalf("expected %v, got %v", ErrAuthFailed, err)
  147. }
  148. if err != ErrAuthFailed {
  149. t.Fatalf("expected %v, got %v", ErrAuthFailed, err)
  150. }
  151. }
  152. func TestUserDelete(t *testing.T) {
  153. as, tearDown := setupAuthStore(t)
  154. defer tearDown(t)
  155. // delete an existing user
  156. ud := &pb.AuthUserDeleteRequest{Name: "foo"}
  157. _, err := as.UserDelete(ud)
  158. if err != nil {
  159. t.Fatal(err)
  160. }
  161. // delete a non-existing user
  162. _, err = as.UserDelete(ud)
  163. if err == nil {
  164. t.Fatalf("expected %v, got %v", ErrUserNotFound, err)
  165. }
  166. if err != ErrUserNotFound {
  167. t.Fatalf("expected %v, got %v", ErrUserNotFound, err)
  168. }
  169. }
  170. func TestUserChangePassword(t *testing.T) {
  171. as, tearDown := setupAuthStore(t)
  172. defer tearDown(t)
  173. ctx1 := context.WithValue(context.WithValue(context.TODO(), AuthenticateParamIndex{}, uint64(1)), AuthenticateParamSimpleTokenPrefix{}, "dummy")
  174. _, err := as.Authenticate(ctx1, "foo", "bar")
  175. if err != nil {
  176. t.Fatal(err)
  177. }
  178. _, err = as.UserChangePassword(&pb.AuthUserChangePasswordRequest{Name: "foo", Password: "baz"})
  179. if err != nil {
  180. t.Fatal(err)
  181. }
  182. ctx2 := context.WithValue(context.WithValue(context.TODO(), AuthenticateParamIndex{}, uint64(2)), AuthenticateParamSimpleTokenPrefix{}, "dummy")
  183. _, err = as.Authenticate(ctx2, "foo", "baz")
  184. if err != nil {
  185. t.Fatal(err)
  186. }
  187. // change a non-existing user
  188. _, err = as.UserChangePassword(&pb.AuthUserChangePasswordRequest{Name: "foo-test", Password: "bar"})
  189. if err == nil {
  190. t.Fatalf("expected %v, got %v", ErrUserNotFound, err)
  191. }
  192. if err != ErrUserNotFound {
  193. t.Fatalf("expected %v, got %v", ErrUserNotFound, err)
  194. }
  195. }
  196. func TestRoleAdd(t *testing.T) {
  197. as, tearDown := setupAuthStore(t)
  198. defer tearDown(t)
  199. // adds a new role
  200. _, err := as.RoleAdd(&pb.AuthRoleAddRequest{Name: "role-test-1"})
  201. if err != nil {
  202. t.Fatal(err)
  203. }
  204. }
  205. func TestUserGrant(t *testing.T) {
  206. as, tearDown := setupAuthStore(t)
  207. defer tearDown(t)
  208. // grants a role to the user
  209. _, err := as.UserGrantRole(&pb.AuthUserGrantRoleRequest{User: "foo", Role: "role-test"})
  210. if err != nil {
  211. t.Fatal(err)
  212. }
  213. // grants a role to a non-existing user
  214. _, err = as.UserGrantRole(&pb.AuthUserGrantRoleRequest{User: "foo-test", Role: "role-test"})
  215. if err == nil {
  216. t.Errorf("expected %v, got %v", ErrUserNotFound, err)
  217. }
  218. if err != ErrUserNotFound {
  219. t.Errorf("expected %v, got %v", ErrUserNotFound, err)
  220. }
  221. }
  222. func TestGetUser(t *testing.T) {
  223. as, tearDown := setupAuthStore(t)
  224. defer tearDown(t)
  225. _, err := as.UserGrantRole(&pb.AuthUserGrantRoleRequest{User: "foo", Role: "role-test"})
  226. if err != nil {
  227. t.Fatal(err)
  228. }
  229. u, err := as.UserGet(&pb.AuthUserGetRequest{Name: "foo"})
  230. if err != nil {
  231. t.Fatal(err)
  232. }
  233. if u == nil {
  234. t.Fatal("expect user not nil, got nil")
  235. }
  236. expected := []string{"role-test"}
  237. if !reflect.DeepEqual(expected, u.Roles) {
  238. t.Errorf("expected %v, got %v", expected, u.Roles)
  239. }
  240. }
  241. func TestListUsers(t *testing.T) {
  242. as, tearDown := setupAuthStore(t)
  243. defer tearDown(t)
  244. ua := &pb.AuthUserAddRequest{Name: "user1", Password: "pwd1"}
  245. _, err := as.UserAdd(ua) // add a non-existing user
  246. if err != nil {
  247. t.Fatal(err)
  248. }
  249. ul, err := as.UserList(&pb.AuthUserListRequest{})
  250. if err != nil {
  251. t.Fatal(err)
  252. }
  253. if !contains(ul.Users, "root") {
  254. t.Errorf("expected %v in %v", "root", ul.Users)
  255. }
  256. if !contains(ul.Users, "user1") {
  257. t.Errorf("expected %v in %v", "user1", ul.Users)
  258. }
  259. }
  260. func TestRoleGrantPermission(t *testing.T) {
  261. as, tearDown := setupAuthStore(t)
  262. defer tearDown(t)
  263. _, err := as.RoleAdd(&pb.AuthRoleAddRequest{Name: "role-test-1"})
  264. if err != nil {
  265. t.Fatal(err)
  266. }
  267. perm := &authpb.Permission{
  268. PermType: authpb.WRITE,
  269. Key: []byte("Keys"),
  270. RangeEnd: []byte("RangeEnd"),
  271. }
  272. _, err = as.RoleGrantPermission(&pb.AuthRoleGrantPermissionRequest{
  273. Name: "role-test-1",
  274. Perm: perm,
  275. })
  276. if err != nil {
  277. t.Error(err)
  278. }
  279. r, err := as.RoleGet(&pb.AuthRoleGetRequest{Role: "role-test-1"})
  280. if err != nil {
  281. t.Fatal(err)
  282. }
  283. if !reflect.DeepEqual(perm, r.Perm[0]) {
  284. t.Errorf("expected %v, got %v", perm, r.Perm[0])
  285. }
  286. }
  287. func TestRoleRevokePermission(t *testing.T) {
  288. as, tearDown := setupAuthStore(t)
  289. defer tearDown(t)
  290. _, err := as.RoleAdd(&pb.AuthRoleAddRequest{Name: "role-test-1"})
  291. if err != nil {
  292. t.Fatal(err)
  293. }
  294. perm := &authpb.Permission{
  295. PermType: authpb.WRITE,
  296. Key: []byte("Keys"),
  297. RangeEnd: []byte("RangeEnd"),
  298. }
  299. _, err = as.RoleGrantPermission(&pb.AuthRoleGrantPermissionRequest{
  300. Name: "role-test-1",
  301. Perm: perm,
  302. })
  303. if err != nil {
  304. t.Fatal(err)
  305. }
  306. _, err = as.RoleGet(&pb.AuthRoleGetRequest{Role: "role-test-1"})
  307. if err != nil {
  308. t.Fatal(err)
  309. }
  310. _, err = as.RoleRevokePermission(&pb.AuthRoleRevokePermissionRequest{
  311. Role: "role-test-1",
  312. Key: []byte("Keys"),
  313. RangeEnd: []byte("RangeEnd"),
  314. })
  315. if err != nil {
  316. t.Fatal(err)
  317. }
  318. var r *pb.AuthRoleGetResponse
  319. r, err = as.RoleGet(&pb.AuthRoleGetRequest{Role: "role-test-1"})
  320. if err != nil {
  321. t.Fatal(err)
  322. }
  323. if len(r.Perm) != 0 {
  324. t.Errorf("expected %v, got %v", 0, len(r.Perm))
  325. }
  326. }
  327. func TestUserRevokePermission(t *testing.T) {
  328. as, tearDown := setupAuthStore(t)
  329. defer tearDown(t)
  330. _, err := as.RoleAdd(&pb.AuthRoleAddRequest{Name: "role-test-1"})
  331. if err != nil {
  332. t.Fatal(err)
  333. }
  334. _, err = as.UserGrantRole(&pb.AuthUserGrantRoleRequest{User: "foo", Role: "role-test"})
  335. if err != nil {
  336. t.Fatal(err)
  337. }
  338. _, err = as.UserGrantRole(&pb.AuthUserGrantRoleRequest{User: "foo", Role: "role-test-1"})
  339. if err != nil {
  340. t.Fatal(err)
  341. }
  342. u, err := as.UserGet(&pb.AuthUserGetRequest{Name: "foo"})
  343. if err != nil {
  344. t.Fatal(err)
  345. }
  346. expected := []string{"role-test", "role-test-1"}
  347. if !reflect.DeepEqual(expected, u.Roles) {
  348. t.Fatalf("expected %v, got %v", expected, u.Roles)
  349. }
  350. _, err = as.UserRevokeRole(&pb.AuthUserRevokeRoleRequest{Name: "foo", Role: "role-test-1"})
  351. if err != nil {
  352. t.Fatal(err)
  353. }
  354. u, err = as.UserGet(&pb.AuthUserGetRequest{Name: "foo"})
  355. if err != nil {
  356. t.Fatal(err)
  357. }
  358. expected = []string{"role-test"}
  359. if !reflect.DeepEqual(expected, u.Roles) {
  360. t.Errorf("expected %v, got %v", expected, u.Roles)
  361. }
  362. }
  363. func TestRoleDelete(t *testing.T) {
  364. as, tearDown := setupAuthStore(t)
  365. defer tearDown(t)
  366. _, err := as.RoleDelete(&pb.AuthRoleDeleteRequest{Role: "role-test"})
  367. if err != nil {
  368. t.Fatal(err)
  369. }
  370. rl, err := as.RoleList(&pb.AuthRoleListRequest{})
  371. if err != nil {
  372. t.Fatal(err)
  373. }
  374. expected := []string{"root"}
  375. if !reflect.DeepEqual(expected, rl.Roles) {
  376. t.Errorf("expected %v, got %v", expected, rl.Roles)
  377. }
  378. }
  379. func TestAuthInfoFromCtx(t *testing.T) {
  380. as, tearDown := setupAuthStore(t)
  381. defer tearDown(t)
  382. ctx := context.Background()
  383. ai, err := as.AuthInfoFromCtx(ctx)
  384. if err != nil && ai != nil {
  385. t.Errorf("expected (nil, nil), got (%v, %v)", ai, err)
  386. }
  387. // as if it came from RPC
  388. ctx = metadata.NewIncomingContext(context.Background(), metadata.New(map[string]string{"tokens": "dummy"}))
  389. ai, err = as.AuthInfoFromCtx(ctx)
  390. if err != nil && ai != nil {
  391. t.Errorf("expected (nil, nil), got (%v, %v)", ai, err)
  392. }
  393. ctx = context.WithValue(context.WithValue(context.TODO(), AuthenticateParamIndex{}, uint64(1)), AuthenticateParamSimpleTokenPrefix{}, "dummy")
  394. resp, err := as.Authenticate(ctx, "foo", "bar")
  395. if err != nil {
  396. t.Error(err)
  397. }
  398. ctx = metadata.NewIncomingContext(context.Background(), metadata.New(map[string]string{rpctypes.TokenFieldNameGRPC: "Invalid Token"}))
  399. _, err = as.AuthInfoFromCtx(ctx)
  400. if err != ErrInvalidAuthToken {
  401. t.Errorf("expected %v, got %v", ErrInvalidAuthToken, err)
  402. }
  403. ctx = metadata.NewIncomingContext(context.Background(), metadata.New(map[string]string{rpctypes.TokenFieldNameGRPC: "Invalid.Token"}))
  404. _, err = as.AuthInfoFromCtx(ctx)
  405. if err != ErrInvalidAuthToken {
  406. t.Errorf("expected %v, got %v", ErrInvalidAuthToken, err)
  407. }
  408. ctx = metadata.NewIncomingContext(context.Background(), metadata.New(map[string]string{rpctypes.TokenFieldNameGRPC: resp.Token}))
  409. ai, err = as.AuthInfoFromCtx(ctx)
  410. if err != nil {
  411. t.Error(err)
  412. }
  413. if ai.Username != "foo" {
  414. t.Errorf("expected %v, got %v", "foo", ai.Username)
  415. }
  416. }
  417. func TestAuthDisable(t *testing.T) {
  418. as, tearDown := setupAuthStore(t)
  419. defer tearDown(t)
  420. as.AuthDisable()
  421. ctx := context.WithValue(context.WithValue(context.TODO(), AuthenticateParamIndex{}, uint64(2)), AuthenticateParamSimpleTokenPrefix{}, "dummy")
  422. _, err := as.Authenticate(ctx, "foo", "bar")
  423. if err != ErrAuthNotEnabled {
  424. t.Errorf("expected %v, got %v", ErrAuthNotEnabled, err)
  425. }
  426. // Disabling disabled auth to make sure it can return safely if store is already disabled.
  427. as.AuthDisable()
  428. _, err = as.Authenticate(ctx, "foo", "bar")
  429. if err != ErrAuthNotEnabled {
  430. t.Errorf("expected %v, got %v", ErrAuthNotEnabled, err)
  431. }
  432. }
  433. // TestAuthRevisionRace ensures that access to authStore.revision is thread-safe.
  434. func TestAuthInfoFromCtxRace(t *testing.T) {
  435. b, tPath := backend.NewDefaultTmpBackend()
  436. defer os.Remove(tPath)
  437. tp, err := NewTokenProvider(zap.NewExample(), "simple", dummyIndexWaiter)
  438. if err != nil {
  439. t.Fatal(err)
  440. }
  441. as := NewAuthStore(zap.NewExample(), b, tp)
  442. defer as.Close()
  443. donec := make(chan struct{})
  444. go func() {
  445. defer close(donec)
  446. ctx := metadata.NewIncomingContext(context.Background(), metadata.New(map[string]string{rpctypes.TokenFieldNameGRPC: "test"}))
  447. as.AuthInfoFromCtx(ctx)
  448. }()
  449. as.UserAdd(&pb.AuthUserAddRequest{Name: "test"})
  450. <-donec
  451. }
  452. func TestIsAdminPermitted(t *testing.T) {
  453. as, tearDown := setupAuthStore(t)
  454. defer tearDown(t)
  455. err := as.IsAdminPermitted(&AuthInfo{Username: "root", Revision: 1})
  456. if err != nil {
  457. t.Errorf("expected nil, got %v", err)
  458. }
  459. // invalid user
  460. err = as.IsAdminPermitted(&AuthInfo{Username: "rooti", Revision: 1})
  461. if err != ErrUserNotFound {
  462. t.Errorf("expected %v, got %v", ErrUserNotFound, err)
  463. }
  464. // non-admin user
  465. err = as.IsAdminPermitted(&AuthInfo{Username: "foo", Revision: 1})
  466. if err != ErrPermissionDenied {
  467. t.Errorf("expected %v, got %v", ErrPermissionDenied, err)
  468. }
  469. // disabled auth should return nil
  470. as.AuthDisable()
  471. err = as.IsAdminPermitted(&AuthInfo{Username: "root", Revision: 1})
  472. if err != nil {
  473. t.Errorf("expected nil, got %v", err)
  474. }
  475. }
  476. func TestRecoverFromSnapshot(t *testing.T) {
  477. as, _ := setupAuthStore(t)
  478. ua := &pb.AuthUserAddRequest{Name: "foo"}
  479. _, err := as.UserAdd(ua) // add an existing user
  480. if err == nil {
  481. t.Fatalf("expected %v, got %v", ErrUserAlreadyExist, err)
  482. }
  483. if err != ErrUserAlreadyExist {
  484. t.Fatalf("expected %v, got %v", ErrUserAlreadyExist, err)
  485. }
  486. ua = &pb.AuthUserAddRequest{Name: ""}
  487. _, err = as.UserAdd(ua) // add a user with empty name
  488. if err != ErrUserEmpty {
  489. t.Fatal(err)
  490. }
  491. as.Close()
  492. tp, err := NewTokenProvider(zap.NewExample(), "simple", dummyIndexWaiter)
  493. if err != nil {
  494. t.Fatal(err)
  495. }
  496. as2 := NewAuthStore(zap.NewExample(), as.be, tp)
  497. defer func(a *authStore) {
  498. a.Close()
  499. }(as2)
  500. if !as2.IsAuthEnabled() {
  501. t.Fatal("recovering authStore from existing backend failed")
  502. }
  503. ul, err := as.UserList(&pb.AuthUserListRequest{})
  504. if err != nil {
  505. t.Fatal(err)
  506. }
  507. if !contains(ul.Users, "root") {
  508. t.Errorf("expected %v in %v", "root", ul.Users)
  509. }
  510. }
  511. func contains(array []string, str string) bool {
  512. for _, s := range array {
  513. if s == str {
  514. return true
  515. }
  516. }
  517. return false
  518. }
  519. func TestHammerSimpleAuthenticate(t *testing.T) {
  520. // set TTL values low to try to trigger races
  521. oldTTL, oldTTLRes := simpleTokenTTL, simpleTokenTTLResolution
  522. defer func() {
  523. simpleTokenTTL = oldTTL
  524. simpleTokenTTLResolution = oldTTLRes
  525. }()
  526. simpleTokenTTL = 10 * time.Millisecond
  527. simpleTokenTTLResolution = simpleTokenTTL
  528. users := make(map[string]struct{})
  529. as, tearDown := setupAuthStore(t)
  530. defer tearDown(t)
  531. // create lots of users
  532. for i := 0; i < 50; i++ {
  533. u := fmt.Sprintf("user-%d", i)
  534. ua := &pb.AuthUserAddRequest{Name: u, Password: "123"}
  535. if _, err := as.UserAdd(ua); err != nil {
  536. t.Fatal(err)
  537. }
  538. users[u] = struct{}{}
  539. }
  540. // hammer on authenticate with lots of users
  541. for i := 0; i < 10; i++ {
  542. var wg sync.WaitGroup
  543. wg.Add(len(users))
  544. for u := range users {
  545. go func(user string) {
  546. defer wg.Done()
  547. token := fmt.Sprintf("%s(%d)", user, i)
  548. ctx := context.WithValue(context.WithValue(context.TODO(), AuthenticateParamIndex{}, uint64(1)), AuthenticateParamSimpleTokenPrefix{}, token)
  549. if _, err := as.Authenticate(ctx, user, "123"); err != nil {
  550. t.Fatal(err)
  551. }
  552. if _, err := as.AuthInfoFromCtx(ctx); err != nil {
  553. t.Fatal(err)
  554. }
  555. }(u)
  556. }
  557. time.Sleep(time.Millisecond)
  558. wg.Wait()
  559. }
  560. }
  561. // TestRolesOrder tests authpb.User.Roles is sorted
  562. func TestRolesOrder(t *testing.T) {
  563. b, tPath := backend.NewDefaultTmpBackend()
  564. defer os.Remove(tPath)
  565. tp, err := NewTokenProvider(zap.NewExample(), "simple", dummyIndexWaiter)
  566. if err != nil {
  567. t.Fatal(err)
  568. }
  569. as := NewAuthStore(zap.NewExample(), b, tp)
  570. err = enableAuthAndCreateRoot(as)
  571. if err != nil {
  572. t.Fatal(err)
  573. }
  574. username := "user"
  575. _, err = as.UserAdd(&pb.AuthUserAddRequest{Name: username, Password: "pass"})
  576. if err != nil {
  577. t.Fatal(err)
  578. }
  579. roles := []string{"role1", "role2", "abc", "xyz", "role3"}
  580. for _, role := range roles {
  581. _, err = as.RoleAdd(&pb.AuthRoleAddRequest{Name: role})
  582. if err != nil {
  583. t.Fatal(err)
  584. }
  585. _, err = as.UserGrantRole(&pb.AuthUserGrantRoleRequest{User: username, Role: role})
  586. if err != nil {
  587. t.Fatal(err)
  588. }
  589. }
  590. user, err := as.UserGet(&pb.AuthUserGetRequest{Name: username})
  591. if err != nil {
  592. t.Fatal(err)
  593. }
  594. for i := 1; i < len(user.Roles); i++ {
  595. if strings.Compare(user.Roles[i-1], user.Roles[i]) != -1 {
  596. t.Errorf("User.Roles isn't sorted (%s vs %s)", user.Roles[i-1], user.Roles[i])
  597. }
  598. }
  599. }
  600. // TestAuthInfoFromCtxWithRoot ensures "WithRoot" properly embeds token in the context.
  601. func TestAuthInfoFromCtxWithRoot(t *testing.T) {
  602. b, tPath := backend.NewDefaultTmpBackend()
  603. defer os.Remove(tPath)
  604. tp, err := NewTokenProvider(zap.NewExample(), "simple", dummyIndexWaiter)
  605. if err != nil {
  606. t.Fatal(err)
  607. }
  608. as := NewAuthStore(zap.NewExample(), b, tp)
  609. defer as.Close()
  610. if err = enableAuthAndCreateRoot(as); err != nil {
  611. t.Fatal(err)
  612. }
  613. ctx := context.Background()
  614. ctx = as.WithRoot(ctx)
  615. ai, aerr := as.AuthInfoFromCtx(ctx)
  616. if aerr != nil {
  617. t.Error(err)
  618. }
  619. if ai == nil {
  620. t.Error("expected non-nil *AuthInfo")
  621. }
  622. if ai.Username != "root" {
  623. t.Errorf("expected user name 'root', got %+v", ai)
  624. }
  625. }