veyron/runtimes/google/ipc: The blessings the server is started with
are the its blessings FOREVER!
If one wants to use new blessings they need to create a new server
with those blessings.
Change-Id: I49a06b5cfe367d728f37c0b4dc43f4a4d7a4e808
diff --git a/runtimes/google/naming/namespace/all_test.go b/runtimes/google/naming/namespace/all_test.go
index 823b547..29e7bcc 100644
--- a/runtimes/google/naming/namespace/all_test.go
+++ b/runtimes/google/naming/namespace/all_test.go
@@ -715,23 +715,19 @@
}
// Intermediate mounttables should be authenticated.
- // Simulate an "attacker" by changing the blessings presented by this
- // intermediate mounttable (which will not be consistent with the
- // blessing pattern in the mount entry). A subtle annoyance here: This
- // "attack" is valid only until the child mounttable remounts itself.
- // Currently this remounting period is set to 1 minute (publishPeriod
- // in ipc/consts.go), but if that changes - then this test may need
- // to change as well.
- runMT(t, mtCtx, "mt")
- attacker, err := veyron2.GetPrincipal(mtCtx).BlessSelf("attacker")
- if err != nil {
- t.Fatal(err)
- }
+ mt := runMT(t, mtCtx, "mt")
+ // Mount a server on "mt".
if err := mount("mt/server", ep1, time.Minute, naming.ReplaceMountOpt(true)); err != nil {
t.Error(err)
- } else if err := veyron2.GetPrincipal(mtCtx).BlessingStore().SetDefault(attacker); err != nil {
+ }
+ // Imagine that the network address of "mt" has been taken over by an attacker. However, this attacker cannot
+ // mess with the mount entry for "mt". This would result in "mt" and its mount entry (in the global mounttable)
+ // having inconsistent blessings. Simulate this by explicitly changing the mount entry for "mt".
+ if err := veyron2.GetNamespace(mtCtx).Mount(mtCtx, "mt", mt.name, time.Minute, naming.ServesMountTableOpt(true), naming.MountedServerBlessingsOpt{"realmounttable"}, naming.ReplaceMountOpt(true)); err != nil {
t.Error(err)
- } else if e, err := resolve("mt/server", options.SkipResolveAuthorization{}); err != nil {
+ }
+
+ if e, err := resolve("mt/server", options.SkipResolveAuthorization{}); err != nil {
t.Errorf("Resolve should succeed when skipping server authorization. Got (%v, %v)", e, err)
} else if e, err := resolve("mt/server"); !verror.Is(err, verror.ErrNotTrusted.ID) {
t.Errorf("Resolve should have failed with %q because an attacker has taken over the intermediate mounttable. Got (%+v, errorid=%q:%v)", verror.ErrNotTrusted.ID, e, verror.ErrorID(err), err)
diff --git a/runtimes/google/rt/ipc_test.go b/runtimes/google/rt/ipc_test.go
index 3758881..42e3d57 100644
--- a/runtimes/google/rt/ipc_test.go
+++ b/runtimes/google/rt/ipc_test.go
@@ -161,26 +161,21 @@
}
}
}
- // Start the server process.
- server, serverObjectName, err := startServer(serverCtx, testService{})
- if err != nil {
- t.Fatal(err)
- }
- defer server.Stop()
-
// Let it rip!
for _, test := range tests {
- // TODO(ashankar,suharshs): Once blessings are exchanged "per-RPC", one client for all cases will suffice.
- // Also, we need server to lameduck VCs when server.BlessingStore().Default() has changed
- // for one client to be sufficient.
- ctx, client, err := veyron2.SetNewClient(clientCtx)
- if err != nil {
- panic(err)
- }
if err := pserver.BlessingStore().SetDefault(test.server); err != nil {
t.Errorf("pserver.SetDefault(%v) failed: %v", test.server, err)
continue
}
+ server, serverObjectName, err := startServer(serverCtx, testService{})
+ if err != nil {
+ t.Fatal(err)
+ }
+ ctx, client, err := veyron2.SetNewClient(clientCtx)
+ if err != nil {
+ panic(err)
+ }
+
var gotClient []string
if call, err := client.StartCall(ctx, serverObjectName, "EchoBlessings", nil); err != nil {
t.Errorf("client.StartCall failed: %v", err)
@@ -191,6 +186,9 @@
} else if gotServer, _ := call.RemoteBlessings(); !reflect.DeepEqual(gotServer, test.wantServer) {
t.Errorf("%v: Got %v, want %v for server blessings", test.server, gotServer, test.wantClient)
}
+
+ server.Stop()
+ client.Close()
}
}
@@ -206,25 +204,24 @@
root = tsecurity.NewIDProvider("root")
)
- // Start the server and discharge server.
- server, serverName, err := startServer(serverCtx, &testService{})
- if err != nil {
+ // Setup the server's and discharger's blessing store and blessing roots, and
+ // start the server and discharger.
+ if err := root.Bless(pdischarger, "discharger"); err != nil {
t.Fatal(err)
}
- defer server.Stop()
dischargeServer, dischargeServerName, err := startServer(dischargerCtx, &dischargeService{})
if err != nil {
t.Fatal(err)
}
defer dischargeServer.Stop()
-
- // Setup the server's and discharger's blessing store and blessing roots.
if err := root.Bless(pserver, "server", mkThirdPartyCaveat(pdischarger.PublicKey(), dischargeServerName)); err != nil {
t.Fatal(err)
}
- if err := root.Bless(pdischarger, "discharger"); err != nil {
+ server, serverName, err := startServer(serverCtx, &testService{})
+ if err != nil {
t.Fatal(err)
}
+ defer server.Stop()
// Setup up the client's blessing store so that it can talk to the server.
rootClient := mkBlessings(root.NewBlessings(pclient, "client"))
diff --git a/runtimes/google/rt/runtime.go b/runtimes/google/rt/runtime.go
index af853c3..d31348c 100644
--- a/runtimes/google/rt/runtime.go
+++ b/runtimes/google/rt/runtime.go
@@ -14,6 +14,7 @@
"v.io/core/veyron2/i18n"
"v.io/core/veyron2/ipc"
"v.io/core/veyron2/naming"
+ "v.io/core/veyron2/options"
"v.io/core/veyron2/security"
"v.io/core/veyron2/verror"
"v.io/core/veyron2/vlog"
@@ -225,6 +226,10 @@
if protocols, ok := ctx.Value(protocolsKey).([]string); ok {
otherOpts = append(otherOpts, iipc.PreferredServerResolveProtocols(protocols))
}
+
+ if !hasServerBlessingsOpt(opts) && principal != nil {
+ otherOpts = append(otherOpts, options.ServerBlessings{principal.BlessingStore().Default()})
+ }
server, err := iipc.InternalNewServer(ctx, sm, ns, r.GetClient(ctx), otherOpts...)
if err != nil {
return nil, err
@@ -241,6 +246,15 @@
return server, nil
}
+func hasServerBlessingsOpt(opts []ipc.ServerOpt) bool {
+ for _, o := range opts {
+ if _, ok := o.(options.ServerBlessings); ok {
+ return true
+ }
+ }
+ return false
+}
+
func newStreamManager() (stream.Manager, error) {
rid, err := naming.NewRoutingID()
if err != nil {