apply_auth.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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 etcdserver
  15. import (
  16. "github.com/coreos/etcd/auth"
  17. pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
  18. )
  19. type authApplierV3 struct {
  20. applierV3
  21. as auth.AuthStore
  22. user string
  23. }
  24. func newAuthApplierV3(as auth.AuthStore, base applierV3) *authApplierV3 {
  25. return &authApplierV3{base, as, ""}
  26. }
  27. func (aa *authApplierV3) Apply(r *pb.InternalRaftRequest) *applyResult {
  28. var user string
  29. if r.Header != nil {
  30. // backward-compatible with pre-3.0 releases when internalRaftRequest
  31. // does not have header field
  32. user = r.Header.Username
  33. }
  34. if needAdminPermission(r) && !aa.as.IsAdminPermitted(user) {
  35. return &applyResult{err: auth.ErrPermissionDenied}
  36. }
  37. aa.user = user
  38. ret := aa.applierV3.Apply(r)
  39. aa.user = ""
  40. return ret
  41. }
  42. func (aa *authApplierV3) Put(txnID int64, r *pb.PutRequest) (*pb.PutResponse, error) {
  43. if !aa.as.IsPutPermitted(aa.user, r.Key) {
  44. return nil, auth.ErrPermissionDenied
  45. }
  46. return aa.applierV3.Put(txnID, r)
  47. }
  48. func (aa *authApplierV3) Range(txnID int64, r *pb.RangeRequest) (*pb.RangeResponse, error) {
  49. if !aa.as.IsRangePermitted(aa.user, r.Key, r.RangeEnd) {
  50. return nil, auth.ErrPermissionDenied
  51. }
  52. return aa.applierV3.Range(txnID, r)
  53. }
  54. func (aa *authApplierV3) DeleteRange(txnID int64, r *pb.DeleteRangeRequest) (*pb.DeleteRangeResponse, error) {
  55. if !aa.as.IsDeleteRangePermitted(aa.user, r.Key, r.RangeEnd) {
  56. return nil, auth.ErrPermissionDenied
  57. }
  58. return aa.applierV3.DeleteRange(txnID, r)
  59. }
  60. func (aa *authApplierV3) checkTxnReqsPermission(reqs []*pb.RequestOp) bool {
  61. for _, requ := range reqs {
  62. switch tv := requ.Request.(type) {
  63. case *pb.RequestOp_RequestRange:
  64. if tv.RequestRange == nil {
  65. continue
  66. }
  67. if !aa.as.IsRangePermitted(aa.user, tv.RequestRange.Key, tv.RequestRange.RangeEnd) {
  68. return false
  69. }
  70. case *pb.RequestOp_RequestPut:
  71. if tv.RequestPut == nil {
  72. continue
  73. }
  74. if !aa.as.IsPutPermitted(aa.user, tv.RequestPut.Key) {
  75. return false
  76. }
  77. case *pb.RequestOp_RequestDeleteRange:
  78. if tv.RequestDeleteRange == nil {
  79. continue
  80. }
  81. if !aa.as.IsDeleteRangePermitted(aa.user, tv.RequestDeleteRange.Key, tv.RequestDeleteRange.RangeEnd) {
  82. return false
  83. }
  84. }
  85. }
  86. return true
  87. }
  88. func (aa *authApplierV3) Txn(rt *pb.TxnRequest) (*pb.TxnResponse, error) {
  89. for _, c := range rt.Compare {
  90. if !aa.as.IsRangePermitted(aa.user, c.Key, nil) {
  91. return nil, auth.ErrPermissionDenied
  92. }
  93. }
  94. if !aa.checkTxnReqsPermission(rt.Success) {
  95. return nil, auth.ErrPermissionDenied
  96. }
  97. if !aa.checkTxnReqsPermission(rt.Failure) {
  98. return nil, auth.ErrPermissionDenied
  99. }
  100. return aa.applierV3.Txn(rt)
  101. }
  102. func needAdminPermission(r *pb.InternalRaftRequest) bool {
  103. switch {
  104. case r.AuthEnable != nil:
  105. return true
  106. case r.AuthDisable != nil:
  107. return true
  108. case r.AuthUserAdd != nil:
  109. return true
  110. case r.AuthUserDelete != nil:
  111. return true
  112. case r.AuthUserChangePassword != nil:
  113. return true
  114. case r.AuthUserGrantRole != nil:
  115. return true
  116. case r.AuthUserGet != nil:
  117. return true
  118. case r.AuthUserRevokeRole != nil:
  119. return true
  120. case r.AuthRoleAdd != nil:
  121. return true
  122. case r.AuthRoleGrantPermission != nil:
  123. return true
  124. case r.AuthRoleGet != nil:
  125. return true
  126. case r.AuthRoleRevokePermission != nil:
  127. return true
  128. case r.AuthRoleDelete != nil:
  129. return true
  130. default:
  131. return false
  132. }
  133. }