From 8a41ef3e83c3331319c5b69ed99bc1ff65b47b44 Mon Sep 17 00:00:00 2001
From: Jake Taylor <jake@elixxir.io>
Date: Fri, 10 Sep 2021 13:38:09 -0500
Subject: [PATCH] reeeeeee

---
 network/manager.go                   |  2 +-
 network/message/garbled_test.go      |  4 ++--
 network/message/manager.go           | 19 ++++++++++++----
 network/message/sendCmix.go          | 33 ++++++++++++++--------------
 network/message/sendCmix_test.go     |  6 ++---
 network/message/sendManyCmix_test.go |  4 ++--
 network/send.go                      |  2 +-
 7 files changed, 40 insertions(+), 30 deletions(-)

diff --git a/network/manager.go b/network/manager.go
index f15199a41..e26c455b3 100644
--- a/network/manager.go
+++ b/network/manager.go
@@ -119,7 +119,7 @@ func NewManager(session *storage.Session, switchboard *switchboard.Switchboard,
 	})
 
 	//create sub managers
-	m.message = message.NewManager(m.Internal, m.param.Messages, m.NodeRegistration, m.sender)
+	m.message = message.NewManager(m.Internal, m.param, m.NodeRegistration, m.sender)
 	m.round = rounds.NewManager(m.Internal, m.param.Rounds, m.message.GetMessageReceptionChannel(), m.sender)
 
 	return &m, nil
