diff --git a/etcdserver/apply.go b/etcdserver/apply.go index 29a5cffb5..ed2027c82 100644 --- a/etcdserver/apply.go +++ b/etcdserver/apply.go @@ -210,6 +210,21 @@ func (a *applierV3backend) DeleteRange(txnID int64, dr *pb.DeleteRangeRequest) ( dr.RangeEnd = []byte{} } + var rr *mvcc.RangeResult + if dr.PrevKv { + if txnID != noTxn { + rr, err = a.s.KV().TxnRange(txnID, dr.Key, dr.RangeEnd, mvcc.RangeOptions{}) + if err != nil { + return nil, err + } + } else { + rr, err = a.s.KV().Range(dr.Key, dr.RangeEnd, mvcc.RangeOptions{}) + if err != nil { + return nil, err + } + } + } + if txnID != noTxn { n, rev, err = a.s.KV().TxnDeleteRange(txnID, dr.Key, dr.RangeEnd) if err != nil { @@ -220,6 +235,11 @@ func (a *applierV3backend) DeleteRange(txnID int64, dr *pb.DeleteRangeRequest) ( } resp.Deleted = n + if rr != nil { + for i := range rr.KVs { + resp.PrevKvs = append(resp.PrevKvs, &rr.KVs[i]) + } + } resp.Header.Revision = rev return resp, nil } diff --git a/etcdserver/apply_auth.go b/etcdserver/apply_auth.go index fba3fd263..38bf2b407 100644 --- a/etcdserver/apply_auth.go +++ b/etcdserver/apply_auth.go @@ -73,6 +73,9 @@ func (aa *authApplierV3) DeleteRange(txnID int64, r *pb.DeleteRangeRequest) (*pb if !aa.as.IsDeleteRangePermitted(aa.user, r.Key, r.RangeEnd) { return nil, auth.ErrPermissionDenied } + if r.PrevKv && !aa.as.IsRangePermitted(aa.user, r.Key, r.RangeEnd) { + return nil, auth.ErrPermissionDenied + } return aa.applierV3.DeleteRange(txnID, r) } @@ -102,7 +105,7 @@ func (aa *authApplierV3) checkTxnReqsPermission(reqs []*pb.RequestOp) bool { continue } - if !aa.as.IsDeleteRangePermitted(aa.user, tv.RequestDeleteRange.Key, tv.RequestDeleteRange.RangeEnd) { + if tv.RequestDeleteRange.PrevKv && !aa.as.IsRangePermitted(aa.user, tv.RequestDeleteRange.Key, tv.RequestDeleteRange.RangeEnd) { return false } }