ipc: Get rid of vc.LocalPrincipal and vc.AnonymousPrincipal.
This involved:
(1) Getting principal from ctx in client.StartCall.
(2) This means all ipc tests need to use the fake profile.
(3) Manager Dial, InternalNewDialedVIf, and vf.Dial take a principal as well.
(4) VCMap in client.go must also be keys by the publicKey of the principal
since the principal can vary per call.
Change-Id: I7f8ed573499376343b675b616f05f02590dfb8f0
diff --git a/profiles/internal/ipc/cancel_test.go b/profiles/internal/ipc/cancel_test.go
index 6d95855..a8da7e7 100644
--- a/profiles/internal/ipc/cancel_test.go
+++ b/profiles/internal/ipc/cancel_test.go
@@ -6,8 +6,8 @@
"v.io/x/ref/profiles/internal/ipc/stream"
"v.io/x/ref/profiles/internal/ipc/stream/manager"
tnaming "v.io/x/ref/profiles/internal/testing/mocks/naming"
- tsecurity "v.io/x/ref/test/security"
+ "v.io/v23"
"v.io/v23/context"
"v.io/v23/ipc"
"v.io/v23/naming"
@@ -54,10 +54,9 @@
return nil
}
-func makeCanceld(ns ns.Namespace, name, child string) (*canceld, error) {
+func makeCanceld(ctx *context.T, ns ns.Namespace, name, child string) (*canceld, error) {
sm := manager.InternalNew(naming.FixedRoutingID(0x111111111))
- ctx := testContext()
- s, err := testInternalNewServer(ctx, sm, ns, tsecurity.NewPrincipal("test"))
+ s, err := testInternalNewServer(ctx, sm, ns, v23.GetPrincipal(ctx))
if err != nil {
return nil, err
}
@@ -85,6 +84,9 @@
// TestCancellationPropagation tests that cancellation propogates along an
// RPC call chain without user intervention.
func TestCancellationPropagation(t *testing.T) {
+ ctx, shutdown := initForTest()
+ defer shutdown()
+
sm := manager.InternalNew(naming.FixedRoutingID(0x555555555))
ns := tnaming.NewSimpleNamespace()
@@ -93,19 +95,19 @@
t.Error(err)
}
- c1, err := makeCanceld(ns, "c1", "c2")
+ c1, err := makeCanceld(ctx, ns, "c1", "c2")
if err != nil {
t.Fatal("Can't start server:", err)
}
defer c1.stop()
- c2, err := makeCanceld(ns, "c2", "")
+ c2, err := makeCanceld(ctx, ns, "c2", "")
if err != nil {
t.Fatal("Can't start server:", err)
}
defer c2.stop()
- ctx, cancel := context.WithCancel(testContext())
+ ctx, cancel := context.WithCancel(ctx)
_, err = client.StartCall(ctx, "c1", "Run", []interface{}{})
if err != nil {
t.Fatal("can't call: ", err)
diff --git a/profiles/internal/ipc/client.go b/profiles/internal/ipc/client.go
index 4138ba2..9f32184 100644
--- a/profiles/internal/ipc/client.go
+++ b/profiles/internal/ipc/client.go
@@ -11,6 +11,7 @@
"sync"
"time"
+ "v.io/v23"
"v.io/v23/context"
"v.io/v23/i18n"
"v.io/v23/ipc"
@@ -112,8 +113,8 @@
}
type vcMapKey struct {
- endpoint string
- encrypted bool
+ endpoint string
+ clientPublicKey string // clientPublicKey = "" means we are running unencrypted (i.e. VCSecurityNone)
}
func InternalNewClient(streamMgr stream.Manager, ns ns.Namespace, opts ...ipc.ClientOpt) (ipc.Client, error) {
@@ -143,7 +144,14 @@
if c.vcMap == nil {
return nil, verror.New(errClientCloseAlreadyCalled, ctx)
}
- vcKey := vcMapKey{ep.String(), vcEncrypted(vcOpts)}
+ vcKey := vcMapKey{endpoint: ep.String()}
+ var principal security.Principal
+ if vcEncrypted(vcOpts) {
+ principal = v23.GetPrincipal(ctx)
+ }
+ if principal != nil {
+ vcKey.clientPublicKey = principal.PublicKey().String()
+ }
if vcinfo := c.vcMap[vcKey]; vcinfo != nil {
if flow, err := vcinfo.vc.Connect(); err == nil {
return flow, nil
@@ -158,7 +166,8 @@
}
sm := c.streamMgr
c.vcMapMu.Unlock()
- vc, err := sm.Dial(ep, vcOpts...)
+
+ vc, err := sm.Dial(ep, principal, vcOpts...)
c.vcMapMu.Lock()
if err != nil {
if strings.Contains(err.Error(), "authentication failed") {
diff --git a/profiles/internal/ipc/debug_test.go b/profiles/internal/ipc/debug_test.go
index 9a41c67..ea0bea4 100644
--- a/profiles/internal/ipc/debug_test.go
+++ b/profiles/internal/ipc/debug_test.go
@@ -6,6 +6,7 @@
"sort"
"testing"
+ "v.io/v23"
"v.io/v23/ipc"
"v.io/v23/naming"
"v.io/v23/options"
@@ -13,13 +14,14 @@
"v.io/x/ref/lib/stats"
"v.io/x/ref/profiles/internal/ipc/stream/manager"
- "v.io/x/ref/profiles/internal/ipc/stream/vc"
tnaming "v.io/x/ref/profiles/internal/testing/mocks/naming"
"v.io/x/ref/services/mgmt/debug"
tsecurity "v.io/x/ref/test/security"
)
func TestDebugServer(t *testing.T) {
+ ctx, shutdown := initForTest()
+ defer shutdown()
// Setup the client and server principals, with the client willing to share its
// blessing with the server.
var (
@@ -35,7 +37,6 @@
sm := manager.InternalNew(naming.FixedRoutingID(0x555555555))
defer sm.Shutdown()
ns := tnaming.NewSimpleNamespace()
- ctx := testContext()
server, err := testInternalNewServer(ctx, sm, ns, pserver, ReservedNameDispatcher{debugDisp})
if err != nil {
t.Fatalf("InternalNewServer failed: %v", err)
@@ -48,7 +49,8 @@
if err := server.Serve("", &testObject{}, nil); err != nil {
t.Fatalf("server.Serve failed: %v", err)
}
- client, err := InternalNewClient(sm, ns, vc.LocalPrincipal{pclient})
+ ctx, _ = v23.SetPrincipal(ctx, pclient)
+ client, err := InternalNewClient(sm, ns)
if err != nil {
t.Fatalf("InternalNewClient failed: %v", err)
}
diff --git a/profiles/internal/ipc/default_authorizer_test.go b/profiles/internal/ipc/default_authorizer_test.go
index d722310..9c27210 100644
--- a/profiles/internal/ipc/default_authorizer_test.go
+++ b/profiles/internal/ipc/default_authorizer_test.go
@@ -132,7 +132,8 @@
authorized: true,
},
}
- ctx := testContextWithoutDeadline()
+ ctx, shutdown := initForTest()
+ defer shutdown()
for _, test := range tests {
test.call.p, test.call.l, test.call.r, test.call.c = pali, test.local, test.remote, ctx
ctx, cancel := context.RootContext()
diff --git a/profiles/internal/ipc/full_test.go b/profiles/internal/ipc/full_test.go
index f351b1d..c2a64cf 100644
--- a/profiles/internal/ipc/full_test.go
+++ b/profiles/internal/ipc/full_test.go
@@ -15,6 +15,7 @@
"testing"
"time"
+ "v.io/v23"
"v.io/v23/context"
"v.io/v23/ipc"
"v.io/v23/naming"
@@ -30,7 +31,6 @@
"v.io/x/ref/profiles/internal/ipc/stream"
"v.io/x/lib/netstate"
- "v.io/x/ref/lib/flags"
"v.io/x/ref/lib/stats"
_ "v.io/x/ref/profiles/internal/ipc/protocols/tcp"
_ "v.io/x/ref/profiles/internal/ipc/protocols/ws"
@@ -41,7 +41,6 @@
"v.io/x/ref/profiles/internal/lib/websocket"
inaming "v.io/x/ref/profiles/internal/naming"
tnaming "v.io/x/ref/profiles/internal/testing/mocks/naming"
- ivtrace "v.io/x/ref/profiles/internal/vtrace"
tsecurity "v.io/x/ref/test/security"
"v.io/x/ref/test/testutil"
)
@@ -74,16 +73,6 @@
c.Unlock()
}
-func testContextWithoutDeadline() *context.T {
- ctx, _ := context.RootContext()
- ctx, err := ivtrace.Init(ctx, flags.VtraceFlags{})
- if err != nil {
- panic(err)
- }
- ctx, _ = vtrace.SetNewTrace(ctx)
- return ctx
-}
-
func testInternalNewServer(ctx *context.T, streamMgr stream.Manager, ns ns.Namespace, principal security.Principal, opts ...ipc.ServerOpt) (ipc.Server, error) {
client, err := InternalNewClient(streamMgr, ns)
if err != nil {
@@ -229,8 +218,8 @@
return call.LocalPrincipal().MintDischarge(cav, expiry)
}
-func startServer(t *testing.T, principal security.Principal, sm stream.Manager, ns ns.Namespace, name string, disp ipc.Dispatcher, opts ...ipc.ServerOpt) (naming.Endpoint, ipc.Server) {
- return startServerWS(t, principal, sm, ns, name, disp, noWebsocket, opts...)
+func startServer(t *testing.T, ctx *context.T, principal security.Principal, sm stream.Manager, ns ns.Namespace, name string, disp ipc.Dispatcher, opts ...ipc.ServerOpt) (naming.Endpoint, ipc.Server) {
+ return startServerWS(t, ctx, principal, sm, ns, name, disp, noWebsocket, opts...)
}
func endpointsToStrings(eps []naming.Endpoint) []string {
@@ -242,9 +231,8 @@
return r
}
-func startServerWS(t *testing.T, principal security.Principal, sm stream.Manager, ns ns.Namespace, name string, disp ipc.Dispatcher, shouldUseWebsocket websocketMode, opts ...ipc.ServerOpt) (naming.Endpoint, ipc.Server) {
+func startServerWS(t *testing.T, ctx *context.T, principal security.Principal, sm stream.Manager, ns ns.Namespace, name string, disp ipc.Dispatcher, shouldUseWebsocket websocketMode, opts ...ipc.ServerOpt) (naming.Endpoint, ipc.Server) {
vlog.VI(1).Info("InternalNewServer")
- ctx := testContext()
server, err := testInternalNewServer(ctx, sm, ns, principal, opts...)
if err != nil {
t.Errorf("InternalNewServer failed: %v", err)
@@ -279,8 +267,8 @@
return fmt.Sprintf("%s:%d", filepath.Base(file), line)
}
-func verifyMount(t *testing.T, ns ns.Namespace, name string) []string {
- me, err := ns.Resolve(testContext(), name)
+func verifyMount(t *testing.T, ctx *context.T, ns ns.Namespace, name string) []string {
+ me, err := ns.Resolve(ctx, name)
if err != nil {
t.Errorf("%s: %s not found in mounttable", loc(1), name)
return nil
@@ -288,30 +276,30 @@
return me.Names()
}
-func verifyMountMissing(t *testing.T, ns ns.Namespace, name string) {
- if me, err := ns.Resolve(testContext(), name); err == nil {
+func verifyMountMissing(t *testing.T, ctx *context.T, ns ns.Namespace, name string) {
+ if me, err := ns.Resolve(ctx, name); err == nil {
names := me.Names()
t.Errorf("%s: %s not supposed to be found in mounttable; got %d servers instead: %v (%+v)", loc(1), name, len(names), names, me)
}
}
-func stopServer(t *testing.T, server ipc.Server, ns ns.Namespace, name string) {
+func stopServer(t *testing.T, ctx *context.T, server ipc.Server, ns ns.Namespace, name string) {
vlog.VI(1).Info("server.Stop")
new_name := "should_appear_in_mt/server"
- verifyMount(t, ns, name)
+ verifyMount(t, ctx, ns, name)
// publish a second name
if err := server.AddName(new_name); err != nil {
t.Errorf("server.Serve failed: %v", err)
}
- verifyMount(t, ns, new_name)
+ verifyMount(t, ctx, ns, new_name)
if err := server.Stop(); err != nil {
t.Errorf("server.Stop failed: %v", err)
}
- verifyMountMissing(t, ns, name)
- verifyMountMissing(t, ns, new_name)
+ verifyMountMissing(t, ctx, ns, name)
+ verifyMountMissing(t, ctx, ns, new_name)
// Check that we can no longer serve after Stop.
err := server.AddName("name doesn't matter")
@@ -325,9 +313,9 @@
// the use of websockets. It does so by resolving the original name
// and choosing the 'ws' endpoint from the set of endpoints returned.
// It must return a name since it'll be passed to StartCall.
-func fakeWSName(ns ns.Namespace, name string) (string, error) {
+func fakeWSName(ctx *context.T, ns ns.Namespace, name string) (string, error) {
// Find the ws endpoint and use that.
- me, err := ns.Resolve(testContext(), name)
+ me, err := ns.Resolve(ctx, name)
if err != nil {
return "", err
}
@@ -349,31 +337,29 @@
name string
}
-func (b bundle) cleanup(t *testing.T) {
+func (b bundle) cleanup(t *testing.T, ctx *context.T) {
if b.server != nil {
- stopServer(t, b.server, b.ns, b.name)
+ stopServer(t, ctx, b.server, b.ns, b.name)
}
if b.client != nil {
b.client.Close()
}
}
-func createBundle(t *testing.T, client, server security.Principal, ts interface{}) (b bundle) {
- return createBundleWS(t, client, server, ts, noWebsocket)
+func createBundle(t *testing.T, ctx *context.T, server security.Principal, ts interface{}) (b bundle) {
+ return createBundleWS(t, ctx, server, ts, noWebsocket)
}
-func createBundleWS(t *testing.T, client, server security.Principal, ts interface{}, shouldUseWebsocket websocketMode) (b bundle) {
+func createBundleWS(t *testing.T, ctx *context.T, server security.Principal, ts interface{}, shouldUseWebsocket websocketMode) (b bundle) {
b.sm = imanager.InternalNew(naming.FixedRoutingID(0x555555555))
b.ns = tnaming.NewSimpleNamespace()
b.name = "mountpoint/server"
if server != nil {
- b.ep, b.server = startServerWS(t, server, b.sm, b.ns, b.name, testServerDisp{ts}, shouldUseWebsocket)
+ b.ep, b.server = startServerWS(t, ctx, server, b.sm, b.ns, b.name, testServerDisp{ts}, shouldUseWebsocket)
}
- if client != nil {
- var err error
- if b.client, err = InternalNewClient(b.sm, b.ns, vc.LocalPrincipal{client}); err != nil {
- t.Fatalf("InternalNewClient failed: %v", err)
- }
+ var err error
+ if b.client, err = InternalNewClient(b.sm, b.ns); err != nil {
+ t.Fatalf("InternalNewClient failed: %v", err)
}
return
}
@@ -388,13 +374,13 @@
return verror.Is(err, id.ID)
}
-func runServer(t *testing.T, ns ns.Namespace, principal security.Principal, name string, obj interface{}, opts ...ipc.ServerOpt) stream.Manager {
+func runServer(t *testing.T, ctx *context.T, ns ns.Namespace, principal security.Principal, name string, obj interface{}, opts ...ipc.ServerOpt) stream.Manager {
rid, err := naming.NewRoutingID()
if err != nil {
t.Fatal(err)
}
sm := imanager.InternalNew(rid)
- server, err := testInternalNewServer(testContext(), sm, ns, principal, opts...)
+ server, err := testInternalNewServer(ctx, sm, ns, principal, opts...)
if err != nil {
t.Fatal(err)
}
@@ -410,7 +396,8 @@
func TestMultipleCallsToServeAndName(t *testing.T) {
sm := imanager.InternalNew(naming.FixedRoutingID(0x555555555))
ns := tnaming.NewSimpleNamespace()
- ctx := testContext()
+ ctx, shutdown := initForTest()
+ defer shutdown()
server, err := testInternalNewServer(ctx, sm, ns, tsecurity.NewPrincipal("server"))
if err != nil {
t.Errorf("InternalNewServer failed: %v", err)
@@ -430,7 +417,7 @@
n3 := "should_appear_in_mt/server"
n4 := "should_not_appear_in_mt/server"
- verifyMount(t, ns, n1)
+ verifyMount(t, ctx, ns, n1)
if server.ServeDispatcher(n2, disp) == nil {
t.Errorf("server.ServeDispatcher should have failed")
@@ -447,26 +434,26 @@
if err := server.AddName(n3); err != nil {
t.Errorf("server.AddName failed: %v", err)
}
- verifyMount(t, ns, n2)
- verifyMount(t, ns, n3)
+ verifyMount(t, ctx, ns, n2)
+ verifyMount(t, ctx, ns, n3)
server.RemoveName(n1)
- verifyMountMissing(t, ns, n1)
+ verifyMountMissing(t, ctx, ns, n1)
server.RemoveName("some randome name")
if err := server.ServeDispatcher(n4, &testServerDisp{&testServer{}}); err == nil {
t.Errorf("server.ServeDispatcher should have failed")
}
- verifyMountMissing(t, ns, n4)
+ verifyMountMissing(t, ctx, ns, n4)
if err := server.Stop(); err != nil {
t.Errorf("server.Stop failed: %v", err)
}
- verifyMountMissing(t, ns, n1)
- verifyMountMissing(t, ns, n2)
- verifyMountMissing(t, ns, n3)
+ verifyMountMissing(t, ctx, ns, n1)
+ verifyMountMissing(t, ctx, ns, n2)
+ verifyMountMissing(t, ctx, ns, n3)
}
func TestRPCServerAuthorization(t *testing.T) {
@@ -544,12 +531,15 @@
}
)
- _, server := startServer(t, pserver, mgr, ns, "mountpoint/server", testServerDisp{&testServer{}})
- defer stopServer(t, server, ns, "mountpoint/server")
+ ctx, shutdown := initForTest()
+ defer shutdown()
+
+ _, server := startServer(t, ctx, pserver, mgr, ns, "mountpoint/server", testServerDisp{&testServer{}})
+ defer stopServer(t, ctx, server, ns, "mountpoint/server")
// Start the discharge server.
- _, dischargeServer := startServer(t, pdischarger, mgr, ns, "mountpoint/dischargeserver", testutil.LeafDispatcher(&dischargeServer{}, &acceptAllAuthorizer{}))
- defer stopServer(t, dischargeServer, ns, "mountpoint/dischargeserver")
+ _, dischargeServer := startServer(t, ctx, pdischarger, mgr, ns, "mountpoint/dischargeserver", testutil.LeafDispatcher(&dischargeServer{}, &acceptAllAuthorizer{}))
+ defer stopServer(t, ctx, dischargeServer, ns, "mountpoint/dischargeserver")
// Make the client and server principals trust root certificates from
// pprovider
@@ -568,12 +558,13 @@
t.Fatalf("Set failed on server's BlessingStore: %v", err)
}
// Recreate client in each test (so as to not re-use VCs to the server).
- client, err := InternalNewClient(mgr, ns, vc.LocalPrincipal{pclient})
+ client, err := InternalNewClient(mgr, ns)
if err != nil {
t.Errorf("%s: failed to create client: %v", name, err)
continue
}
- ctx, cancel := context.WithTimeout(testContextWithoutDeadline(), 10*time.Second)
+ ctx, _ = v23.SetPrincipal(ctx, pclient)
+ ctx, cancel := context.WithCancel(ctx)
call, err := client.StartCall(ctx, test.name, "Method", nil, test.opt)
if !matchesErrorPattern(err, test.errID, test.err) {
t.Errorf(`%s: client.StartCall: got error "%v", want to match "%v"`, name, err, test.err)
@@ -598,10 +589,12 @@
func TestServerManInTheMiddleAttack(t *testing.T) {
// Test scenario: A server mounts itself, but then some other service
// somehow "takes over" the endpoint, thus trying to steal traffic.
+ ctx, shutdown := initForTest()
+ defer shutdown()
// Start up the attacker's server.
attacker, err := testInternalNewServer(
- testContext(),
+ ctx,
imanager.InternalNew(naming.FixedRoutingID(0xaaaaaaaaaaaaaaaa)),
// (To prevent the attacker for legitimately mounting on the
// namespace that the client will use, provide it with a
@@ -627,7 +620,7 @@
// The legitimate server would have mounted the same endpoint on the
// namespace.
ns := tnaming.NewSimpleNamespace()
- if err := ns.Mount(testContext(), "mountpoint/server", ep.Name(), time.Hour, naming.MountedServerBlessingsOpt{"server"}); err != nil {
+ if err := ns.Mount(ctx, "mountpoint/server", ep.Name(), time.Hour, naming.MountedServerBlessingsOpt{"server"}); err != nil {
t.Fatal(err)
}
@@ -637,17 +630,18 @@
client, err := InternalNewClient(
imanager.InternalNew(naming.FixedRoutingID(0xcccccccccccccccc)),
ns,
- vc.LocalPrincipal{tsecurity.NewPrincipal("client")})
+ )
if err != nil {
t.Fatal(err)
}
defer client.Close()
- if _, err := client.StartCall(testContext(), "mountpoint/server", "Closure", nil); !verror.Is(err, verror.ErrNotTrusted.ID) {
+ ctx, _ = v23.SetPrincipal(ctx, tsecurity.NewPrincipal("client"))
+ if _, err := client.StartCall(ctx, "mountpoint/server", "Closure", nil); !verror.Is(err, verror.ErrNotTrusted.ID) {
t.Errorf("Got error %v (errorid=%v), want errorid=%v", err, verror.ErrorID(err), verror.ErrNotTrusted.ID)
}
// But the RPC should succeed if the client explicitly
// decided to skip server authorization.
- if _, err := client.StartCall(testContext(), "mountpoint/server", "Closure", nil, options.SkipResolveAuthorization{}); err != nil {
+ if _, err := client.StartCall(ctx, "mountpoint/server", "Closure", nil, options.SkipResolveAuthorization{}); err != nil {
t.Errorf("Unexpected error(%v) when skipping server authorization", err)
}
}
@@ -715,9 +709,13 @@
pserver = tsecurity.NewPrincipal("server")
pclient = tsecurity.NewPrincipal("client")
- b = createBundleWS(t, pclient, pserver, &testServer{}, shouldUseWebsocket)
+ ctx, shutdown = initForTest()
+
+ b = createBundleWS(t, ctx, pserver, &testServer{}, shouldUseWebsocket)
)
- defer b.cleanup(t)
+ defer shutdown()
+ defer b.cleanup(t, ctx)
+ ctx, _ = v23.SetPrincipal(ctx, pclient)
// The server needs to recognize the client's root certificate.
pserver.AddToRoots(pclient.BlessingStore().Default())
for _, test := range tests {
@@ -725,13 +723,13 @@
vname := test.name
if shouldUseWebsocket {
var err error
- vname, err = fakeWSName(b.ns, vname)
+ vname, err = fakeWSName(ctx, b.ns, vname)
if err != nil && err != test.startErr {
t.Errorf(`%s ns.Resolve got error "%v", want "%v"`, name(test), err, test.startErr)
continue
}
}
- call, err := b.client.StartCall(testContext(), vname, test.method, test.args)
+ call, err := b.client.StartCall(ctx, vname, test.method, test.args)
if err != test.startErr {
t.Errorf(`%s client.StartCall got error "%v", want "%v"`, name(test), err, test.startErr)
continue
@@ -778,10 +776,13 @@
}
func TestMultipleFinish(t *testing.T) {
+ ctx, shutdown := initForTest()
+ defer shutdown()
type v []interface{}
- b := createBundle(t, tsecurity.NewPrincipal("client"), tsecurity.NewPrincipal("server"), &testServer{})
- defer b.cleanup(t)
- call, err := b.client.StartCall(testContext(), "mountpoint/server/suffix", "Echo", v{"foo"})
+ b := createBundle(t, ctx, tsecurity.NewPrincipal("server"), &testServer{})
+ defer b.cleanup(t, ctx)
+ ctx, _ = v23.SetPrincipal(ctx, tsecurity.NewPrincipal("client"))
+ call, err := b.client.StartCall(ctx, "mountpoint/server/suffix", "Echo", v{"foo"})
if err != nil {
t.Fatalf(`client.StartCall got error "%v"`, err)
}
@@ -807,11 +808,15 @@
func TestGranter(t *testing.T) {
var (
- pclient = tsecurity.NewPrincipal("client")
- pserver = tsecurity.NewPrincipal("server")
- b = createBundle(t, pclient, pserver, &testServer{})
+ pclient = tsecurity.NewPrincipal("client")
+ pserver = tsecurity.NewPrincipal("server")
+ ctx, shutdown = initForTest()
+ b = createBundle(t, ctx, pserver, &testServer{})
)
- defer b.cleanup(t)
+ defer shutdown()
+ defer b.cleanup(t, ctx)
+
+ ctx, _ = v23.SetPrincipal(ctx, pclient)
tests := []struct {
granter ipc.Granter
@@ -824,7 +829,7 @@
{granter: granter{b: pclient.BlessingStore().Default()}, finishErrID: verror.ErrNoAccess, finisherr: "blessing granted not bound to this server"},
}
for i, test := range tests {
- call, err := b.client.StartCall(testContext(), "mountpoint/server/suffix", "EchoGrantedBlessings", []interface{}{"argument"}, test.granter)
+ call, err := b.client.StartCall(ctx, "mountpoint/server/suffix", "EchoGrantedBlessings", []interface{}{"argument"}, test.granter)
if !matchesErrorPattern(err, test.startErrID, test.starterr) {
t.Errorf("%d: %+v: StartCall returned error %v", i, test, err)
}
@@ -872,7 +877,7 @@
sm = imanager.InternalNew(naming.FixedRoutingID(0x555555555))
ns = tnaming.NewSimpleNamespace()
- mkClient = func(req security.ThirdPartyRequirements) vc.LocalPrincipal {
+ mkClient = func(req security.ThirdPartyRequirements) security.Principal {
// Setup the client so that it shares a blessing with a third-party caveat with the server.
cav, err := security.NewPublicKeyCaveat(pdischarger.PublicKey(), "mountpoint/discharger", req, security.UnconstrainedUse())
if err != nil {
@@ -883,9 +888,11 @@
t.Fatalf("BlessSelf failed: %v", err)
}
pclient.BlessingStore().Set(b, "server")
- return vc.LocalPrincipal{pclient}
+ return pclient
}
)
+ ctx, shutdown := initForTest()
+ defer shutdown()
// Initialize the client principal.
// It trusts both the application server and the discharger.
pclient.AddToRoots(pserver.BlessingStore().Default())
@@ -902,7 +909,6 @@
// Setup the discharge server.
var tester dischargeTestServer
- ctx := testContext()
dischargeServer, err := testInternalNewServer(ctx, sm, ns, pdischarger)
if err != nil {
t.Fatal(err)
@@ -964,12 +970,12 @@
for _, test := range tests {
pclient := mkClient(test.Requirements)
- client, err := InternalNewClient(sm, ns, pclient)
+ ctx, _ = v23.SetPrincipal(ctx, pclient)
+ client, err := InternalNewClient(sm, ns)
if err != nil {
t.Fatalf("InternalNewClient(%+v) failed: %v", test.Requirements, err)
}
defer client.Close()
- ctx := testContext()
tid := vtrace.GetSpan(ctx).Trace()
// StartCall should fetch the discharge, do not worry about finishing the RPC - do not care about that for this test.
if _, err := client.StartCall(ctx, object, "Method", []interface{}{"argument"}); err != nil {
@@ -1093,13 +1099,16 @@
{bServerClientTPValid, "mountpoint/server/suffix", "Unauthorized", nil, v{""}, false},
}
)
+
+ ctx, shutdown := initForTest()
+ defer shutdown()
// Start the main server.
- _, server := startServer(t, pserver, mgr, ns, serverName, testServerDisp{&testServer{}})
- defer stopServer(t, server, ns, serverName)
+ _, server := startServer(t, ctx, pserver, mgr, ns, serverName, testServerDisp{&testServer{}})
+ defer stopServer(t, ctx, server, ns, serverName)
// Start the discharge server.
- _, dischargeServer := startServer(t, pdischarger, mgr, ns, dischargeServerName, testutil.LeafDispatcher(&dischargeServer{}, &acceptAllAuthorizer{}))
- defer stopServer(t, dischargeServer, ns, dischargeServerName)
+ _, dischargeServer := startServer(t, ctx, pdischarger, mgr, ns, dischargeServerName, testutil.LeafDispatcher(&dischargeServer{}, &acceptAllAuthorizer{}))
+ defer stopServer(t, ctx, dischargeServer, ns, dischargeServerName)
// The server should recognize the client principal as an authority on "client" and "random" blessings.
pserver.AddToRoots(bClient)
@@ -1115,14 +1124,15 @@
for i, test := range tests {
name := fmt.Sprintf("#%d: %q.%s(%v) by %v", i, test.name, test.method, test.args, test.blessings)
- client, err := InternalNewClient(mgr, ns, vc.LocalPrincipal{pclient})
+ client, err := InternalNewClient(mgr, ns)
if err != nil {
t.Fatalf("InternalNewClient failed: %v", err)
}
defer client.Close()
pclient.BlessingStore().Set(test.blessings, "server")
- call, err := client.StartCall(testContext(), test.name, test.method, test.args)
+ ctx, _ := v23.SetPrincipal(ctx, pclient)
+ call, err := client.StartCall(ctx, test.name, test.method, test.args)
if err != nil {
t.Errorf(`%s client.StartCall got unexpected error: "%v"`, name, err)
continue
@@ -1192,9 +1202,13 @@
bclient = bless(pprovider, pclient, "client")
bvictim = bless(pprovider, tsecurity.NewPrincipal("victim"), "victim")
- b = createBundle(t, pclient, pserver, &testServer{})
+ ctx, shutdown = initForTest()
+ b = createBundle(t, ctx, pserver, &testServer{})
)
- defer b.cleanup(t)
+ defer shutdown()
+ defer b.cleanup(t, ctx)
+
+ ctx, _ = v23.SetPrincipal(ctx, pclient)
// Make the client and server trust blessings from pprovider.
pclient.AddToRoots(pprovider.BlessingStore().Default())
@@ -1219,7 +1233,7 @@
pclient.BlessingStore().Set(test.blessings, "root")
- call, err := b.client.StartCall(testContext(), "mountpoint/server/suffix", "Closure", nil)
+ call, err := b.client.StartCall(ctx, "mountpoint/server/suffix", "Closure", nil)
if err != nil {
t.Errorf("%v: StartCall failed: %v", name, err)
continue
@@ -1244,6 +1258,10 @@
bserver = bless(pprovider, pserver, "server", tpCav)
bclient = bless(pprovider, pclient, "client")
)
+
+ ctx, shutdown := initForTest()
+ defer shutdown()
+
// Make the client and server principals trust root certificates from
// pprovider.
pclient.AddToRoots(pprovider.BlessingStore().Default())
@@ -1253,23 +1271,24 @@
pserver.BlessingStore().SetDefault(bserver)
// Start the server and the discharger.
- _, server := startServer(t, pserver, mgr, ns, "mountpoint/server", testServerDisp{&testServer{}})
- defer stopServer(t, server, ns, "mountpoint/server")
+ _, server := startServer(t, ctx, pserver, mgr, ns, "mountpoint/server", testServerDisp{&testServer{}})
+ defer stopServer(t, ctx, server, ns, "mountpoint/server")
- _, dischargeServer := startServer(t, pdischarger, mgr, ns, "mountpoint/dischargeserver", testutil.LeafDispatcher(&dischargeServer{}, &acceptAllAuthorizer{}))
- defer stopServer(t, dischargeServer, ns, "mountpoint/dischargeserver")
+ _, dischargeServer := startServer(t, ctx, pdischarger, mgr, ns, "mountpoint/dischargeserver", testutil.LeafDispatcher(&dischargeServer{}, &acceptAllAuthorizer{}))
+ defer stopServer(t, ctx, dischargeServer, ns, "mountpoint/dischargeserver")
// Make the client present bclient to all servers that are blessed
// by pprovider.
pclient.BlessingStore().Set(bclient, "root")
- client, err := InternalNewClient(mgr, ns, vc.LocalPrincipal{pclient})
+ client, err := InternalNewClient(mgr, ns)
if err != nil {
t.Fatalf("InternalNewClient failed: %v", err)
}
defer client.Close()
- call, err := client.StartCall(testContext(), "mountpoint/server/suffix", "EchoBlessings", nil)
+ ctx, _ = v23.SetPrincipal(ctx, pclient)
+ call, err := client.StartCall(ctx, "mountpoint/server/suffix", "EchoBlessings", nil)
if err != nil {
t.Fatalf("StartCall failed: %v", err)
}
@@ -1297,15 +1316,19 @@
pclient.AddToRoots(pserver.BlessingStore().Default())
pclient.BlessingStore().Set(bclient, "server")
- b := createBundle(t, nil, pserver, &testServer{})
- defer b.cleanup(t)
+ ctx, shutdown := initForTest()
+ defer shutdown()
+
+ b := createBundle(t, ctx, pserver, &testServer{})
+ defer b.cleanup(t, ctx)
var err error
- if b.client, err = InternalNewClient(b.sm, b.ns, vc.LocalPrincipal{pclient}); err != nil {
+ if b.client, err = InternalNewClient(b.sm, b.ns); err != nil {
t.Fatalf("InternalNewClient failed: %v", err)
}
+ ctx, _ = v23.SetPrincipal(ctx, pclient)
call := func() error {
- call, err := b.client.StartCall(testContext(), "mountpoint/server/aclAuth", "Echo", []interface{}{"batman"})
+ call, err := b.client.StartCall(ctx, "mountpoint/server/aclAuth", "Echo", []interface{}{"batman"})
if err != nil {
return err //fmt.Errorf("client.StartCall failed: %v", err)
}
@@ -1377,11 +1400,14 @@
// TestCancel tests cancellation while the server is reading from a stream.
func TestCancel(t *testing.T) {
+ ctx, shutdown := initForTest()
+ defer shutdown()
ts := newCancelTestServer(t)
- b := createBundle(t, tsecurity.NewPrincipal("client"), tsecurity.NewPrincipal("server"), ts)
- defer b.cleanup(t)
+ b := createBundle(t, ctx, tsecurity.NewPrincipal("server"), ts)
+ defer b.cleanup(t, ctx)
- ctx, cancel := context.WithCancel(testContext())
+ ctx, _ = v23.SetPrincipal(ctx, tsecurity.NewPrincipal("client"))
+ ctx, cancel := context.WithCancel(ctx)
_, err := b.client.StartCall(ctx, "mountpoint/server/suffix", "CancelStreamReader", []interface{}{})
if err != nil {
t.Fatalf("Start call failed: %v", err)
@@ -1392,11 +1418,14 @@
// TestCancelWithFullBuffers tests that even if the writer has filled the buffers and
// the server is not reading that the cancel message gets through.
func TestCancelWithFullBuffers(t *testing.T) {
+ ctx, shutdown := initForTest()
+ defer shutdown()
ts := newCancelTestServer(t)
- b := createBundle(t, tsecurity.NewPrincipal("client"), tsecurity.NewPrincipal("server"), ts)
- defer b.cleanup(t)
+ b := createBundle(t, ctx, tsecurity.NewPrincipal("server"), ts)
+ defer b.cleanup(t, ctx)
- ctx, cancel := context.WithCancel(testContext())
+ ctx, _ = v23.SetPrincipal(ctx, tsecurity.NewPrincipal("client"))
+ ctx, cancel := context.WithCancel(ctx)
call, err := b.client.StartCall(ctx, "mountpoint/server/suffix", "CancelStreamIgnorer", []interface{}{})
if err != nil {
t.Fatalf("Start call failed: %v", err)
@@ -1429,11 +1458,14 @@
}
func TestStreamReadTerminatedByServer(t *testing.T) {
+ ctx, shutdown := initForTest()
+ defer shutdown()
s := &streamRecvInGoroutineServer{c: make(chan error, 1)}
- b := createBundle(t, tsecurity.NewPrincipal("client"), tsecurity.NewPrincipal("server"), s)
- defer b.cleanup(t)
+ b := createBundle(t, ctx, tsecurity.NewPrincipal("server"), s)
+ defer b.cleanup(t, ctx)
- call, err := b.client.StartCall(testContext(), "mountpoint/server/suffix", "RecvInGoroutine", []interface{}{})
+ ctx, _ = v23.SetPrincipal(ctx, tsecurity.NewPrincipal("client"))
+ call, err := b.client.StartCall(ctx, "mountpoint/server/suffix", "RecvInGoroutine", []interface{}{})
if err != nil {
t.Fatalf("StartCall failed: %v", err)
}
@@ -1462,20 +1494,21 @@
// TestConnectWithIncompatibleServers tests that clients ignore incompatible endpoints.
func TestConnectWithIncompatibleServers(t *testing.T) {
- b := createBundle(t, tsecurity.NewPrincipal("client"), tsecurity.NewPrincipal("server"), &testServer{})
- defer b.cleanup(t)
+ ctx, shutdown := initForTest()
+ defer shutdown()
+ b := createBundle(t, ctx, tsecurity.NewPrincipal("server"), &testServer{})
+ defer b.cleanup(t, ctx)
// Publish some incompatible endpoints.
- publisher := publisher.New(testContext(), b.ns, publishPeriod)
+ publisher := publisher.New(ctx, b.ns, publishPeriod)
defer publisher.WaitForStop()
defer publisher.Stop()
publisher.AddName("incompatible")
publisher.AddServer("/@2@tcp@localhost:10000@@1000000@2000000@@", false)
publisher.AddServer("/@2@tcp@localhost:10001@@2000000@3000000@@", false)
- ctx, _ := context.WithTimeout(testContext(), 100*time.Millisecond)
-
- _, err := b.client.StartCall(ctx, "incompatible/suffix", "Echo", []interface{}{"foo"})
+ ctx, _ = v23.SetPrincipal(ctx, tsecurity.NewPrincipal("client"))
+ _, err := b.client.StartCall(ctx, "incompatible/suffix", "Echo", []interface{}{"foo"}, options.NoRetry{})
if !verror.Is(err, verror.ErrNoServers.ID) {
t.Errorf("Expected error %s, found: %v", verror.ErrNoServers, err)
}
@@ -1484,7 +1517,7 @@
publisher.AddServer("/"+b.ep.String(), false)
publisher.AddName("incompatible")
- call, err := b.client.StartCall(testContext(), "incompatible/suffix", "Echo", []interface{}{"foo"})
+ call, err := b.client.StartCall(ctx, "incompatible/suffix", "Echo", []interface{}{"foo"})
if err != nil {
t.Fatal(err)
}
@@ -1499,6 +1532,8 @@
}
func TestPreferredAddress(t *testing.T) {
+ ctx, shutdown := initForTest()
+ defer shutdown()
sm := imanager.InternalNew(naming.FixedRoutingID(0x555555555))
defer sm.Shutdown()
ns := tnaming.NewSimpleNamespace()
@@ -1507,7 +1542,6 @@
a.IP = net.ParseIP("1.1.1.1")
return []ipc.Address{&netstate.AddrIfc{Addr: a}}, nil
}
- ctx := testContext()
server, err := testInternalNewServer(ctx, sm, ns, tsecurity.NewPrincipal("server"))
if err != nil {
t.Errorf("InternalNewServer failed: %v", err)
@@ -1543,13 +1577,14 @@
}
func TestPreferredAddressErrors(t *testing.T) {
+ ctx, shutdown := initForTest()
+ defer shutdown()
sm := imanager.InternalNew(naming.FixedRoutingID(0x555555555))
defer sm.Shutdown()
ns := tnaming.NewSimpleNamespace()
paerr := func(_ string, a []ipc.Address) ([]ipc.Address, error) {
return nil, fmt.Errorf("oops")
}
- ctx := testContext()
server, err := testInternalNewServer(ctx, sm, ns, tsecurity.NewPrincipal("server"))
if err != nil {
t.Errorf("InternalNewServer failed: %v", err)
@@ -1575,10 +1610,11 @@
}
func TestSecurityNone(t *testing.T) {
+ ctx, shutdown := initForTest()
+ defer shutdown()
sm := imanager.InternalNew(naming.FixedRoutingID(0x66666666))
defer sm.Shutdown()
ns := tnaming.NewSimpleNamespace()
- ctx := testContext()
server, err := testInternalNewServer(ctx, sm, ns, nil, options.VCSecurityNone)
if err != nil {
t.Fatalf("InternalNewServer failed: %v", err)
@@ -1632,6 +1668,8 @@
pclient = tsecurity.NewPrincipal("client")
batman, _ = pserver.BlessSelf("batman")
)
+ ctx, shutdown := initForTest()
+ defer shutdown()
// Client and server recognize the servers blessings
for _, p := range []security.Principal{pserver, pclient} {
if err := p.AddToRoots(pserver.BlessingStore().Default()); err != nil {
@@ -1645,8 +1683,8 @@
// to act as batman (as opposed to using the default blessing).
ns := tnaming.NewSimpleNamespace()
- defer runServer(t, ns, pserver, "mountpoint/batman", &testServer{}, options.ServerBlessings{batman}).Shutdown()
- defer runServer(t, ns, pserver, "mountpoint/default", &testServer{}).Shutdown()
+ defer runServer(t, ctx, ns, pserver, "mountpoint/batman", &testServer{}, options.ServerBlessings{batman}).Shutdown()
+ defer runServer(t, ctx, ns, pserver, "mountpoint/default", &testServer{}).Shutdown()
// And finally, make an RPC and see that the client sees "batman"
runClient := func(server string) ([]string, error) {
@@ -1654,13 +1692,13 @@
defer smc.Shutdown()
client, err := InternalNewClient(
smc,
- ns,
- vc.LocalPrincipal{pclient})
+ ns)
if err != nil {
return nil, err
}
defer client.Close()
- call, err := client.StartCall(testContext(), server, "Closure", nil)
+ ctx, _ = v23.SetPrincipal(ctx, pclient)
+ call, err := client.StartCall(ctx, server, "Closure", nil)
if err != nil {
return nil, err
}
@@ -1684,6 +1722,8 @@
pserver = tsecurity.NewPrincipal("server")
pclient = tsecurity.NewPrincipal("client")
)
+ ctx, shutdown := initForTest()
+ defer shutdown()
// Make the client recognize all server blessings
if err := pclient.AddToRoots(pserver.BlessingStore().Default()); err != nil {
t.Fatal(err)
@@ -1706,8 +1746,8 @@
// Setup the disharger and test server.
discharger := &dischargeServer{}
- defer runServer(t, ns, pdischarger, "mountpoint/discharger", discharger).Shutdown()
- defer runServer(t, ns, pserver, "mountpoint/testServer", &testServer{}).Shutdown()
+ defer runServer(t, ctx, ns, pdischarger, "mountpoint/discharger", discharger).Shutdown()
+ defer runServer(t, ctx, ns, pserver, "mountpoint/testServer", &testServer{}).Shutdown()
runClient := func(noDischarges bool) {
rid, err := naming.NewRoutingID()
@@ -1716,7 +1756,7 @@
}
smc := imanager.InternalNew(rid)
defer smc.Shutdown()
- client, err := InternalNewClient(smc, ns, vc.LocalPrincipal{pclient})
+ client, err := InternalNewClient(smc, ns)
if err != nil {
t.Fatalf("failed to create client: %v", err)
}
@@ -1725,7 +1765,8 @@
if noDischarges {
opts = append(opts, NoDischarges{})
}
- if _, err = client.StartCall(testContext(), "mountpoint/testServer", "Closure", nil, opts...); err != nil {
+ ctx, _ = v23.SetPrincipal(ctx, pclient)
+ if _, err = client.StartCall(ctx, "mountpoint/testServer", "Closure", nil, opts...); err != nil {
t.Fatalf("failed to StartCall: %v", err)
}
}
@@ -1748,7 +1789,8 @@
pdischarger2 = tsecurity.NewPrincipal("discharger2")
pdischargeClient = tsecurity.NewPrincipal("dischargeClient")
)
-
+ ctx, shutdown := initForTest()
+ defer shutdown()
// Bless the client with a ThirdPartyCaveat from discharger1.
tpcav1 := mkThirdPartyCaveat(pdischarger1.PublicKey(), "mountpoint/discharger1", mkCaveat(security.ExpiryCaveat(time.Now().Add(time.Hour))))
blessings, err := pdischarger1.Bless(pdischargeClient.PublicKey(), pdischarger1.BlessingStore().Default(), "tpcav1", tpcav1)
@@ -1764,8 +1806,8 @@
// Setup the disharger and test server.
discharger1 := &dischargeServer{}
discharger2 := &dischargeServer{}
- defer runServer(t, ns, pdischarger1, "mountpoint/discharger1", discharger1).Shutdown()
- defer runServer(t, ns, pdischarger2, "mountpoint/discharger2", discharger2).Shutdown()
+ defer runServer(t, ctx, ns, pdischarger1, "mountpoint/discharger1", discharger1).Shutdown()
+ defer runServer(t, ctx, ns, pdischarger2, "mountpoint/discharger2", discharger2).Shutdown()
rid, err := naming.NewRoutingID()
if err != nil {
@@ -1773,7 +1815,7 @@
}
sm := imanager.InternalNew(rid)
- c, err := InternalNewClient(sm, ns, vc.LocalPrincipal{pdischargeClient})
+ c, err := InternalNewClient(sm, ns)
if err != nil {
t.Fatalf("failed to create client: %v", err)
}
@@ -1782,7 +1824,8 @@
if err != nil {
t.Error(err)
}
- dc.PrepareDischarges(testContext(), []security.Caveat{tpcav2}, security.DischargeImpetus{})
+ ctx, _ = v23.SetPrincipal(ctx, pdischargeClient)
+ dc.PrepareDischarges(ctx, []security.Caveat{tpcav2}, security.DischargeImpetus{})
// Ensure that discharger1 was not called and discharger2 was called.
if discharger1.called {
@@ -1800,6 +1843,8 @@
pserver = tsecurity.NewPrincipal("server")
pclient = tsecurity.NewPrincipal("client")
)
+ ctx, shutdown := initForTest()
+ defer shutdown()
// Make the client recognize all server blessings
if err := pclient.AddToRoots(pserver.BlessingStore().Default()); err != nil {
t.Fatal(err)
@@ -1807,10 +1852,12 @@
ns := tnaming.NewSimpleNamespace()
- serverSM := runServer(t, ns, pserver, "mountpoint/testServer", &testServer{})
+ serverSM := runServer(t, ctx, ns, pserver, "mountpoint/testServer", &testServer{})
defer serverSM.Shutdown()
rid := serverSM.RoutingID()
+ ctx, _ = v23.SetPrincipal(ctx, pclient)
+
newClient := func() ipc.Client {
rid, err := naming.NewRoutingID()
if err != nil {
@@ -1818,7 +1865,7 @@
}
smc := imanager.InternalNew(rid)
defer smc.Shutdown()
- client, err := InternalNewClient(smc, ns, vc.LocalPrincipal{pclient})
+ client, err := InternalNewClient(smc, ns)
if err != nil {
t.Fatalf("failed to create client: %v", err)
}
@@ -1826,7 +1873,7 @@
}
runClient := func(client ipc.Client) {
- if call, err := client.StartCall(testContext(), "mountpoint/testServer", "Closure", nil); err != nil {
+ if call, err := client.StartCall(ctx, "mountpoint/testServer", "Closure", nil); err != nil {
t.Fatalf("failed to StartCall: %v", err)
} else if err := call.Finish(); err != nil {
t.Fatal(err)
@@ -1887,30 +1934,29 @@
pother = tsecurity.NewPrincipal("other")
pclient = tsecurity.NewPrincipal("client")
)
-
+ ctx, shutdown := initForTest()
+ defer shutdown()
ns := tnaming.NewSimpleNamespace()
mountName := "mountpoint/default"
// Start a server with pserver.
- defer runServer(t, ns, pserver, mountName, &testServer{}).Shutdown()
+ defer runServer(t, ctx, ns, pserver, mountName, &testServer{}).Shutdown()
smc := imanager.InternalNew(naming.FixedRoutingID(0xc))
- client, err := InternalNewClient(
- smc,
- ns,
- vc.LocalPrincipal{pclient})
+ client, err := InternalNewClient(smc, ns)
if err != nil {
t.Fatal(err)
}
defer smc.Shutdown()
defer client.Close()
+ ctx, _ = v23.SetPrincipal(ctx, pclient)
// The call should succeed when the server presents the same public as the opt...
- if _, err = client.StartCall(testContext(), mountName, "Closure", nil, options.ServerPublicKey{pserver.PublicKey()}); err != nil {
+ if _, err = client.StartCall(ctx, mountName, "Closure", nil, options.ServerPublicKey{pserver.PublicKey()}); err != nil {
t.Errorf("Expected call to succeed but got %v", err)
}
// ...but fail if they differ.
- if _, err = client.StartCall(testContext(), mountName, "Closure", nil, options.ServerPublicKey{pother.PublicKey()}); !verror.Is(err, verror.ErrNotTrusted.ID) {
+ if _, err = client.StartCall(ctx, mountName, "Closure", nil, options.ServerPublicKey{pother.PublicKey()}); !verror.Is(err, verror.ErrNotTrusted.ID) {
t.Errorf("got %v, want %v", verror.ErrorID(err), verror.ErrNotTrusted.ID)
}
}
@@ -1947,16 +1993,17 @@
var (
pdischarger = tsecurity.NewPrincipal("discharger")
)
+ ctx, shutdown := initForTest()
+ defer shutdown()
// Bless the client with a ThirdPartyCaveat.
tpcav := mkThirdPartyCaveat(pdischarger.PublicKey(), "mountpoint/discharger", mkCaveat(security.ExpiryCaveat(time.Now().Add(time.Hour))))
ns := tnaming.NewSimpleNamespace()
- ctx := testContext()
// Setup the disharge server.
discharger := &expiryDischarger{}
- defer runServer(t, ns, pdischarger, "mountpoint/discharger", discharger).Shutdown()
+ defer runServer(t, ctx, ns, pdischarger, "mountpoint/discharger", discharger).Shutdown()
// Create a discharge client.
rid, err := naming.NewRoutingID()
diff --git a/profiles/internal/ipc/resolve_test.go b/profiles/internal/ipc/resolve_test.go
index ce35790..b415220 100644
--- a/profiles/internal/ipc/resolve_test.go
+++ b/profiles/internal/ipc/resolve_test.go
@@ -3,6 +3,8 @@
import (
"flag"
"fmt"
+ "io"
+ "os"
"testing"
"time"
@@ -10,6 +12,7 @@
"v.io/v23/context"
"v.io/v23/ipc"
"v.io/v23/naming"
+ "v.io/v23/options"
"v.io/x/ref/lib/flags"
"v.io/x/ref/profiles/fake"
@@ -18,10 +21,10 @@
"v.io/x/ref/profiles/internal/lib/appcycle"
inaming "v.io/x/ref/profiles/internal/naming"
grt "v.io/x/ref/profiles/internal/rt"
+ mounttable "v.io/x/ref/services/mounttable/lib"
"v.io/x/ref/test"
"v.io/x/ref/test/expect"
"v.io/x/ref/test/modules"
- "v.io/x/ref/test/modules/core"
)
var commonFlags *flags.Flags
@@ -31,7 +34,9 @@
if err := internal.ParseFlags(commonFlags); err != nil {
panic(err)
}
+}
+func setupRuntime() {
ac := appcycle.New()
listenSpec := ipc.ListenSpec{Addrs: ipc.ListenAddrs{{"tcp", "127.0.0.1:0"}}}
@@ -56,8 +61,38 @@
fake.InjectRuntime(runtime, ctx, shutdown)
}
+func rootMountTable(stdin io.Reader, stdout, stderr io.Writer, env map[string]string, args ...string) error {
+ setupRuntime()
+ ctx, shutdown := v23.Init()
+ defer shutdown()
+
+ lspec := v23.GetListenSpec(ctx)
+ server, err := v23.NewServer(ctx, options.ServesMountTable(true))
+ if err != nil {
+ return fmt.Errorf("root failed: %v", err)
+ }
+ mp := ""
+ mt, err := mounttable.NewMountTableDispatcher("")
+ if err != nil {
+ return fmt.Errorf("mounttable.NewMountTableDispatcher failed: %s", err)
+ }
+ eps, err := server.Listen(lspec)
+ if err != nil {
+ return fmt.Errorf("server.Listen failed: %s", err)
+ }
+ if err := server.ServeDispatcher(mp, mt); err != nil {
+ return fmt.Errorf("root failed: %s", err)
+ }
+ fmt.Fprintf(stdout, "PID=%d\n", os.Getpid())
+ for _, ep := range eps {
+ fmt.Fprintf(stdout, "MT_NAME=%s\n", ep.Name())
+ }
+ modules.WaitForEOF(stdin)
+ return nil
+}
+
func startMT(t *testing.T, sh *modules.Shell) string {
- h, err := sh.Start(core.RootMTCommand, nil)
+ h, err := sh.Start("rootMountTable", nil)
if err != nil {
t.Fatalf("unexpected error for root mt: %s", err)
}
@@ -67,6 +102,7 @@
}
func TestResolveToEndpoint(t *testing.T) {
+ setupRuntime()
sh, err := modules.NewShell(nil, nil, testing.Verbose(), t)
if err != nil {
t.Fatalf("modules.NewShell failed: %s", err)
diff --git a/profiles/internal/ipc/server_authorizer_test.go b/profiles/internal/ipc/server_authorizer_test.go
index 416f70a..e185e4b 100644
--- a/profiles/internal/ipc/server_authorizer_test.go
+++ b/profiles/internal/ipc/server_authorizer_test.go
@@ -5,6 +5,7 @@
tsecurity "v.io/x/ref/test/security"
+ "v.io/v23"
"v.io/v23/options"
"v.io/v23/security"
)
@@ -21,7 +22,7 @@
otherAli, _ = pother.BlessSelf("ali")
zero = security.Blessings{}
- ctx = testContext()
+ ctx, shutdown = initForTest()
U = func(blessings ...security.Blessings) security.Blessings {
u, err := security.UnionOfBlessings(blessings...)
@@ -31,6 +32,8 @@
return u
}
)
+ defer shutdown()
+ ctx, _ = v23.SetPrincipal(ctx, pclient)
// Make client recognize ali, bob and otherAli blessings
for _, b := range []security.Blessings{ali, bob, otherAli} {
if err := pclient.AddToRoots(b); err != nil {
diff --git a/profiles/internal/ipc/server_test.go b/profiles/internal/ipc/server_test.go
index 37cbc17..808bb8e 100644
--- a/profiles/internal/ipc/server_test.go
+++ b/profiles/internal/ipc/server_test.go
@@ -7,6 +7,7 @@
"testing"
"time"
+ "v.io/v23"
"v.io/v23/config"
"v.io/v23/context"
"v.io/v23/ipc"
@@ -17,7 +18,6 @@
"v.io/x/lib/netstate"
imanager "v.io/x/ref/profiles/internal/ipc/stream/manager"
- "v.io/x/ref/profiles/internal/ipc/stream/vc"
inaming "v.io/x/ref/profiles/internal/naming"
tnaming "v.io/x/ref/profiles/internal/testing/mocks/naming"
tsecurity "v.io/x/ref/test/security"
@@ -38,13 +38,14 @@
return noMethodsType{}, nil, nil
}
-// TestBadObject ensures that Serve handles bad reciver objects gracefully (in
+// TestBadObject ensures that Serve handles bad receiver objects gracefully (in
// particular, it doesn't panic).
func TestBadObject(t *testing.T) {
sm := imanager.InternalNew(naming.FixedRoutingID(0x555555555))
defer sm.Shutdown()
ns := tnaming.NewSimpleNamespace()
- ctx := testContext()
+ ctx, shutdown := initForTest()
+ defer shutdown()
server, err := testInternalNewServer(ctx, sm, ns, tsecurity.NewPrincipal("test"))
if err != nil {
t.Fatal(err)
@@ -70,7 +71,7 @@
if err != nil {
t.Fatalf("InternalNewClient failed: %v", err)
}
- ctx, _ = context.WithDeadline(testContext(), time.Now().Add(10*time.Second))
+ ctx, _ = context.WithDeadline(ctx, time.Now().Add(10*time.Second))
call, err := client.StartCall(ctx, "servername", "SomeMethod", nil)
if err != nil {
t.Fatalf("StartCall failed: %v", err)
@@ -87,7 +88,9 @@
sm := imanager.InternalNew(naming.FixedRoutingID(0x555555555))
defer sm.Shutdown()
ns := tnaming.NewSimpleNamespace()
- server, err := testInternalNewServer(testContext(), sm, ns, tsecurity.NewPrincipal("test"))
+ ctx, shutdown := initForTest()
+ defer shutdown()
+ server, err := testInternalNewServer(ctx, sm, ns, tsecurity.NewPrincipal("test"))
if err != nil {
t.Fatal(err)
}
@@ -130,7 +133,8 @@
}
func TestServerStatus(t *testing.T) {
- ctx := testContext()
+ ctx, shutdown := initForTest()
+ defer shutdown()
sm := imanager.InternalNew(naming.FixedRoutingID(0x555555555))
defer sm.Shutdown()
ns := tnaming.NewSimpleNamespace()
@@ -162,7 +166,8 @@
progress := make(chan error)
- client, err := InternalNewClient(sm, ns, vc.LocalPrincipal{principal})
+ client, err := InternalNewClient(sm, ns)
+ ctx, _ = v23.SetPrincipal(ctx, principal)
makeCall := func(ctx *context.T) {
call, err := client.StartCall(ctx, "test", "Hang", nil)
progress <- err
@@ -222,7 +227,8 @@
sm := imanager.InternalNew(naming.FixedRoutingID(0x555555555))
defer sm.Shutdown()
ns := tnaming.NewSimpleNamespace()
- ctx := testContext()
+ ctx, shutdown := initForTest()
+ defer shutdown()
expectBadState := func(err error) {
if !verror.Is(err, verror.ErrBadState.ID) {
@@ -289,7 +295,9 @@
sm := imanager.InternalNew(naming.FixedRoutingID(0x555555555))
defer sm.Shutdown()
ns := tnaming.NewSimpleNamespace()
- server, err := testInternalNewServer(testContext(), sm, ns, tsecurity.NewPrincipal("test"))
+ ctx, shutdown := initForTest()
+ defer shutdown()
+ server, err := testInternalNewServer(ctx, sm, ns, tsecurity.NewPrincipal("test"))
if err != nil {
t.Fatal(err)
}
@@ -411,7 +419,9 @@
sm := imanager.InternalNew(naming.FixedRoutingID(0x555555555))
defer sm.Shutdown()
ns := tnaming.NewSimpleNamespace()
- server, err := testInternalNewServer(testContext(), sm, ns, tsecurity.NewPrincipal("test"))
+ ctx, shutdown := initForTest()
+ defer shutdown()
+ server, err := testInternalNewServer(ctx, sm, ns, tsecurity.NewPrincipal("test"))
defer server.Stop()
if err != nil {
@@ -560,7 +570,9 @@
sm := imanager.InternalNew(naming.FixedRoutingID(0x555555555))
defer sm.Shutdown()
ns := tnaming.NewSimpleNamespace()
- server, err := testInternalNewServer(testContext(), sm, ns, tsecurity.NewPrincipal("test"))
+ ctx, shutdown := initForTest()
+ defer shutdown()
+ server, err := testInternalNewServer(ctx, sm, ns, tsecurity.NewPrincipal("test"))
defer server.Stop()
if err != nil {
diff --git a/profiles/internal/ipc/stream/benchmark/dial_vc.go b/profiles/internal/ipc/stream/benchmark/dial_vc.go
index 1b42060..604be19 100644
--- a/profiles/internal/ipc/stream/benchmark/dial_vc.go
+++ b/profiles/internal/ipc/stream/benchmark/dial_vc.go
@@ -19,14 +19,15 @@
server := manager.InternalNew(naming.FixedRoutingID(0x5))
client := manager.InternalNew(naming.FixedRoutingID(0xc))
+ principal := tsecurity.NewPrincipal("client")
- _, ep, err := server.Listen("tcp", "127.0.0.1:0", tsecurity.NewPrincipal("test"), mode)
+ _, ep, err := server.Listen("tcp", "127.0.0.1:0", tsecurity.NewPrincipal("server"), mode)
if err != nil {
b.Fatal(err)
}
// Warmup to create the underlying VIF.
- _, err = client.Dial(ep, mode)
+ _, err = client.Dial(ep, principal, mode)
if err != nil {
b.Fatal(err)
}
@@ -37,7 +38,7 @@
b.StartTimer()
start := time.Now()
- _, err := client.Dial(ep, mode)
+ _, err := client.Dial(ep, principal, mode)
if err != nil {
b.Fatal(err)
}
diff --git a/profiles/internal/ipc/stream/benchmark/dial_vif.go b/profiles/internal/ipc/stream/benchmark/dial_vif.go
index 7224c8e..40078af 100644
--- a/profiles/internal/ipc/stream/benchmark/dial_vif.go
+++ b/profiles/internal/ipc/stream/benchmark/dial_vif.go
@@ -16,7 +16,7 @@
// benchmarkDialVIF measures VIF creation time over the underlying net connection.
func benchmarkDialVIF(b *testing.B, mode options.VCSecurityLevel) {
stats := benchmark.AddStats(b, 16)
- principal := tsecurity.NewPrincipal("test")
+ principal := tsecurity.NewPrincipal("server")
b.ResetTimer() // Exclude setup time from measurement.
@@ -32,7 +32,7 @@
b.StartTimer()
start := time.Now()
- client, err := vif.InternalNewDialedVIF(nc, naming.FixedRoutingID(0xc), nil, mode)
+ client, err := vif.InternalNewDialedVIF(nc, naming.FixedRoutingID(0xc), principal, nil, mode)
if err != nil {
b.Fatal(err)
}
diff --git a/profiles/internal/ipc/stream/benchmark/throughput_flow.go b/profiles/internal/ipc/stream/benchmark/throughput_flow.go
index d102382..0f8be69 100644
--- a/profiles/internal/ipc/stream/benchmark/throughput_flow.go
+++ b/profiles/internal/ipc/stream/benchmark/throughput_flow.go
@@ -40,6 +40,7 @@
func benchmarkFlow(b *testing.B, mode options.VCSecurityLevel, nVIFs, nVCsPerVIF, nFlowsPerVC int) {
client := manager.InternalNew(naming.FixedRoutingID(0xcccccccc))
server := manager.InternalNew(naming.FixedRoutingID(0x55555555))
+ principal := tsecurity.NewPrincipal("test")
lns, err := createListeners(mode, server, nVIFs)
if err != nil {
@@ -50,12 +51,14 @@
rchan := make(chan io.ReadCloser, nFlows)
wchan := make(chan io.WriteCloser, nFlows)
+ b.ResetTimer()
+
go func() {
defer close(wchan)
for i := 0; i < nVIFs; i++ {
ep := lns[i].ep
for j := 0; j < nVCsPerVIF; j++ {
- vc, err := client.Dial(ep, mode)
+ vc, err := client.Dial(ep, principal, mode)
if err != nil {
b.Error(err)
return
diff --git a/profiles/internal/ipc/stream/manager/listener.go b/profiles/internal/ipc/stream/manager/listener.go
index 07fde42..fc4a916 100644
--- a/profiles/internal/ipc/stream/manager/listener.go
+++ b/profiles/internal/ipc/stream/manager/listener.go
@@ -8,7 +8,6 @@
"sync"
"v.io/x/ref/profiles/internal/ipc/stream/proxy"
- "v.io/x/ref/profiles/internal/ipc/stream/vc"
"v.io/x/ref/profiles/internal/ipc/stream/vif"
"v.io/x/ref/profiles/internal/lib/upcqueue"
inaming "v.io/x/ref/profiles/internal/naming"
@@ -158,8 +157,7 @@
func (ln *proxyListener) connect() (*vif.VIF, *inaming.Endpoint, error) {
vlog.VI(1).Infof("Connecting to proxy at %v", ln.proxyEP)
- // Requires dialing a VC to the proxy, need to extract options (like the principal)
- // from ln.opts to do so.
+ // Requires dialing a VC to the proxy, need to extract options from ln.opts to do so.
var dialOpts []stream.VCOpt
for _, opt := range ln.opts {
if dopt, ok := opt.(stream.VCOpt); ok {
@@ -167,9 +165,7 @@
}
}
// TODO(cnicolaou, ashankar): probably want to set a timeout here. (is this covered by opts?)
- // TODO(suharshs): Pass the principal explicitly to FindOrDialVIF and remove vc.LocalPrincipal.
- dialOpts = append(dialOpts, vc.LocalPrincipal{ln.principal})
- vf, err := ln.manager.FindOrDialVIF(ln.proxyEP, dialOpts...)
+ vf, err := ln.manager.FindOrDialVIF(ln.proxyEP, ln.principal, dialOpts...)
if err != nil {
return nil, nil, err
}
@@ -177,7 +173,7 @@
return nil, nil, fmt.Errorf("already connected to proxy and accepting connections? VIF: %v, StartAccepting error: %v", vf, err)
}
// Proxy protocol: See veyron/profiles/proxy/protocol.vdl
- vc, err := vf.Dial(ln.proxyEP, dialOpts...)
+ vc, err := vf.Dial(ln.proxyEP, ln.principal, dialOpts...)
if err != nil {
vf.StopAccepting()
if verror.ErrorID(err) == verror.ErrAborted.ID {
diff --git a/profiles/internal/ipc/stream/manager/manager.go b/profiles/internal/ipc/stream/manager/manager.go
index e7c42e1..192c9b8 100644
--- a/profiles/internal/ipc/stream/manager/manager.go
+++ b/profiles/internal/ipc/stream/manager/manager.go
@@ -77,7 +77,7 @@
// FindOrDialVIF returns the network connection (VIF) to the provided address
// from the cache in the manager. If not already present in the cache, a new
// connection will be created using net.Dial.
-func (m *manager) FindOrDialVIF(remote naming.Endpoint, opts ...stream.VCOpt) (*vif.VIF, error) {
+func (m *manager) FindOrDialVIF(remote naming.Endpoint, principal security.Principal, opts ...stream.VCOpt) (*vif.VIF, error) {
// Extract options.
var timeout time.Duration
for _, o := range opts {
@@ -116,7 +116,7 @@
vRange = r
}
}
- vf, err := vif.InternalNewDialedVIF(conn, m.rid, vRange, opts...)
+ vf, err := vif.InternalNewDialedVIF(conn, m.rid, principal, vRange, opts...)
if err != nil {
conn.Close()
return nil, fmt.Errorf("failed to create VIF: %v", err)
@@ -133,15 +133,15 @@
return vf, nil
}
-func (m *manager) Dial(remote naming.Endpoint, opts ...stream.VCOpt) (stream.VC, error) {
+func (m *manager) Dial(remote naming.Endpoint, principal security.Principal, opts ...stream.VCOpt) (stream.VC, error) {
// If vif.Dial fails because the cached network connection was broken, remove from
// the cache and try once more.
for retry := true; true; retry = false {
- vf, err := m.FindOrDialVIF(remote, opts...)
+ vf, err := m.FindOrDialVIF(remote, principal, opts...)
if err != nil {
return nil, err
}
- vc, err := vf.Dial(remote, append(opts, m.sessionCache)...)
+ vc, err := vf.Dial(remote, principal, append(opts, m.sessionCache)...)
if !retry || verror.ErrorID(err) != verror.ErrAborted.ID {
return vc, err
}
diff --git a/profiles/internal/ipc/stream/manager/manager_test.go b/profiles/internal/ipc/stream/manager/manager_test.go
index bcebc33..7e3a288 100644
--- a/profiles/internal/ipc/stream/manager/manager_test.go
+++ b/profiles/internal/ipc/stream/manager/manager_test.go
@@ -58,8 +58,9 @@
func testSimpleFlow(t *testing.T, protocol string) {
server := InternalNew(naming.FixedRoutingID(0x55555555))
client := InternalNew(naming.FixedRoutingID(0xcccccccc))
+ pclient := tsecurity.NewPrincipal("client")
- ln, ep, err := server.Listen(protocol, "127.0.0.1:0", tsecurity.NewPrincipal("test"))
+ ln, ep, err := server.Listen(protocol, "127.0.0.1:0", tsecurity.NewPrincipal("server"))
if err != nil {
t.Fatal(err)
}
@@ -68,7 +69,7 @@
var clientVC stream.VC
var clientF1 stream.Flow
go func() {
- if clientVC, err = client.Dial(ep); err != nil {
+ if clientVC, err = client.Dial(ep, pclient); err != nil {
t.Errorf("Dial(%q) failed: %v", ep, err)
return
}
@@ -134,7 +135,7 @@
t.Errorf("Should not be able to Dial or Write after the Listener is closed")
}
// Opening a new VC should fail fast.
- if _, err := client.Dial(ep); err == nil {
+ if _, err := client.Dial(ep, pclient); err == nil {
t.Errorf("Should not be able to Dial after listener is closed")
}
}
@@ -154,7 +155,7 @@
go func() {
// 203.0.113.0 is TEST-NET-3 from RFC5737
ep, _ := inaming.NewEndpoint(naming.FormatEndpoint("tcp", "203.0.113.10:80"))
- _, err := client.Dial(ep, &DialTimeout{time.Second})
+ _, err := client.Dial(ep, tsecurity.NewPrincipal("client"), &DialTimeout{time.Second})
ch <- err
}()
@@ -220,7 +221,7 @@
go func() {
// VCSecurityLevel is intentionally not provided to Dial - to
// test default behavior.
- vc, err := client.Dial(ep, vc.LocalPrincipal{clientPrincipal})
+ vc, err := client.Dial(ep, clientPrincipal)
if err != nil {
errs <- err
return
@@ -302,20 +303,21 @@
func testCloseListener(t *testing.T, protocol string) {
server := InternalNew(naming.FixedRoutingID(0x5e97e9))
+ pclient := tsecurity.NewPrincipal("client")
- ln, ep, err := server.Listen(protocol, "127.0.0.1:0", tsecurity.NewPrincipal("test"))
+ ln, ep, err := server.Listen(protocol, "127.0.0.1:0", tsecurity.NewPrincipal("server"))
if err != nil {
t.Fatal(err)
}
// Server will just listen for flows and close them.
go acceptLoop(ln)
client := InternalNew(naming.FixedRoutingID(0xc1e41))
- if _, err = client.Dial(ep); err != nil {
+ if _, err = client.Dial(ep, pclient); err != nil {
t.Fatal(err)
}
ln.Close()
client = InternalNew(naming.FixedRoutingID(0xc1e42))
- if _, err := client.Dial(ep); err == nil {
+ if _, err := client.Dial(ep, pclient); err == nil {
t.Errorf("client.Dial(%q) should have failed", ep)
}
}
@@ -352,7 +354,7 @@
server := InternalNew(naming.FixedRoutingID(0x55555555))
client := InternalNew(naming.FixedRoutingID(0xcccccccc))
- ln, ep, err := server.Listen(protocol, "127.0.0.1:0", tsecurity.NewPrincipal("test"))
+ ln, ep, err := server.Listen(protocol, "127.0.0.1:0", tsecurity.NewPrincipal("server"))
if err != nil {
t.Fatal(err)
}
@@ -360,7 +362,7 @@
// Server will just listen for flows and close them.
go acceptLoop(ln)
- vc, err := client.Dial(ep)
+ vc, err := client.Dial(ep, tsecurity.NewPrincipal("client"))
if err != nil {
t.Fatal(err)
}
@@ -401,7 +403,7 @@
// Have the server read from each flow and write to rchan.
rchan := make(chan string)
- ln, ep, err := server.Listen(protocol, "127.0.0.1:0", tsecurity.NewPrincipal("test"))
+ ln, ep, err := server.Listen(protocol, "127.0.0.1:0", tsecurity.NewPrincipal("server"))
if err != nil {
t.Fatal(err)
}
@@ -438,7 +440,7 @@
var vcs [nVCs]stream.VC
for i := 0; i < nVCs; i++ {
var err error
- vcs[i], err = client.Dial(ep)
+ vcs[i], err = client.Dial(ep, tsecurity.NewPrincipal("client"))
if err != nil {
t.Fatal(err)
}
@@ -507,7 +509,7 @@
// Dial multiple VCs
for i := 0; i < 2; i++ {
- if _, err = client.Dial(nep); err != nil {
+ if _, err = client.Dial(nep, tsecurity.NewPrincipal("client")); err != nil {
t.Fatalf("Dial #%d failed: %v", i, err)
}
}
@@ -531,6 +533,7 @@
func testServerRestartDuringClientLifetime(t *testing.T, protocol string) {
client := InternalNew(naming.FixedRoutingID(0xcccccccc))
+ pclient := tsecurity.NewPrincipal("client")
sh, err := modules.NewShell(nil, nil, testing.Verbose(), t)
if err != nil {
t.Fatalf("unexpected error: %s", err)
@@ -547,13 +550,13 @@
if err != nil {
t.Fatalf("inaming.NewEndpoint(%q): %v", addr, err)
}
- if _, err := client.Dial(ep); err != nil {
+ if _, err := client.Dial(ep, pclient); err != nil {
t.Fatal(err)
}
h.Shutdown(nil, os.Stderr)
// A new VC cannot be created since the server is dead
- if _, err := client.Dial(ep); err == nil {
+ if _, err := client.Dial(ep, pclient); err == nil {
t.Fatal("Expected client.Dial to fail since server is dead")
}
@@ -565,7 +568,7 @@
if addr2 := h.ReadLine(); addr2 != addr || err != nil {
t.Fatalf("Got (%q, %v) want (%q, nil)", addr2, err, addr)
}
- if _, err := client.Dial(ep); err != nil {
+ if _, err := client.Dial(ep, pclient); err != nil {
t.Fatal(err)
}
}
@@ -610,6 +613,7 @@
func TestRegistration(t *testing.T) {
server := InternalNew(naming.FixedRoutingID(0x55555555))
client := InternalNew(naming.FixedRoutingID(0xcccccccc))
+ pserver := tsecurity.NewPrincipal("server")
dialer := func(_, _ string, _ time.Duration) (net.Conn, error) {
return nil, fmt.Errorf("tn.Dial")
@@ -619,12 +623,12 @@
}
ipc.RegisterProtocol("tn", dialer, listener)
- _, _, err := server.Listen("tnx", "127.0.0.1:0", tsecurity.NewPrincipal("test"))
+ _, _, err := server.Listen("tnx", "127.0.0.1:0", pserver)
if err == nil || !strings.Contains(err.Error(), "unknown network tnx") {
t.Fatal("expected error is missing (%v)", err)
}
- _, _, err = server.Listen("tn", "127.0.0.1:0", tsecurity.NewPrincipal("test"))
+ _, _, err = server.Listen("tn", "127.0.0.1:0", pserver)
if err == nil || !strings.Contains(err.Error(), "tn.Listen") {
t.Fatal("expected error is missing (%v)", err)
}
@@ -638,12 +642,12 @@
t.Errorf("got %t, want %t", got, want)
}
- _, ep, err := server.Listen("tn", "127.0.0.1:0", tsecurity.NewPrincipal("test"))
+ _, ep, err := server.Listen("tn", "127.0.0.1:0", pserver)
if err != nil {
t.Errorf("unexpected error %s", err)
}
- _, err = client.Dial(ep)
+ _, err = client.Dial(ep, tsecurity.NewPrincipal("client"))
if err == nil || !strings.Contains(err.Error(), "tn.Dial") {
t.Fatal("expected error is missing (%v)", err)
}
diff --git a/profiles/internal/ipc/stream/model.go b/profiles/internal/ipc/stream/model.go
index 5bee977..aa6095c 100644
--- a/profiles/internal/ipc/stream/model.go
+++ b/profiles/internal/ipc/stream/model.go
@@ -127,7 +127,9 @@
Listen(protocol, address string, principal security.Principal, opts ...ListenerOpt) (Listener, naming.Endpoint, error)
// Dial creates a VC to the provided remote endpoint.
- Dial(remote naming.Endpoint, opts ...VCOpt) (VC, error)
+ // principal is used during authentication. If principal is nil, then the VC expects
+ // to be used for unauthenticated, unencrypted communication.
+ Dial(remote naming.Endpoint, principal security.Principal, opts ...VCOpt) (VC, error)
// ShutdownEndpoint closes all VCs (and Flows and Listeners over it)
// involving the provided remote endpoint.
diff --git a/profiles/internal/ipc/stream/proxy/proxy_test.go b/profiles/internal/ipc/stream/proxy/proxy_test.go
index 26123d6..ed9a607 100644
--- a/profiles/internal/ipc/stream/proxy/proxy_test.go
+++ b/profiles/internal/ipc/stream/proxy/proxy_test.go
@@ -122,7 +122,7 @@
other := manager.InternalNew(naming.FixedRoutingID(0xcccccccccccccccc))
defer other.Shutdown()
- vc, err := other.Dial(proxyEp)
+ vc, err := other.Dial(proxyEp, tsecurity.NewPrincipal("other"))
if err != nil {
t.Fatal(err)
}
@@ -170,7 +170,7 @@
client := manager.InternalNew(naming.FixedRoutingID(0xcccccccccccccccc))
defer client.Shutdown()
- vc, err := client.Dial(ep)
+ vc, err := client.Dial(ep, tsecurity.NewPrincipal("client"))
if err != nil {
t.Fatal(err)
}
@@ -222,12 +222,14 @@
defer lnS.Close()
rchan := make(chan string)
+ pclient1 := tsecurity.NewPrincipal("client1")
+
// client1 must connect to the proxy to speak to the server.
// Keep a VC and Flow open to the server, to ensure that the proxy
// maintains routing information (at some point, inactive VIFs
// should be garbage collected, so this ensures that the VIF
// is "active")
- if vc, err := client1.Dial(epS); err != nil {
+ if vc, err := client1.Dial(epS, pclient1); err != nil {
t.Fatal(err)
} else if flow, err := vc.Connect(); err != nil {
t.Fatal(err)
@@ -236,7 +238,7 @@
}
// Now client1 becomes a server
- lnC, epC, err := client1.Listen(proxyEp.Network(), proxyEp.String(), tsecurity.NewPrincipal("test"))
+ lnC, epC, err := client1.Listen(proxyEp.Network(), proxyEp.String(), pclient1)
if err != nil {
t.Fatal(err)
}
@@ -253,7 +255,7 @@
}
func writeFlow(mgr stream.Manager, ep naming.Endpoint, data string) error {
- vc, err := mgr.Dial(ep)
+ vc, err := mgr.Dial(ep, tsecurity.NewPrincipal("test"))
if err != nil {
return fmt.Errorf("manager.Dial(%v) failed: %v", ep, err)
}
diff --git a/profiles/internal/ipc/stream/vc/init.go b/profiles/internal/ipc/stream/vc/init.go
deleted file mode 100644
index 4fc3889..0000000
--- a/profiles/internal/ipc/stream/vc/init.go
+++ /dev/null
@@ -1,63 +0,0 @@
-package vc
-
-import (
- "crypto/ecdsa"
- "crypto/elliptic"
- "crypto/rand"
- "fmt"
-
- "v.io/v23/security"
- "v.io/x/lib/vlog"
-)
-
-var AnonymousPrincipal security.Principal
-
-func init() {
- key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
- if err != nil {
- vlog.Fatalf("could not create private key for anonymous principal: %v", err)
- }
- store := &anonymousBlessingStore{k: security.NewECDSAPublicKey(&key.PublicKey)}
- if AnonymousPrincipal, err = security.CreatePrincipal(security.NewInMemoryECDSASigner(key), store, nil); err != nil {
- vlog.Fatalf("could not create anonymous principal: %v", err)
- }
- if store.b, err = AnonymousPrincipal.BlessSelf("anonymous"); err != nil {
- vlog.Fatalf("failed to generate the one blessing to be used by the anonymous principal: %v", err)
- }
-}
-
-// TODO(ashankar,ataly): Figure out what to do with this!
-// (Most likely move the BlessingStore implementation from veyron/profiles/internal/rt to veyron/security
-// and use that?)
-type anonymousBlessingStore struct {
- k security.PublicKey
- b security.Blessings
-}
-
-func (s *anonymousBlessingStore) Set(security.Blessings, security.BlessingPattern) (security.Blessings, error) {
- return security.Blessings{}, fmt.Errorf("cannot store blessings with an anonymous principal")
-}
-
-func (s *anonymousBlessingStore) ForPeer(...string) security.Blessings {
- return s.b
-}
-
-func (s *anonymousBlessingStore) SetDefault(security.Blessings) error {
- return fmt.Errorf("cannot change default blessing associated with the anonymous principal")
-}
-
-func (s *anonymousBlessingStore) Default() security.Blessings {
- return s.b
-}
-
-func (s *anonymousBlessingStore) PublicKey() security.PublicKey {
- return s.k
-}
-
-func (s *anonymousBlessingStore) PeerBlessings() map[security.BlessingPattern]security.Blessings {
- return nil
-}
-
-func (anonymousBlessingStore) DebugString() string {
- return "anonymous BlessingStore"
-}
diff --git a/profiles/internal/ipc/stream/vc/vc.go b/profiles/internal/ipc/stream/vc/vc.go
index f3e3cc7..b32ff82 100644
--- a/profiles/internal/ipc/stream/vc/vc.go
+++ b/profiles/internal/ipc/stream/vc/vc.go
@@ -139,14 +139,6 @@
Version version.IPCVersion
}
-// LocalPrincipal wraps a security.Principal so that it can be provided
-// as an option to various methods in order to provide authentication information
-// when establishing virtual circuits.
-type LocalPrincipal struct{ security.Principal }
-
-func (LocalPrincipal) IPCStreamVCOpt() {}
-func (LocalPrincipal) IPCClientOpt() {}
-
// DischargeClient is an interface for obtaining discharges for a set of third-party
// caveats.
//
@@ -407,17 +399,14 @@
// HandshakeDialedVC completes initialization of the VC (setting up encryption,
// authentication etc.) under the assumption that the VC was initiated by the
// local process (i.e., the local process "Dial"ed to create the VC).
-func (vc *VC) HandshakeDialedVC(opts ...stream.VCOpt) error {
+func (vc *VC) HandshakeDialedVC(principal security.Principal, opts ...stream.VCOpt) error {
var (
- principal security.Principal
tlsSessionCache crypto.TLSClientSessionCache
securityLevel options.VCSecurityLevel
auth *ServerAuthorizer
)
for _, o := range opts {
switch v := o.(type) {
- case LocalPrincipal:
- principal = v.Principal
case options.VCSecurityLevel:
securityLevel = v
case crypto.TLSClientSessionCache:
@@ -429,7 +418,7 @@
switch securityLevel {
case options.VCSecurityConfidential:
if principal == nil {
- principal = AnonymousPrincipal
+ return fmt.Errorf("principal required for VCSecurityConfidential")
}
case options.VCSecurityNone:
return nil
diff --git a/profiles/internal/ipc/stream/vc/vc_test.go b/profiles/internal/ipc/stream/vc/vc_test.go
index 056716e..302f477 100644
--- a/profiles/internal/ipc/stream/vc/vc_test.go
+++ b/profiles/internal/ipc/stream/vc/vc_test.go
@@ -474,7 +474,7 @@
go serverH.pipeLoop(clientH.VC)
lopts := []stream.ListenerOpt{security}
- vcopts := []stream.VCOpt{vc.LocalPrincipal{client}, security}
+ vcopts := []stream.VCOpt{security}
if dischargeClient != nil {
lopts = append(lopts, dischargeClient)
@@ -484,7 +484,7 @@
}
c := serverH.VC.HandshakeAcceptedVC(server, lopts...)
- if err := clientH.VC.HandshakeDialedVC(vcopts...); err != nil {
+ if err := clientH.VC.HandshakeDialedVC(client, vcopts...); err != nil {
go func() { <-c }()
return nil, nil, err
}
diff --git a/profiles/internal/ipc/stream/vif/set_test.go b/profiles/internal/ipc/stream/vif/set_test.go
index ca53318..6621d4b 100644
--- a/profiles/internal/ipc/stream/vif/set_test.go
+++ b/profiles/internal/ipc/stream/vif/set_test.go
@@ -60,14 +60,14 @@
func newVIF(c, s net.Conn) (*vif.VIF, *vif.VIF, error) {
done := make(chan *vif.VIF)
go func() {
- vf, err := vif.InternalNewAcceptedVIF(s, naming.FixedRoutingID(0x5), tsecurity.NewPrincipal("test"), nil)
+ vf, err := vif.InternalNewAcceptedVIF(s, naming.FixedRoutingID(0x5), tsecurity.NewPrincipal("accepted"), nil)
if err != nil {
panic(err)
}
done <- vf
}()
- vf, err := vif.InternalNewDialedVIF(c, naming.FixedRoutingID(0xc), nil, nil, nil)
+ vf, err := vif.InternalNewDialedVIF(c, naming.FixedRoutingID(0xc), tsecurity.NewPrincipal("dialed"), nil)
if err != nil {
return nil, nil, err
}
diff --git a/profiles/internal/ipc/stream/vif/vif.go b/profiles/internal/ipc/stream/vif/vif.go
index 97bbe65..5279034 100644
--- a/profiles/internal/ipc/stream/vif/vif.go
+++ b/profiles/internal/ipc/stream/vif/vif.go
@@ -131,8 +131,8 @@
// As the name suggests, this method is intended for use only within packages
// placed inside veyron/profiles/internal. Code outside the
// veyron2/profiles/internal/* packages should never call this method.
-func InternalNewDialedVIF(conn net.Conn, rid naming.RoutingID, versions *version.Range, opts ...stream.VCOpt) (*VIF, error) {
- ctx, principal, err := clientAuthOptions(opts)
+func InternalNewDialedVIF(conn net.Conn, rid naming.RoutingID, principal security.Principal, versions *version.Range, opts ...stream.VCOpt) (*VIF, error) {
+ ctx, principal, err := clientAuthOptions(principal, opts)
if err != nil {
return nil, err
}
@@ -229,7 +229,7 @@
// Dial creates a new VC to the provided remote identity, authenticating the VC
// with the provided local identity.
-func (vif *VIF) Dial(remoteEP naming.Endpoint, opts ...stream.VCOpt) (stream.VC, error) {
+func (vif *VIF) Dial(remoteEP naming.Endpoint, principal security.Principal, opts ...stream.VCOpt) (stream.VC, error) {
vc, err := vif.newVC(vif.allocVCI(), vif.localEP, remoteEP, true)
if err != nil {
return nil, err
@@ -255,7 +255,7 @@
vc.Close(err.Error())
return nil, err
}
- if err := vc.HandshakeDialedVC(opts...); err != nil {
+ if err := vc.HandshakeDialedVC(principal, opts...); err != nil {
vif.vcMap.Delete(vc.VCI())
err = fmt.Errorf("VC handshake failed: %v", err)
vc.Close(err.Error())
@@ -961,16 +961,16 @@
return ep
}
-// clientAuthOptions extracts the client authentication options from the options
-// list.
-func clientAuthOptions(lopts []stream.VCOpt) (ctx *context.T, principal security.Principal, err error) {
- var securityLevel options.VCSecurityLevel
+// clientAuthOptions returns credentials for VIF authentication, based on the provided principal and options list.
+func clientAuthOptions(principal security.Principal, lopts []stream.VCOpt) (*context.T, security.Principal, error) {
+ var (
+ securityLevel options.VCSecurityLevel
+ ctx *context.T
+ )
for _, o := range lopts {
switch v := o.(type) {
case vc.DialContext:
ctx = v.T
- case vc.LocalPrincipal:
- principal = v.Principal
case options.VCSecurityLevel:
securityLevel = v
}
@@ -978,12 +978,12 @@
switch securityLevel {
case options.VCSecurityConfidential:
if principal == nil {
- principal = vc.AnonymousPrincipal
+ return nil, nil, fmt.Errorf("principal required for VCSecurityConfidential")
}
+ return ctx, principal, nil
case options.VCSecurityNone:
- principal = nil
+ return ctx, nil, nil
default:
- err = fmt.Errorf("unrecognized VC security level: %v", securityLevel)
+ return nil, nil, fmt.Errorf("unrecognized VC security level: %v", securityLevel)
}
- return
}
diff --git a/profiles/internal/ipc/stream/vif/vif_test.go b/profiles/internal/ipc/stream/vif/vif_test.go
index cf99618..4bb1abe 100644
--- a/profiles/internal/ipc/stream/vif/vif_test.go
+++ b/profiles/internal/ipc/stream/vif/vif_test.go
@@ -19,7 +19,6 @@
"v.io/v23/ipc/version"
"v.io/v23/naming"
- "v.io/x/ref/profiles/internal/ipc/stream/vc"
"v.io/x/ref/profiles/internal/ipc/stream/vif"
iversion "v.io/x/ref/profiles/internal/ipc/version"
tsecurity "v.io/x/ref/test/security"
@@ -30,10 +29,6 @@
//go:generate v23 test generate
-func newPrincipal(defaultBlessing string) vc.LocalPrincipal {
- return vc.LocalPrincipal{tsecurity.NewPrincipal("defaultBlessing")}
-}
-
func TestSingleFlowCreatedAtClient(t *testing.T) {
client, server := NewClientServer()
defer client.Close()
@@ -383,21 +378,22 @@
func TestNetworkFailure(t *testing.T) {
c1, c2 := pipe()
result := make(chan *vif.VIF)
+ pclient := tsecurity.NewPrincipal("client")
go func() {
- client, err := vif.InternalNewDialedVIF(c1, naming.FixedRoutingID(0xc), nil)
+ client, err := vif.InternalNewDialedVIF(c1, naming.FixedRoutingID(0xc), pclient, nil)
if err != nil {
t.Fatal(err)
}
result <- client
}()
- server, err := vif.InternalNewAcceptedVIF(c2, naming.FixedRoutingID(0x5), tsecurity.NewPrincipal("test"), nil)
+ server, err := vif.InternalNewAcceptedVIF(c2, naming.FixedRoutingID(0x5), tsecurity.NewPrincipal("server"), nil)
if err != nil {
t.Fatal(err)
}
client := <-result
// If the network connection dies, Dial and Accept should fail.
c1.Close()
- if _, err := client.Dial(makeEP(0x5)); err == nil {
+ if _, err := client.Dial(makeEP(0x5), pclient); err == nil {
t.Errorf("Expected client.Dial to fail")
}
if _, err := server.Accept(); err == nil {
@@ -493,7 +489,7 @@
var cerr error
cl := make(chan *vif.VIF)
go func() {
- c, err := vif.InternalNewDialedVIF(c1, naming.FixedRoutingID(0xc), clientVersions, newPrincipal("client"))
+ c, err := vif.InternalNewDialedVIF(c1, naming.FixedRoutingID(0xc), tsecurity.NewPrincipal("client"), clientVersions)
if err != nil {
cerr = err
close(cl)
@@ -550,7 +546,7 @@
scChan := make(chan stream.Connector)
errChan := make(chan error)
go func() {
- vc, err := client.Dial(ep, newPrincipal("client"))
+ vc, err := client.Dial(ep, tsecurity.NewPrincipal("client"))
errChan <- err
vcChan <- vc
}()
diff --git a/profiles/internal/ipc/test/proxy_test.go b/profiles/internal/ipc/test/proxy_test.go
index df7d9f3..6c7c2f8 100644
--- a/profiles/internal/ipc/test/proxy_test.go
+++ b/profiles/internal/ipc/test/proxy_test.go
@@ -25,7 +25,6 @@
iipc "v.io/x/ref/profiles/internal/ipc"
imanager "v.io/x/ref/profiles/internal/ipc/stream/manager"
"v.io/x/ref/profiles/internal/ipc/stream/proxy"
- "v.io/x/ref/profiles/internal/ipc/stream/vc"
"v.io/x/ref/profiles/internal/lib/publisher"
inaming "v.io/x/ref/profiles/internal/naming"
tnaming "v.io/x/ref/profiles/internal/testing/mocks/naming"
@@ -177,7 +176,7 @@
)
defer smserver.Shutdown()
defer smclient.Shutdown()
- client, err := iipc.InternalNewClient(smserver, ns, vc.LocalPrincipal{tsecurity.NewPrincipal("client")})
+ client, err := iipc.InternalNewClient(smserver, ns)
if err != nil {
t.Fatal(err)
}
diff --git a/profiles/internal/ipc/testutil_test.go b/profiles/internal/ipc/testutil_test.go
index a35808f..0648593 100644
--- a/profiles/internal/ipc/testutil_test.go
+++ b/profiles/internal/ipc/testutil_test.go
@@ -5,6 +5,12 @@
"testing"
"time"
+ "v.io/v23/vtrace"
+ "v.io/x/ref/lib/flags"
+ ivtrace "v.io/x/ref/profiles/internal/vtrace"
+ "v.io/x/ref/test"
+
+ "v.io/v23"
"v.io/v23/context"
"v.io/v23/naming"
"v.io/v23/security"
@@ -68,6 +74,16 @@
return b
}
+func initForTest() (*context.T, v23.Shutdown) {
+ ctx, shutdown := test.InitForTest()
+ ctx, err := ivtrace.Init(ctx, flags.VtraceFlags{})
+ if err != nil {
+ panic(err)
+ }
+ ctx, _ = vtrace.SetNewTrace(ctx)
+ return ctx, shutdown
+}
+
func mkThirdPartyCaveat(discharger security.PublicKey, location string, c security.Caveat) security.Caveat {
tpc, err := security.NewPublicKeyCaveat(discharger, location, security.ThirdPartyRequirements{}, c)
if err != nil {
@@ -76,15 +92,6 @@
return tpc
}
-// We need a special way to create contexts for tests. We
-// can't create a real runtime in the runtime implementation
-// so we use a fake one that panics if used. The runtime
-// implementation should not ever use the Runtime from a context.
-func testContext() *context.T {
- ctx, _ := context.WithTimeout(testContextWithoutDeadline(), 20*time.Second)
- return ctx
-}
-
// mockCall implements security.Call
type mockCall struct {
p security.Principal
diff --git a/profiles/internal/ipc/v23_internal_test.go b/profiles/internal/ipc/v23_test.go
similarity index 85%
rename from profiles/internal/ipc/v23_internal_test.go
rename to profiles/internal/ipc/v23_test.go
index 9597c2e..0efc85a 100644
--- a/profiles/internal/ipc/v23_internal_test.go
+++ b/profiles/internal/ipc/v23_test.go
@@ -4,7 +4,7 @@
// This file was auto-generated via go generate.
// DO NOT UPDATE MANUALLY
-package ipc
+package ipc_test
import "fmt"
import "testing"
@@ -13,6 +13,10 @@
import "v.io/x/ref/test"
import "v.io/x/ref/test/modules"
+func init() {
+ modules.RegisterChild("rootMountTable", ``, rootMountTable)
+}
+
func TestMain(m *testing.M) {
test.Init()
if modules.IsModulesChildProcess() {