store_test.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  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 TestUserAdd(t *testing.T) {
  25. b, tPath := backend.NewDefaultTmpBackend()
  26. defer func() {
  27. b.Close()
  28. os.Remove(tPath)
  29. }()
  30. as := NewAuthStore(b)
  31. ua := &pb.AuthUserAddRequest{Name: "foo"}
  32. _, err := as.UserAdd(ua) // add a non-existing user
  33. if err != nil {
  34. t.Fatal(err)
  35. }
  36. _, err = as.UserAdd(ua) // add an existing user
  37. if err == nil {
  38. t.Fatalf("expected %v, got %v", ErrUserAlreadyExist, err)
  39. }
  40. if err != ErrUserAlreadyExist {
  41. t.Fatalf("expected %v, got %v", ErrUserAlreadyExist, err)
  42. }
  43. }
  44. func enableAuthAndCreateRoot(as *authStore) error {
  45. _, err := as.UserAdd(&pb.AuthUserAddRequest{Name: "root", Password: "root"})
  46. if err != nil {
  47. return err
  48. }
  49. _, err = as.RoleAdd(&pb.AuthRoleAddRequest{Name: "root"})
  50. if err != nil {
  51. return err
  52. }
  53. _, err = as.UserGrantRole(&pb.AuthUserGrantRoleRequest{User: "root", Role: "root"})
  54. if err != nil {
  55. return err
  56. }
  57. return as.AuthEnable()
  58. }
  59. func TestAuthenticate(t *testing.T) {
  60. b, tPath := backend.NewDefaultTmpBackend()
  61. defer func() {
  62. b.Close()
  63. os.Remove(tPath)
  64. }()
  65. as := NewAuthStore(b)
  66. err := enableAuthAndCreateRoot(as)
  67. if err != nil {
  68. t.Fatal(err)
  69. }
  70. ua := &pb.AuthUserAddRequest{Name: "foo", Password: "bar"}
  71. _, err = as.UserAdd(ua)
  72. if err != nil {
  73. t.Fatal(err)
  74. }
  75. // auth a non-existing user
  76. ctx1 := context.WithValue(context.WithValue(context.TODO(), "index", uint64(1)), "simpleToken", "dummy")
  77. _, err = as.Authenticate(ctx1, "foo-test", "bar")
  78. if err == nil {
  79. t.Fatalf("expected %v, got %v", ErrAuthFailed, err)
  80. }
  81. if err != ErrAuthFailed {
  82. t.Fatalf("expected %v, got %v", ErrAuthFailed, err)
  83. }
  84. // auth an existing user with correct password
  85. ctx2 := context.WithValue(context.WithValue(context.TODO(), "index", uint64(2)), "simpleToken", "dummy")
  86. _, err = as.Authenticate(ctx2, "foo", "bar")
  87. if err != nil {
  88. t.Fatal(err)
  89. }
  90. // auth an existing user but with wrong password
  91. ctx3 := context.WithValue(context.WithValue(context.TODO(), "index", uint64(3)), "simpleToken", "dummy")
  92. _, err = as.Authenticate(ctx3, "foo", "")
  93. if err == nil {
  94. t.Fatalf("expected %v, got %v", ErrAuthFailed, err)
  95. }
  96. if err != ErrAuthFailed {
  97. t.Fatalf("expected %v, got %v", ErrAuthFailed, err)
  98. }
  99. }
  100. func TestUserDelete(t *testing.T) {
  101. b, tPath := backend.NewDefaultTmpBackend()
  102. defer func() {
  103. b.Close()
  104. os.Remove(tPath)
  105. }()
  106. as := NewAuthStore(b)
  107. err := enableAuthAndCreateRoot(as)
  108. if err != nil {
  109. t.Fatal(err)
  110. }
  111. ua := &pb.AuthUserAddRequest{Name: "foo"}
  112. _, err = as.UserAdd(ua)
  113. if err != nil {
  114. t.Fatal(err)
  115. }
  116. // delete an existing user
  117. ud := &pb.AuthUserDeleteRequest{Name: "foo"}
  118. _, err = as.UserDelete(ud)
  119. if err != nil {
  120. t.Fatal(err)
  121. }
  122. // delete a non-existing user
  123. _, err = as.UserDelete(ud)
  124. if err == nil {
  125. t.Fatalf("expected %v, got %v", ErrUserNotFound, err)
  126. }
  127. if err != ErrUserNotFound {
  128. t.Fatalf("expected %v, got %v", ErrUserNotFound, err)
  129. }
  130. }
  131. func TestUserChangePassword(t *testing.T) {
  132. b, tPath := backend.NewDefaultTmpBackend()
  133. defer func() {
  134. b.Close()
  135. os.Remove(tPath)
  136. }()
  137. as := NewAuthStore(b)
  138. err := enableAuthAndCreateRoot(as)
  139. if err != nil {
  140. t.Fatal(err)
  141. }
  142. _, err = as.UserAdd(&pb.AuthUserAddRequest{Name: "foo"})
  143. if err != nil {
  144. t.Fatal(err)
  145. }
  146. ctx1 := context.WithValue(context.WithValue(context.TODO(), "index", uint64(1)), "simpleToken", "dummy")
  147. _, err = as.Authenticate(ctx1, "foo", "")
  148. if err != nil {
  149. t.Fatal(err)
  150. }
  151. _, err = as.UserChangePassword(&pb.AuthUserChangePasswordRequest{Name: "foo", Password: "bar"})
  152. if err != nil {
  153. t.Fatal(err)
  154. }
  155. ctx2 := context.WithValue(context.WithValue(context.TODO(), "index", uint64(2)), "simpleToken", "dummy")
  156. _, err = as.Authenticate(ctx2, "foo", "bar")
  157. if err != nil {
  158. t.Fatal(err)
  159. }
  160. // change a non-existing user
  161. _, err = as.UserChangePassword(&pb.AuthUserChangePasswordRequest{Name: "foo-test", Password: "bar"})
  162. if err == nil {
  163. t.Fatalf("expected %v, got %v", ErrUserNotFound, err)
  164. }
  165. if err != ErrUserNotFound {
  166. t.Fatalf("expected %v, got %v", ErrUserNotFound, err)
  167. }
  168. }
  169. func TestRoleAdd(t *testing.T) {
  170. b, tPath := backend.NewDefaultTmpBackend()
  171. defer func() {
  172. b.Close()
  173. os.Remove(tPath)
  174. }()
  175. as := NewAuthStore(b)
  176. err := enableAuthAndCreateRoot(as)
  177. if err != nil {
  178. t.Fatal(err)
  179. }
  180. // adds a new role
  181. _, err = as.RoleAdd(&pb.AuthRoleAddRequest{Name: "role-test"})
  182. if err != nil {
  183. t.Fatal(err)
  184. }
  185. }
  186. func TestUserGrant(t *testing.T) {
  187. b, tPath := backend.NewDefaultTmpBackend()
  188. defer func() {
  189. b.Close()
  190. os.Remove(tPath)
  191. }()
  192. as := NewAuthStore(b)
  193. err := enableAuthAndCreateRoot(as)
  194. if err != nil {
  195. t.Fatal(err)
  196. }
  197. _, err = as.UserAdd(&pb.AuthUserAddRequest{Name: "foo"})
  198. if err != nil {
  199. t.Fatal(err)
  200. }
  201. // adds a new role
  202. _, err = as.RoleAdd(&pb.AuthRoleAddRequest{Name: "role-test"})
  203. if err != nil {
  204. t.Fatal(err)
  205. }
  206. // grants a role to the user
  207. _, err = as.UserGrantRole(&pb.AuthUserGrantRoleRequest{User: "foo", Role: "role-test"})
  208. if err != nil {
  209. t.Fatal(err)
  210. }
  211. // grants a role to a non-existing user
  212. _, err = as.UserGrantRole(&pb.AuthUserGrantRoleRequest{User: "foo-test", Role: "role-test"})
  213. if err == nil {
  214. t.Fatalf("expected %v, got %v", ErrUserNotFound, err)
  215. }
  216. if err != ErrUserNotFound {
  217. t.Fatalf("expected %v, got %v", ErrUserNotFound, err)
  218. }
  219. }