Skip to content

Commit 9ef1747

Browse files
committed
*: use metadata Incoming/OutgoingContext
Fix #7888. Signed-off-by: Gyu-Ho Lee <gyuhox@gmail.com>
1 parent 5830201 commit 9ef1747

File tree

10 files changed

+18
-17
lines changed

10 files changed

+18
-17
lines changed

Documentation/learning/auth_design.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ For avoiding such a situation, the API layer performs *version number validation
6060

6161
After authenticating with `Authenticate()`, a client can create a gRPC connection as it would without auth. In addition to the existing initialization process, the client must associate the token with the newly created connection. `grpc.WithPerRPCCredentials()` provides the functionality for this purpose.
6262

63-
Every authenticated request from the client has a token. The token can be obtained with `grpc.metadata.FromContext()` in the server side. The server can obtain who is issuing the request and when the user was authorized. The information will be filled by the API layer in the header (`etcdserverpb.RequestHeader.Username` and `etcdserverpb.RequestHeader.AuthRevision`) of a raft log entry (`etcdserverpb.InternalRaftRequest`).
63+
Every authenticated request from the client has a token. The token can be obtained with `grpc.metadata.FromIncomingContext()` in the server side. The server can obtain who is issuing the request and when the user was authorized. The information will be filled by the API layer in the header (`etcdserverpb.RequestHeader.Username` and `etcdserverpb.RequestHeader.AuthRevision`) of a raft log entry (`etcdserverpb.InternalRaftRequest`).
6464

6565
### Checking permission in the state machine
6666

auth/store.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -995,7 +995,7 @@ func (as *authStore) AuthInfoFromTLS(ctx context.Context) *AuthInfo {
995995
}
996996

