store_test.go 19 KB

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