From e2f5e985f4a8a20eb89db4384e0ab40b23ec0397 Mon Sep 17 00:00:00 2001
From: "Richard T. Carback III" <rick.carback@gmail.com>
Date: Fri, 27 Aug 2021 19:30:16 +0000
Subject: [PATCH] Add event reports for auth requests/confirm/etc

---
 api/utilsInterfaces_test.go   |  6 ++++
 auth/callback.go              | 53 +++++++++++++++++++++++++++--------
 auth/confirm.go               | 11 ++++++--
 auth/request.go               |  5 +++-
 groupChat/utils_test.go       |  7 +++++
 interfaces/networkManager.go  |  1 +
 keyExchange/utils_test.go     | 10 +++++++
 network/ephemeral/testutil.go |  7 +++++
 network/manager.go            |  5 ++++
 single/manager_test.go        |  7 +++++
 ud/register.go                |  3 +-
 11 files changed, 99 insertions(+), 16 deletions(-)

diff --git a/api/utilsInterfaces_test.go b/api/utilsInterfaces_test.go
index ad97286b7..566dd9a26 100644
--- a/api/utilsInterfaces_test.go
+++ b/api/utilsInterfaces_test.go
@@ -82,6 +82,12 @@ type testNetworkManagerGeneric struct {
 	instance *network.Instance
 	sender   *gateway.Sender
 }