997997
func (as *authStore) AuthInfoFromCtx(ctx context.Context) (*AuthInfo, error) {
998-
md, ok := metadata.FromContext(ctx)
998+
md, ok := metadata.FromIncomingContext(ctx)
999999
if !ok {
10001000
return nil, nil
10011001
}

auth/store_test.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,8 @@ func TestAuthInfoFromCtx(t *testing.T) {
453453
t.Errorf("expected (nil, nil), got (%v, %v)", ai, err)
454454
}
455455

456-
ctx = metadata.NewContext(context.Background(), metadata.New(map[string]string{"tokens": "dummy"}))
456+
// as if it came from RPC
457+
ctx = metadata.NewIncomingContext(context.Background(), metadata.New(map[string]string{"tokens": "dummy"}))
457458
ai, err = as.AuthInfoFromCtx(ctx)
458459
if err != nil && ai != nil {
459460
t.Errorf("expected (nil, nil), got (%v, %v)", ai, err)
@@ -465,19 +466,19 @@ func TestAuthInfoFromCtx(t *testing.T) {
465466
t.Error(err)
466467
}
467468

468-
ctx = metadata.NewContext(context.Background(), metadata.New(map[string]string{"token": "Invalid Token"}))
469+
ctx = metadata.NewIncomingContext(context.Background(), metadata.New(map[string]string{"token": "Invalid Token"}))
469470
_, err = as.AuthInfoFromCtx(ctx)
470471
if err != ErrInvalidAuthToken {
471472
t.Errorf("expected %v, got %v", ErrInvalidAuthToken, err)
472473
}
473474

474-
ctx = metadata.NewContext(context.Background(), metadata.New(map[string]string{"token": "Invalid.Token"}))
475+
ctx = metadata.NewIncomingContext(context.Background(), metadata.New(map[string]string{"token": "Invalid.Token"}))
475476
_, err = as.AuthInfoFromCtx(ctx)
476477
if err != ErrInvalidAuthToken {
477478
t.Errorf("expected %v, got %v", ErrInvalidAuthToken, err)
478479
}
479480

480-
ctx = metadata.NewContext(context.Background(), metadata.New(map[string]string{"token": resp.Token}))
481+
ctx = metadata.NewIncomingContext(context.Background(), metadata.New(map[string]string{"token": resp.Token}))
481482
ai, err = as.AuthInfoFromCtx(ctx)
482483
if err != nil {
483484
t.Error(err)
@@ -521,7 +522,7 @@ func TestAuthInfoFromCtxRace(t *testing.T) {
521522
donec := make(chan struct{})
522523
go func() {
523524
defer close(donec)
524-
ctx := metadata.NewContext(context.Background(), metadata.New(map[string]string{"token": "test"}))
525+
ctx := metadata.NewIncomingContext(context.Background(), metadata.New(map[string]string{"token": "test"}))
525526
as.AuthInfoFromCtx(ctx)
526527
}()
527528
as.UserAdd(&pb.AuthUserAddRequest{Name: "test"})

clientv3/client.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ func (c *Client) dial(endpoint string, dopts ...grpc.DialOption) (*grpc.ClientCo
333333
// when the cluster has a leader.
334334
func WithRequireLeader(ctx context.Context) context.Context {
335335
md := metadata.Pairs(rpctypes.MetadataRequireLeaderKey, rpctypes.MetadataHasLeader)
336-
return metadata.NewContext(ctx, md)
336+
return metadata.NewOutgoingContext(ctx, md)
337337
}
338338

339339
func newClient(cfg *Config) (*Client, error) {

clientv3/lease.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ func (l *lessor) closeRequireLeader() {
323323
reqIdxs := 0
324324
// find all required leader channels, close, mark as nil
325325
for i, ctx := range ka.ctxs {
326-
md, ok := metadata.FromContext(ctx)
326+
md, ok := metadata.FromOutgoingContext(ctx)
327327
if !ok {
328328
continue
329329
}

etcdserver/api/v3rpc/interceptor.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func newUnaryInterceptor(s *etcdserver.EtcdServer) grpc.UnaryServerInterceptor {
4545
return nil, rpctypes.ErrGRPCNotCapable
4646
}
4747

48-
md, ok := metadata.FromContext(ctx)
48+
md, ok := metadata.FromIncomingContext(ctx)
4949
if ok {
5050
if ks := md[rpctypes.MetadataRequireLeaderKey]; len(ks) > 0 && ks[0] == rpctypes.MetadataHasLeader {
5151
if s.Leader() == types.ID(raft.None) {
@@ -66,7 +66,7 @@ func newStreamInterceptor(s *etcdserver.EtcdServer) grpc.StreamServerInterceptor
6666
return rpctypes.ErrGRPCNotCapable
6767
}
6868

69-
md, ok := metadata.FromContext(ss.Context())
69+
md, ok := metadata.FromIncomingContext(ss.Context())
7070
if ok {
7171
if ks := md[rpctypes.MetadataRequireLeaderKey]; len(ks) > 0 && ks[0] == rpctypes.MetadataHasLeader {
7272
if s.Leader() == types.ID(raft.None) {

integration/v3_grpc_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -1608,7 +1608,7 @@ func TestGRPCRequireLeader(t *testing.T) {
16081608
time.Sleep(time.Duration(3*electionTicks) * tickDuration)
16091609

16101610
md := metadata.Pairs(rpctypes.MetadataRequireLeaderKey, rpctypes.MetadataHasLeader)
1611-
ctx := metadata.NewContext(context.Background(), md)
1611+
ctx := metadata.NewOutgoingContext(context.Background(), md)
16121612
reqput := &pb.PutRequest{Key: []byte("foo"), Value: []byte("bar")}
16131613
if _, err := toGRPC(client).KV.Put(ctx, reqput); grpc.ErrorDesc(err) != rpctypes.ErrNoLeader.Error() {
16141614
t.Errorf("err = %v, want %v", err, rpctypes.ErrNoLeader)
@@ -1630,7 +1630,7 @@ func TestGRPCStreamRequireLeader(t *testing.T) {
16301630

16311631
wAPI := toGRPC(client).Watch
16321632
md := metadata.Pairs(rpctypes.MetadataRequireLeaderKey, rpctypes.MetadataHasLeader)
1633-
ctx := metadata.NewContext(context.Background(), md)
1633+
ctx := metadata.NewOutgoingContext(context.Background(), md)
16341634
wStream, err := wAPI.Watch(ctx)
16351635
if err != nil {
16361636
t.Fatalf("wAPI.Watch error: %v", err)

integration/v3_lease_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,7 @@ func TestV3LeaseFailover(t *testing.T) {
454454
lreq := &pb.LeaseKeepAliveRequest{ID: lresp.ID}
455455

456456
md := metadata.Pairs(rpctypes.MetadataRequireLeaderKey, rpctypes.MetadataHasLeader)
457-
mctx := metadata.NewContext(context.Background(), md)
457+
mctx := metadata.NewOutgoingContext(context.Background(), md)
458458
ctx, cancel := context.WithCancel(mctx)
459459
defer cancel()
460460
lac, err := lc.LeaseKeepAlive(ctx)
@@ -502,7 +502,7 @@ func TestV3LeaseRequireLeader(t *testing.T) {
502502
clus.Members[2].Stop(t)
503503

504504
md := metadata.Pairs(rpctypes.MetadataRequireLeaderKey, rpctypes.MetadataHasLeader)
505-
mctx := metadata.NewContext(context.Background(), md)
505+
mctx := metadata.NewOutgoingContext(context.Background(), md)
506506
ctx, cancel := context.WithCancel(mctx)
507507
defer cancel()
508508
lac, err := lc.LeaseKeepAlive(ctx)

proxy/grpcproxy/lease.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ func (lp *leaseProxy) LeaseKeepAlive(stream pb.Lease_LeaseKeepAliveServer) error
137137
errc := make(chan error, 2)
138138

139139
var lostLeaderC <-chan struct{}
140-
if md, ok := metadata.FromContext(stream.Context()); ok {
140+
if md, ok := metadata.FromOutgoingContext(stream.Context()); ok {
141141
v := md[rpctypes.MetadataRequireLeaderKey]
142142
if len(v) > 0 && v[0] == rpctypes.MetadataHasLeader {
143143
lostLeaderC = lp.leader.lostNotify()

proxy/grpcproxy/watch.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ func (wp *watchProxy) Watch(stream pb.Watch_WatchServer) (err error) {
9595
}
9696

9797
var lostLeaderC <-chan struct{}
98-
if md, ok := metadata.FromContext(stream.Context()); ok {
98+
if md, ok := metadata.FromOutgoingContext(stream.Context()); ok {
9999
v := md[rpctypes.MetadataRequireLeaderKey]
100100
if len(v) > 0 && v[0] == rpctypes.MetadataHasLeader {
101101
lostLeaderC = wp.leader.lostNotify()

0 commit comments

Comments
 (0)