m/n/c/cluster: sanitize ClusterDirectory

This change enforces the suggested ClusterDirectory usage described in
metropolis/proto/common/common.proto.

See also: https://review.monogon.dev/c/monogon/+/662

Change-Id: If00edcc078b6dccc80990fc95e9a1c87d945d74e
Reviewed-on: https://review.monogon.dev/c/monogon/+/669
Reviewed-by: Sergiusz Bazanski <serge@monogon.tech>
diff --git a/metropolis/node/core/cluster/cluster.go b/metropolis/node/core/cluster/cluster.go
index 1de24f3..4df489d 100644
--- a/metropolis/node/core/cluster/cluster.go
+++ b/metropolis/node/core/cluster/cluster.go
@@ -42,7 +42,6 @@
 
 	"source.monogon.dev/metropolis/node"
 	"source.monogon.dev/metropolis/node/core/consensus"
-	"source.monogon.dev/metropolis/node/core/identity"
 	"source.monogon.dev/metropolis/node/core/localstorage"
 	"source.monogon.dev/metropolis/node/core/network"
 	"source.monogon.dev/metropolis/node/core/roleserve"
@@ -257,12 +256,11 @@
 // logClusterDirectory verbosely logs the whole Cluster Directory passed to it.
 func logClusterDirectory(ctx context.Context, cd *cpb.ClusterDirectory) {
 	for _, node := range cd.Nodes {
-		id := identity.NodeID(node.PublicKey)
 		var addresses []string
 		for _, add := range node.Addresses {
 			addresses = append(addresses, add.Host)
 		}
-		supervisor.Logger(ctx).Infof("    Node ID: %s, Addresses: %s", id, strings.Join(addresses, ","))
+		supervisor.Logger(ctx).Infof("    Addresses: %s", strings.Join(addresses, ","))
 	}
 }
 
diff --git a/metropolis/node/core/cluster/cluster_register.go b/metropolis/node/core/cluster/cluster_register.go
index c348c32..f2ccbff 100644
--- a/metropolis/node/core/cluster/cluster_register.go
+++ b/metropolis/node/core/cluster/cluster_register.go
@@ -59,6 +59,14 @@
 		}
 	}
 
+	// Strip the initial ClusterDirectory of any node public keys that might have
+	// been included, as it can't be relied on beyond providing cluster endpoint
+	// addresses, considering its untrusted origin (ESP). This explicitly enforces
+	// suggested usage described in ClusterDirectory's protofile.
+	for i, _ := range register.ClusterDirectory.Nodes {
+		register.ClusterDirectory.Nodes[i].PublicKey = nil
+	}
+
 	// Validation passed, let's take the state lock and start working on registering
 	// us into the cluster.