Jelajahi Sumber

auth: use NewIncomingContext for "WithRoot"

"WithRoot" is only used within local node, and
"AuthInfoFromCtx" expects token from incoming context.
Embed token with "NewIncomingContext" so that token
can be found in "AuthInfoFromCtx".

Signed-off-by: Gyuho Lee <gyuhox@gmail.com>
Gyuho Lee 8 tahun lalu
induk
melakukan
1f191a0e34
2 mengubah file dengan 34 tambahan dan 1 penghapusan
  1. 3 1
      auth/store.go
  2. 31 0
      auth/store_test.go

+ 3 - 1
auth/store.go

@@ -1090,7 +1090,9 @@ func (as *authStore) WithRoot(ctx context.Context) context.Context {
 		"token": token,
 		"token": token,
 	}
 	}
 	tokenMD := metadata.New(mdMap)
 	tokenMD := metadata.New(mdMap)
-	return metadata.NewOutgoingContext(ctx, tokenMD)
+
+	// use "mdIncomingKey{}" since it's called from local etcdserver
+	return metadata.NewIncomingContext(ctx, tokenMD)
 }
 }
 
 
 func (as *authStore) HasRole(user, role string) bool {
 func (as *authStore) HasRole(user, role string) bool {

+ 31 - 0
auth/store_test.go

@@ -701,3 +701,34 @@ func TestRolesOrder(t *testing.T) {
 		}
 		}
 	}
 	}
 }
 }
+
+// TestAuthInfoFromCtxWithRoot ensures "WithRoot" properly embeds token in the context.
+func TestAuthInfoFromCtxWithRoot(t *testing.T) {
+	b, tPath := backend.NewDefaultTmpBackend()
+	defer os.Remove(tPath)
+
+	tp, err := NewTokenProvider("simple", dummyIndexWaiter)
+	if err != nil {
+		t.Fatal(err)
+	}
+	as := NewAuthStore(b, tp)
+	defer as.Close()
+
+	if err = enableAuthAndCreateRoot(as); err != nil {
+		t.Fatal(err)
+	}
+
+	ctx := context.Background()
+	ctx = as.WithRoot(ctx)
+
+	ai, aerr := as.AuthInfoFromCtx(ctx)
+	if aerr != nil {
+		t.Error(err)
+	}
+	if ai == nil {
+		t.Error("expected non-nil *AuthInfo")
+	}
+	if ai.Username != "root" {
+		t.Errorf("expected user name 'root', got %+v", ai)
+	}
+}