mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
etcdserver: protect lease timetilive with auth
Signed-off-by: Hitoshi Mitake <h.mitake@gmail.com> Co-authored-by: Benjamin Wang <wachao@vmware.com>
This commit is contained in:
@@ -336,7 +336,32 @@ func (s *EtcdServer) LeaseRenew(ctx context.Context, id lease.LeaseID) (int64, e
|
|||||||
return -1, ErrCanceled
|
return -1, ErrCanceled
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *EtcdServer) LeaseTimeToLive(ctx context.Context, r *pb.LeaseTimeToLiveRequest) (*pb.LeaseTimeToLiveResponse, error) {
|
func (s *EtcdServer) checkLeaseTimeToLive(ctx context.Context, leaseID lease.LeaseID) (uint64, error) {
|
||||||
|
rev := s.AuthStore().Revision()
|
||||||
|
if !s.AuthStore().IsAuthEnabled() {
|
||||||
|
return rev, nil
|
||||||
|
}
|
||||||
|
authInfo, err := s.AuthInfoFromCtx(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return rev, err
|
||||||
|
}
|
||||||
|
if authInfo == nil {
|
||||||
|
return rev, auth.ErrUserEmpty
|
||||||
|
}
|
||||||
|
|
||||||
|
l := s.lessor.Lookup(leaseID)
|
||||||
|
if l != nil {
|
||||||
|
for _, key := range l.Keys() {
|
||||||
|
if err := s.AuthStore().IsRangePermitted(authInfo, []byte(key), []byte{}); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rev, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *EtcdServer) leaseTimeToLive(ctx context.Context, r *pb.LeaseTimeToLiveRequest) (*pb.LeaseTimeToLiveResponse, error) {
|
||||||
if s.isLeader() {
|
if s.isLeader() {
|
||||||
if err := s.waitAppliedIndex(); err != nil {
|
if err := s.waitAppliedIndex(); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -386,6 +411,31 @@ func (s *EtcdServer) LeaseTimeToLive(ctx context.Context, r *pb.LeaseTimeToLiveR
|
|||||||
return nil, ErrCanceled
|
return nil, ErrCanceled
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *EtcdServer) LeaseTimeToLive(ctx context.Context, r *pb.LeaseTimeToLiveRequest) (*pb.LeaseTimeToLiveResponse, error) {
|
||||||
|
var rev uint64
|
||||||
|
var err error
|
||||||
|
if r.Keys {
|
||||||
|
// check RBAC permission only if Keys is true
|
||||||
|
rev, err = s.checkLeaseTimeToLive(ctx, lease.LeaseID(r.ID))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.leaseTimeToLive(ctx, r)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if r.Keys {
|
||||||
|
if s.AuthStore().IsAuthEnabled() && rev != s.AuthStore().Revision() {
|
||||||
|
return nil, auth.ErrAuthOldRevision
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// LeaseLeases is really ListLeases !???
|
||||||
func (s *EtcdServer) LeaseLeases(ctx context.Context, r *pb.LeaseLeasesRequest) (*pb.LeaseLeasesResponse, error) {
|
func (s *EtcdServer) LeaseLeases(ctx context.Context, r *pb.LeaseLeasesRequest) (*pb.LeaseLeasesResponse, error) {
|
||||||
ls := s.lessor.Leases()
|
ls := s.lessor.Leases()
|
||||||
lss := make([]*pb.LeaseStatus, len(ls))
|
lss := make([]*pb.LeaseStatus, len(ls))
|
||||||
|
|||||||
Reference in New Issue
Block a user