store_test.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  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. "os"
  17. "testing"
  18. pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
  19. "github.com/coreos/etcd/mvcc/backend"
  20. "golang.org/x/crypto/bcrypt"
  21. "golang.org/x/net/context"
  22. )
  23. func init() { BcryptCost = bcrypt.MinCost }
  24. func dummyIndexWaiter(index uint64) <-chan struct{} {
  25. ch := make(chan struct{})
  26. go func() {
  27. ch <- struct{}{}
  28. }()
  29. return ch
  30. }
  31. func setupAuthStore(t *testing.T) (store *authStore, teardownfunc func(t *testing.T)) {
  32. b, tPath := backend.NewDefaultTmpBackend()
  33. as := NewAuthStore(b, dummyIndexWaiter)
  34. err := enableAuthAndCreateRoot(as)
  35. if err != nil {
  36. t.Fatal(err)
  37. }
  38. // adds a new role
  39. _, err = as.RoleAdd(&pb.AuthRoleAddRequest{Name: "role-test"})
  40. if err != nil {
  41. t.Fatal(err)
  42. }
  43. ua := &pb.AuthUserAddRequest{Name: "foo", Password: "bar"}
  44. _, err = as.UserAdd(ua) // add a non-existing user
  45. if err != nil {
  46. t.Fatal(err)
  47. }
  48. tearDown := func(t *testing.T) {
  49. b.Close()
  50. os.Remove(tPath)
  51. as.Close()
  52. }
  53. return as, tearDown
  54. }
  55. func enableAuthAndCreateRoot(as *authStore) error {
  56. _, err := as.UserAdd(&pb.AuthUserAddRequest{Name: "root", Password: "root"})
  57. if err != nil {
  58. return err
  59. }
  60. _, err = as.RoleAdd(&pb.AuthRoleAddRequest{Name: "root"})
  61. if err != nil {
  62. return err
  63. }
  64. _, err = as.UserGrantRole(&pb.AuthUserGrantRoleRequest{User: "root", Role: "root"})
  65. if err != nil {
  66. return err
  67. }
  68. return as.AuthEnable()
  69. }
  70. func TestUserAdd(t *testing.T) {
  71. as, tearDown := setupAuthStore(t)
  72. defer tearDown(t)
  73. ua := &pb.AuthUserAddRequest{Name: "foo"}
  74. _, err := as.UserAdd(ua) // add an existing user
  75. if err == nil {
  76. t.Fatalf("expected %v, got %v", ErrUserAlreadyExist, err)
  77. }
  78. if err != ErrUserAlreadyExist {
  79. t.Fatalf("expected %v, got %v", ErrUserAlreadyExist, err)
  80. }
  81. ua = &pb.AuthUserAddRequest{Name: ""}
  82. _, err = as.UserAdd(ua) // add a user with empty name
  83. if err != ErrUserEmpty {
  84. t.Fatal(err)
  85. }
  86. }
  87. func TestCheckPassword(t *testing.T) {
  88. as, tearDown := setupAuthStore(t)
  89. defer tearDown(t)
  90. // auth a non-existing user
  91. _, err := as.CheckPassword("foo-test", "bar")
  92. if err == nil {
  93. t.Fatalf("expected %v, got %v", ErrAuthFailed, err)
  94. }
  95. if err != ErrAuthFailed {
  96. t.Fatalf("expected %v, got %v", ErrAuthFailed, err)
  97. }
  98. // auth an existing user with correct password
  99. _, err = as.CheckPassword("foo", "bar")
  100. if err != nil {
  101. t.Fatal(err)
  102. }
  103. // auth an existing user but with wrong password
  104. _, err = as.CheckPassword("foo", "")
  105. if err == nil {
  106. t.Fatalf("expected %v, got %v", ErrAuthFailed, err)
  107. }
  108. if err != ErrAuthFailed {
  109. t.Fatalf("expected %v, got %v", ErrAuthFailed, err)
  110. }
  111. }
  112. func TestUserDelete(t *testing.T) {
  113. as, tearDown := setupAuthStore(t)
  114. defer tearDown(t)
  115. // delete an existing user
  116. ud := &pb.AuthUserDeleteRequest{Name: "foo"}
  117. _, err := as.UserDelete(ud)
  118. if err != nil {
  119. t.Fatal(err)
  120. }
  121. // delete a non-existing user
  122. _, err = as.UserDelete(ud)
  123. if err == nil {
  124. t.Fatalf("expected %v, got %v", ErrUserNotFound, err)
  125. }
  126. if err != ErrUserNotFound {
  127. t.Fatalf("expected %v, got %v", ErrUserNotFound, err)
  128. }
  129. }
  130. func TestUserChangePassword(t *testing.T) {
  131. as, tearDown := setupAuthStore(t)
  132. defer tearDown(t)
  133. ctx1 := context.WithValue(context.WithValue(context.TODO(), "index", uint64(1)), "simpleToken", "dummy")
  134. _, err := as.Authenticate(ctx1, "foo", "")
  135. if err != nil {
  136. t.Fatal(err)
  137. }
  138. _, err = as.UserChangePassword(&pb.AuthUserChangePasswordRequest{Name: "foo", Password: "bar"})
  139. if err != nil {
  140. t.Fatal(err)
  141. }
  142. ctx2 := context.WithValue(context.WithValue(context.TODO(), "index", uint64(2)), "simpleToken", "dummy")
  143. _, err = as.Authenticate(ctx2, "foo", "bar")
  144. if err != nil {
  145. t.Fatal(err)
  146. }
  147. // change a non-existing user
  148. _, err = as.UserChangePassword(&pb.AuthUserChangePasswordRequest{Name: "foo-test", Password: "bar"})
  149. if err == nil {
  150. t.Fatalf("expected %v, got %v", ErrUserNotFound, err)
  151. }
  152. if err != ErrUserNotFound {
  153. t.Fatalf("expected %v, got %v", ErrUserNotFound, err)
  154. }
  155. }
  156. func TestRoleAdd(t *testing.T) {
  157. as, tearDown := setupAuthStore(t)
  158. defer tearDown(t)
  159. // adds a new role
  160. _, err := as.RoleAdd(&pb.AuthRoleAddRequest{Name: "role-test-1"})
  161. if err != nil {
  162. t.Fatal(err)
  163. }
  164. }
  165. func TestUserGrant(t *testing.T) {
  166. as, tearDown := setupAuthStore(t)
  167. defer tearDown(t)
  168. // grants a role to the user
  169. _, err := as.UserGrantRole(&pb.AuthUserGrantRoleRequest{User: "foo", Role: "role-test"})
  170. if err != nil {
  171. t.Fatal(err)
  172. }
  173. // grants a role to a non-existing user
  174. _, err = as.UserGrantRole(&pb.AuthUserGrantRoleRequest{User: "foo-test", Role: "role-test"})
  175. if err == nil {
  176. t.Fatalf("expected %v, got %v", ErrUserNotFound, err)
  177. }
  178. if err != ErrUserNotFound {
  179. t.Fatalf("expected %v, got %v", ErrUserNotFound, err)
  180. }
  181. }