diff --git a/network/message/garbled_test.go b/network/message/garbled_test.go
index d254c56c4..b651c02e0 100644
--- a/network/message/garbled_test.go
+++ b/network/message/garbled_test.go
@@ -65,12 +65,12 @@ func TestManager_CheckGarbledMessages(t *testing.T) {
 	if err != nil {
 		t.Errorf(err.Error())
 	}
-	m := NewManager(i, params.Messages{
+	m := NewManager(i, params.Network{Messages: params.Messages{
 		MessageReceptionBuffLen:        20,
 		MessageReceptionWorkerPoolSize: 20,
 		MaxChecksGarbledMessage:        20,
 		GarbledMessageWait:             time.Hour,
-	}, nil, sender)
+	}}, nil, sender)
 
 	e2ekv := i.Session.E2e()
 	err = e2ekv.AddPartner(sess2.GetUser().TransmissionID, sess2.E2e().GetDHPublicKey(), e2ekv.GetDHPrivateKey(),
diff --git a/network/message/manager.go b/network/message/manager.go
index d5bf21a10..0ac5eeceb 100644
--- a/network/message/manager.go
+++ b/network/message/manager.go
@@ -8,7 +8,9 @@
 package message
 
 import (
+	"encoding/base64"
 	"fmt"
+	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/client/interfaces/params"
 	"gitlab.com/elixxir/client/network/gateway"
 	"gitlab.com/elixxir/client/network/internal"
@@ -19,10 +21,11 @@ import (
 )
 
 type Manager struct {
-	param       params.Messages
+	param       params.Network
 	partitioner parse.Partitioner
 	internal.Internal
-	sender *gateway.Sender
+	sender           *gateway.Sender
+	blacklistedNodes map[string]interface{}
 
 	messageReception chan Bundle
 	nodeRegistration chan network.NodeGateway
@@ -30,7 +33,7 @@ type Manager struct {
 	triggerGarbled   chan struct{}
 }
 
-func NewManager(internal internal.Internal, param params.Messages,
+func NewManager(internal internal.Internal, param params.Network,
 	nodeRegistration chan network.NodeGateway, sender *gateway.Sender) *Manager {
 	dummyMessage := format.NewMessage(internal.Session.Cmix().GetGroup().GetP().ByteLen())
 	m := Manager{
@@ -41,8 +44,16 @@ func NewManager(internal internal.Internal, param params.Messages,
 		triggerGarbled:   make(chan struct{}, 100),
 		nodeRegistration: nodeRegistration,
 		sender:           sender,
+		Internal:         internal,
+	}
+	for _, nodeId := range param.BlacklistedNodes {
+		decodedId, err := base64.StdEncoding.DecodeString(nodeId)
+		if err != nil {
+			jww.ERROR.Printf("Unable to decode blacklisted Node ID %s: %+v", decodedId, err)
+			continue
+		}
+		m.blacklistedNodes[string(decodedId)] = nil
 	}
-	m.Internal = internal
 	return &m
 }
 
diff --git a/network/message/sendCmix.go b/network/message/sendCmix.go
index fce7ac573..2028e4356 100644
--- a/network/message/sendCmix.go
+++ b/network/message/sendCmix.go
@@ -8,7 +8,6 @@
 package message
 
 import (
-	"bytes"
 	"fmt"
 	"github.com/golang-collections/collections/set"
 	"github.com/pkg/errors"
@@ -32,11 +31,11 @@ import (
 // WARNING: Potentially Unsafe
 // Public manager function to send a message over CMIX
 func (m *Manager) SendCMIX(sender *gateway.Sender, msg format.Message,
-	recipient *id.ID, cmixParams params.CMIX, networkParams params.Network,
+	recipient *id.ID, cmixParams params.CMIX,
 	stop *stoppable.Single) (id.Round, ephemeral.Id, error) {
 
 	msgCopy := msg.Copy()
-	return sendCmixHelper(sender, msgCopy, recipient, cmixParams, networkParams, m.Instance,
+	return sendCmixHelper(sender, msgCopy, recipient, cmixParams, m.blacklistedNodes, m.Instance,
 		m.Session, m.nodeRegistration, m.Rng, m.Internal.Events,
 		m.TransmissionID, m.Comms, stop)
 }
@@ -51,7 +50,7 @@ func (m *Manager) SendCMIX(sender *gateway.Sender, msg format.Message,
 // which can be registered with the network instance to get a callback on
 // its status
 func sendCmixHelper(sender *gateway.Sender, msg format.Message,
-	recipient *id.ID, cmixParams params.CMIX, networkParams params.Network, instance *network.Instance,
+	recipient *id.ID, cmixParams params.CMIX, blacklistedNodes map[string]interface{}, instance *network.Instance,
 	session *storage.Session, nodeRegistration chan network.NodeGateway,
 	rng *fastRNG.StreamGenerator, events interfaces.EventManager,
 	senderId *id.ID, comms sendCmixCommsInterface,
@@ -84,27 +83,27 @@ func sendCmixHelper(sender *gateway.Sender, msg format.Message,
 		if err != nil {
 			jww.WARN.Printf("Failed to GetUpcomingRealtime (msgDigest: %s): %+v", msg.Digest(), err)
 		}
+		if bestRound == nil {
+			continue
+		}
+
+		//add the round on to the list of attempted, so it is not tried again
+		attempted.Insert(bestRound)
 
+		// Determine whether the selected round contains any Nodes
+		// that are blacklisted by the params.Network object
 		containsBlacklisted := false
-		for _, blacklistedNodeId := range networkParams.BlacklistedNodes {
-			if containsBlacklisted {
+		for _, nodeId := range bestRound.Topology {
+			if _, isBlacklisted := blacklistedNodes[string(nodeId)]; isBlacklisted {
+				containsBlacklisted = true
 				break
 			}
-			for _, nodeId := range bestRound.Topology {
-				// TODO: Figure out encoding
-				if bytes.Equal(nodeId, []byte(blacklistedNodeId)) {
-					containsBlacklisted = true
-					break
-				}
-			}
 		}
-		if bestRound == nil || containsBlacklisted {
+		if containsBlacklisted {
+			jww.WARN.Printf("Round %d contains blacklisted node, skipping...", bestRound.ID)
 			continue
 		}
 
-		//add the round on to the list of attempted, so it is not tried again
-		attempted.Insert(bestRound)
-
 		// Retrieve host and key information from round
 		firstGateway, roundKeys, err := processRound(instance, session, nodeRegistration, bestRound, recipient.String(), msg.Digest())
 		if err != nil {
diff --git a/network/message/sendCmix_test.go b/network/message/sendCmix_test.go
index 29180767d..d3d7e116b 100644
--- a/network/message/sendCmix_test.go
+++ b/network/message/sendCmix_test.go
@@ -108,17 +108,17 @@ func Test_attemptSendCmix(t *testing.T) {
 		t.Errorf("%+v", errors.New(err.Error()))
 		return
 	}
-	m := NewManager(i, params.Messages{
+	m := NewManager(i, params.Network{Messages: params.Messages{
 		MessageReceptionBuffLen:        20,
 		MessageReceptionWorkerPoolSize: 20,
 		MaxChecksGarbledMessage:        20,
 		GarbledMessageWait:             time.Hour,
-	}, nil, sender)
+	}}, nil, sender)
 	msgCmix := format.NewMessage(m.Session.Cmix().GetGroup().GetP().ByteLen())
 	msgCmix.SetContents([]byte("test"))
 	e2e.SetUnencrypted(msgCmix, m.Session.User().GetCryptographicIdentity().GetTransmissionID())
 	_, _, err = sendCmixHelper(sender, msgCmix, sess2.GetUser().ReceptionID,
-		params.GetDefaultCMIX(), m.Instance, m.Session, m.nodeRegistration,
+		params.GetDefaultCMIX(), make(map[string]interface{}), m.Instance, m.Session, m.nodeRegistration,
 		m.Rng, events, m.TransmissionID, &MockSendCMIXComms{t: t}, nil)
 	if err != nil {
 		t.Errorf("Failed to sendcmix: %+v", err)
diff --git a/network/message/sendManyCmix_test.go b/network/message/sendManyCmix_test.go
index 2d07cf456..1b0da6c08 100644
--- a/network/message/sendManyCmix_test.go
+++ b/network/message/sendManyCmix_test.go
@@ -107,12 +107,12 @@ func Test_attemptSendManyCmix(t *testing.T) {
 		t.Errorf("%+v", errors.New(err.Error()))
 		return
 	}
-	m := NewManager(i, params.Messages{
+	m := NewManager(i, params.Network{Messages: params.Messages{
 		MessageReceptionBuffLen:        20,
 		MessageReceptionWorkerPoolSize: 20,
 		MaxChecksGarbledMessage:        20,
 		GarbledMessageWait:             time.Hour,
-	}, nil, sender)
+	}}, nil, sender)
 	msgCmix := format.NewMessage(m.Session.Cmix().GetGroup().GetP().ByteLen())
 	msgCmix.SetContents([]byte("test"))
 	e2e.SetUnencrypted(msgCmix, m.Session.User().GetCryptographicIdentity().GetTransmissionID())
diff --git a/network/send.go b/network/send.go
index 30e811780..8fff3ac15 100644
--- a/network/send.go
+++ b/network/send.go
@@ -30,7 +30,7 @@ func (m *manager) SendCMIX(msg format.Message, recipient *id.ID, param params.CM
 			"network is not healthy")
 	}
 
-	return m.message.SendCMIX(m.GetSender(), msg, recipient, param, m.param, nil)
+	return m.message.SendCMIX(m.GetSender(), msg, recipient, param, nil)
 }
 
 // SendManyCMIX sends many "raw" CMIX message payloads to each of the
-- 
GitLab