profiles/internal/rpc: Make it an error if the principal is nil in
SecurityConfidential.

Change-Id: Iaeb6223dc2edfc7cb3711389d838eac44546e7f1
diff --git a/profiles/internal/rpc/client.go b/profiles/internal/rpc/client.go
index 458040f..26b7244 100644
--- a/profiles/internal/rpc/client.go
+++ b/profiles/internal/rpc/client.go
@@ -80,6 +80,8 @@
 	errBlessingGrant = verror.Register(pkgPath+".blessingGrantFailed", verror.NoRetry, "failed to grant blessing to server with blessings {3}{:4}")
 
 	errBlessingAdd = verror.Register(pkgPath+".blessingAddFailed", verror.NoRetry, "failed to add blessing granted to server {3}{:4}")
+
+	errNoPrincipal = verror.Register(pkgPath+".noPrincipal", verror.NoRetry, "principal required for secure connections")
 )
 
 type client struct {
@@ -410,7 +412,9 @@
 	//     on here.
 	var principal security.Principal
 	if callEncrypted(opts) {
-		principal = v23.GetPrincipal(ctx)
+		if principal = v23.GetPrincipal(ctx); principal == nil {
+			return nil, verror.NoRetry, verror.New(errNoPrincipal, ctx)
+		}
 	}
 
 	// servers is now ordered by the priority heurestic implemented in
diff --git a/profiles/internal/rpc/full_test.go b/profiles/internal/rpc/full_test.go
index 3ff09b7..8f0383c 100644
--- a/profiles/internal/rpc/full_test.go
+++ b/profiles/internal/rpc/full_test.go
@@ -1642,6 +1642,39 @@
 	}
 }
 
+func TestNoPrincipal(t *testing.T) {
+	ctx, shutdown := initForTest()
+	defer shutdown()
+	sm := imanager.InternalNew(naming.FixedRoutingID(0x66666666))
+	defer sm.Shutdown()
+	ns := tnaming.NewSimpleNamespace()
+	server, err := testInternalNewServer(ctx, sm, ns, testutil.NewPrincipal("server"))
+	if err != nil {
+		t.Fatalf("InternalNewServer failed: %v", err)
+	}
+	if _, err = server.Listen(listenSpec); err != nil {
+		t.Fatalf("server.Listen failed: %v", err)
+	}
+	disp := &testServerDisp{&testServer{}}
+	if err := server.ServeDispatcher("mp/server", disp); err != nil {
+		t.Fatalf("server.Serve failed: %v", err)
+	}
+	client, err := InternalNewClient(sm, ns)
+	if err != nil {
+		t.Fatalf("InternalNewClient failed: %v", err)
+	}
+
+	// A call should fail if the principal in the ctx is nil and SecurityNone is not specified.
+	ctx, err = v23.SetPrincipal(ctx, nil)
+	if err != nil {
+		t.Fatalf("failed to set principal: %v", err)
+	}
+	_, err = client.StartCall(ctx, "mp/server", "Echo", []interface{}{"foo"})
+	if err == nil || verror.ErrorID(err) != errNoPrincipal.ID {
+		t.Fatalf("Expected errNoPrincipal, got %v", err)
+	}
+}
+
 func TestCallWithNilContext(t *testing.T) {
 	sm := imanager.InternalNew(naming.FixedRoutingID(0x66666666))
 	defer sm.Shutdown()
@@ -1655,7 +1688,7 @@
 		t.Errorf("Expected nil interface got: %#v", call)
 	}
 	if verror.ErrorID(err) != verror.ErrBadArg.ID {
-		t.Errorf("Expected an BadArg error, got: %s", err.Error())
+		t.Errorf("Expected a BadArg error, got: %s", err.Error())
 	}
 }