+type dummyEventMgr struct{}
+
+func (d *dummyEventMgr) Report(p int, a, b, c string) {}
+func (t *testNetworkManagerGeneric) GetEventManager() interfaces.EventManager {
+	return &dummyEventMgr{}
+}
 
 /* Below methods built for interface adherence */
 func (t *testNetworkManagerGeneric) GetHealthTracker() interfaces.HealthTracker {
diff --git a/auth/callback.go b/auth/callback.go
index b713ce5ab..4a5fba05b 100644
--- a/auth/callback.go
+++ b/auth/callback.go
@@ -8,6 +8,7 @@
 package auth
 
 import (
+	"fmt"
 	"github.com/pkg/errors"
 	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/client/interfaces"
@@ -128,8 +129,11 @@ func (m *Manager) handleRequest(cmixMsg format.Message,
 		return
 	}
 
-	jww.INFO.Printf("Received AuthRequest from %s,"+
+	events := m.net.GetEventManager()
+	em := fmt.Sprintf("Received AuthRequest from %s,"+
 		" msgDigest: %s", partnerID, cmixMsg.Digest())
+	jww.INFO.Print(em)
+	events.Report(1, "Auth", "RequestReceived", em)
 
 	/*do state edge checks*/
 	// check if a relationship already exists.
@@ -137,8 +141,10 @@ func (m *Manager) handleRequest(cmixMsg format.Message,
 	// confirmation in case there are state issues.
 	// do not store
 	if _, err := m.storage.E2e().GetPartner(partnerID); err == nil {
-		jww.WARN.Printf("Received Auth request for %s, "+
+		em := fmt.Sprintf("Received Auth request for %s, "+
 			"channel already exists. Ignoring", partnerID)
+		jww.WARN.Print(em)
+		events.Report(5, "Auth", "RequestIgnored", em)
 		//exit
 		return
 	} else {
@@ -146,17 +152,21 @@ func (m *Manager) handleRequest(cmixMsg format.Message,
 		rType, sr2, _, err := m.storage.Auth().GetRequest(partnerID)
 		if err != nil && !strings.Contains(err.Error(), auth.NoRequest) {
 			// if another error is received, print it and exit
-			jww.WARN.Printf("Received new Auth request for %s, "+
+			em := fmt.Sprintf("Received new Auth request for %s, "+
 				"internal lookup produced bad result: %+v",
 				partnerID, err)
+			jww.ERROR.Print(em)
+			events.Report(10, "Auth", "RequestError", em)
 			return
 		} else {
 			//handle the events where the relationship already exists
 			switch rType {
 			// if this is a duplicate, ignore the message
 			case auth.Receive:
-				jww.WARN.Printf("Received new Auth request for %s, "+
+				em := fmt.Sprintf("Received new Auth request for %s, "+
 					"is a duplicate", partnerID)
+				jww.WARN.Print(em)
+				events.Report(5, "Auth", "DuplicateRequest", em)
 				return
 			// if we sent a request, then automatically confirm
 			// then exit, nothing else needed
@@ -167,8 +177,11 @@ func (m *Manager) handleRequest(cmixMsg format.Message,
 				// do the confirmation
 				if err := m.doConfirm(sr2, grp, partnerPubKey, m.storage.E2e().GetDHPrivateKey(),
 					sr2.GetPartnerHistoricalPubKey(), ecrFmt.GetOwnership()); err != nil {
-					jww.WARN.Printf("Auto Confirmation with %s failed: %s",
+					em := fmt.Sprintf("Auto Confirmation with %s failed: %s",
 						partnerID, err)
+					jww.WARN.Print(em)
+					events.Report(10, "Auth",
+						"RequestError", em)
 				}
 				//exit
 				return
@@ -180,8 +193,10 @@ func (m *Manager) handleRequest(cmixMsg format.Message,
 	facts, msg, err := fact.UnstringifyFactList(
 		string(requestFmt.msgPayload))
 	if err != nil {
-		jww.WARN.Printf("failed to parse facts and message "+
+		em := fmt.Sprintf("failed to parse facts and message "+
 			"from Auth Request: %s", err)
+		jww.WARN.Print(em)
+		events.Report(10, "Auth", "RequestError", em)
 		return
 	}
 
@@ -197,8 +212,10 @@ func (m *Manager) handleRequest(cmixMsg format.Message,
 	// crash occurs after the store but before the conclusion of the callback
 	//create the auth storage
 	if err = m.storage.Auth().AddReceived(c); err != nil {
-		jww.WARN.Printf("failed to store contact Auth "+
+		em := fmt.Sprintf("failed to store contact Auth "+
 			"Request: %s", err)
+		jww.WARN.Print(em)
+		events.Report(10, "Auth", "RequestError", em)
 		return
 	}
 
@@ -214,10 +231,14 @@ func (m *Manager) handleRequest(cmixMsg format.Message,
 
 func (m *Manager) handleConfirm(cmixMsg format.Message, sr *auth.SentRequest,
 	grp *cyclic.Group) {
+	events := m.net.GetEventManager()
+
 	// check if relationship already exists
 	if mgr, err := m.storage.E2e().GetPartner(sr.GetPartner()); mgr != nil || err == nil {
-		jww.WARN.Printf("Cannot confirm auth for %s, channel already "+
+		em := fmt.Sprintf("Cannot confirm auth for %s, channel already "+
 			"exists.", sr.GetPartner())
+		jww.WARN.Print(em)
+		events.Report(10, "Auth", "ConfirmError", em)
 		m.storage.Auth().Done(sr.GetPartner())
 		return
 	}
@@ -225,7 +246,9 @@ func (m *Manager) handleConfirm(cmixMsg format.Message, sr *auth.SentRequest,
 	// extract the message
 	baseFmt, partnerPubKey, err := handleBaseFormat(cmixMsg, grp)
 	if err != nil {
-		jww.WARN.Printf("Failed to handle auth confirm: %s", err)
+		em := fmt.Sprintf("Failed to handle auth confirm: %s", err)
+		jww.WARN.Print(em)
+		events.Report(10, "Auth", "ConfirmError", em)
 		m.storage.Auth().Done(sr.GetPartner())
 		return
 	}
@@ -242,16 +265,20 @@ func (m *Manager) handleConfirm(cmixMsg format.Message, sr *auth.SentRequest,
 		cmixMsg.GetMac(), grp)
 
 	if !success {
-		jww.WARN.Printf("Received auth confirmation failed its mac " +
+		em := fmt.Sprintf("Received auth confirmation failed its mac " +
 			"check")
+		jww.WARN.Print(em)
+		events.Report(10, "Auth", "ConfirmError", em)
 		m.storage.Auth().Done(sr.GetPartner())
 		return
 	}
 
 	ecrFmt, err := unmarshalEcrFormat(payload)
 	if err != nil {
-		jww.WARN.Printf("Failed to unmarshal auth confirmation's "+
+		em := fmt.Sprintf("Failed to unmarshal auth confirmation's "+
 			"encrypted payload: %s", err)
+		jww.WARN.Print(em)
+		events.Report(10, "Auth", "ConfirmError", em)
 		m.storage.Auth().Done(sr.GetPartner())
 		return
 	}
@@ -259,7 +286,9 @@ func (m *Manager) handleConfirm(cmixMsg format.Message, sr *auth.SentRequest,
 	// finalize the confirmation
 	if err := m.doConfirm(sr, grp, partnerPubKey, sr.GetMyPrivKey(),
 		sr.GetPartnerHistoricalPubKey(), ecrFmt.GetOwnership()); err != nil {
-		jww.WARN.Printf("Confirmation failed: %s", err)
+		em := fmt.Sprintf("Confirmation failed: %s", err)
+		jww.WARN.Print(em)
+		events.Report(10, "Auth", "ConfirmError", em)
 		m.storage.Auth().Done(sr.GetPartner())
 		return
 	}
diff --git a/auth/confirm.go b/auth/confirm.go
index 30a51181c..f13d3871d 100644
--- a/auth/confirm.go
+++ b/auth/confirm.go
@@ -8,6 +8,7 @@
 package auth
 
 import (
+	"fmt"
 	"github.com/pkg/errors"
 	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/client/interfaces"
@@ -100,13 +101,17 @@ func ConfirmRequestAuth(partner contact.Contact, rng io.Reader,
 	// the second does not or the two occur and the storage into critical
 	// messages does not occur
 
+	events := net.GetEventManager()
+
 	//create local relationship
 	p := storage.E2e().GetE2ESessionParams()
 	if err := storage.E2e().AddPartner(partner.ID, partner.DhPubKey, newPrivKey,
 		p, p); err != nil {
-		jww.WARN.Printf("Failed to create channel with partner (%s) "+
+		em := fmt.Sprintf("Failed to create channel with partner (%s) "+
 			"on confirmation, this is likley a replay: %s",
 			partner.ID, err.Error())
+		jww.WARN.Print(em)
+		events.Report(10, "Auth", "SendConfirmError", em)
 	}
 
 	// delete the in progress negotiation
@@ -131,8 +136,10 @@ func ConfirmRequestAuth(partner contact.Contact, rng io.Reader,
 		return 0, errors.WithMessage(err, "Auth Confirm Failed to transmit")
 	}
 
-	jww.INFO.Printf("Confirm Request with %s (msgDigest: %s) sent on round %d",
+	em := fmt.Sprintf("Confirm Request with %s (msgDigest: %s) sent on round %d",
 		partner.ID, cmixMsg.Digest(), round)
+	jww.INFO.Print(em)
+	events.Report(1, "Auth", "SendConfirm", em)
 
 	return round, nil
 }
diff --git a/auth/request.go b/auth/request.go
index add36835b..1be240891 100644
--- a/auth/request.go
+++ b/auth/request.go
@@ -8,6 +8,7 @@
 package auth
 
 import (
+	"fmt"
 	"github.com/pkg/errors"
 	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/client/interfaces"
@@ -169,8 +170,10 @@ func RequestAuth(partner, me contact.Contact, message string, rng io.Reader,
 			cmixMsg.Digest(), err)
 	}
 
-	jww.INFO.Printf("Auth Request with %s (msgDigest: %s) sent"+
+	em := fmt.Sprintf("Auth Request with %s (msgDigest: %s) sent"+
 		" on round %d", partner.ID, cmixMsg.Digest(), round)
+	jww.INFO.Print(em)
+	net.GetEventManager().Report(1, "Auth", "RequestSent", em)
 
 	return round, nil
 }
diff --git a/groupChat/utils_test.go b/groupChat/utils_test.go
index bdf58edfa..f4b5d7e18 100644
--- a/groupChat/utils_test.go
+++ b/groupChat/utils_test.go
@@ -277,6 +277,13 @@ func (tnm *testNetworkManager) SendManyCMIX(messages map[id.ID]format.Message, _
 	return 0, nil, nil
 }
 
+type dummyEventMgr struct{}
+
+func (d *dummyEventMgr) Report(p int, a, b, c string) {}
+func (t *testNetworkManager) GetEventManager() interfaces.EventManager {
+	return &dummyEventMgr{}
+}
+
 func (tnm *testNetworkManager) GetInstance() *network.Instance             { return tnm.instance }
 func (tnm *testNetworkManager) GetHealthTracker() interfaces.HealthTracker { return nil }
 func (tnm *testNetworkManager) Follow(interfaces.ClientErrorReport) (stoppable.Stoppable, error) {
diff --git a/interfaces/networkManager.go b/interfaces/networkManager.go
index c3bc9f49d..e518ae014 100644
--- a/interfaces/networkManager.go
+++ b/interfaces/networkManager.go
@@ -27,6 +27,7 @@ type NetworkManager interface {
 	SendManyCMIX(messages map[id.ID]format.Message, p params.CMIX) (id.Round, []ephemeral.Id, error)
 	GetInstance() *network.Instance
 	GetHealthTracker() HealthTracker
+	GetEventManager() EventManager
 	GetSender() *gateway.Sender
 	Follow(report ClientErrorReport) (stoppable.Stoppable, error)
 	CheckGarbledMessages()
diff --git a/keyExchange/utils_test.go b/keyExchange/utils_test.go
index cb0518466..f15112279 100644
--- a/keyExchange/utils_test.go
+++ b/keyExchange/utils_test.go
@@ -93,6 +93,10 @@ func (t *testNetworkManagerGeneric) GetInstance() *network.Instance {
 
 }
 
+func (t *testNetworkManagerGeneric) GetEventManager() interfaces.EventManager {
+	return &dummyEventMgr{}
+}
+
 func (t *testNetworkManagerGeneric) RegisterWithPermissioning(string) ([]byte, error) {
 	return nil, nil
 }
@@ -153,6 +157,12 @@ func InitTestingContextGeneric(i interface{}) (*storage.Session, interfaces.Netw
 type testNetworkManagerFullExchange struct {
 	instance *network.Instance
 }
+type dummyEventMgr struct{}
+
+func (d *dummyEventMgr) Report(p int, a, b, c string) {}
+func (t *testNetworkManagerFullExchange) GetEventManager() interfaces.EventManager {
+	return &dummyEventMgr{}
+}
 
 func (t *testNetworkManagerFullExchange) GetHealthTracker() interfaces.HealthTracker {
 	return nil
diff --git a/network/ephemeral/testutil.go b/network/ephemeral/testutil.go
index 3b443dfe3..fb20cf8bd 100644
--- a/network/ephemeral/testutil.go
+++ b/network/ephemeral/testutil.go
@@ -70,6 +70,13 @@ func (t *testNetworkManager) GetInstance() *network.Instance {
 	return t.instance
 }
 
+type dummyEventMgr struct{}
+
+func (d *dummyEventMgr) Report(p int, a, b, c string) {}
+func (t *testNetworkManager) GetEventManager() interfaces.EventManager {
+	return &dummyEventMgr{}
+}
+
 func (t *testNetworkManager) GetHealthTracker() interfaces.HealthTracker {
 	return nil
 }
diff --git a/network/manager.go b/network/manager.go
index 55e8b4a4b..3ebc1d1d9 100644
--- a/network/manager.go
+++ b/network/manager.go
@@ -166,6 +166,11 @@ func (m *manager) Follow(report interfaces.ClientErrorReport) (stoppable.Stoppab
 	return multi, nil
 }
 
+// GetEventManager returns the health tracker
+func (m *manager) GetEventManager() interfaces.EventManager {
+	return m.events
+}
+
 // GetHealthTracker returns the health tracker
 func (m *manager) GetHealthTracker() interfaces.HealthTracker {
 	return m.Health
diff --git a/single/manager_test.go b/single/manager_test.go
index 1a62edf84..0746e0f7f 100644
--- a/single/manager_test.go
+++ b/single/manager_test.go
@@ -327,6 +327,13 @@ func (tnm *testNetworkManager) GetInstance() *network.Instance {
 	return tnm.instance
 }
 
+type dummyEventMgr struct{}
+
+func (d *dummyEventMgr) Report(p int, a, b, c string) {}
+func (t *testNetworkManager) GetEventManager() interfaces.EventManager {
+	return &dummyEventMgr{}
+}
+
 func (tnm *testNetworkManager) GetHealthTracker() interfaces.HealthTracker {
 	return nil
 }
diff --git a/ud/register.go b/ud/register.go
index 4fe9e2d67..8a25bafc0 100644
--- a/ud/register.go
+++ b/ud/register.go
@@ -88,7 +88,8 @@ func (m *Manager) register(username string, comm registerUserComms) error {
 		err = m.setRegistered()
 		if m.client != nil {
 			m.client.ReportEvent(1, "UserDiscovery", "Registration",
-				fmt.Sprintf("User Registered with UD: %s", user))
+				fmt.Sprintf("User Registered with UD: %+v",
+					user))
 		}
 	}
 
-- 
GitLab