From 57bb2d4056e9e426b53b40ed07d7f695326980bd Mon Sep 17 00:00:00 2001
From: "Richard T. Carback III" <rick.carback@gmail.com>
Date: Tue, 5 Apr 2022 20:00:11 +0000
Subject: [PATCH] Fix rare edge case on failed confirmation sends

---
 auth/callback.go |  2 +-
 auth/confirm.go  | 18 ++++++++++++++++++
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/auth/callback.go b/auth/callback.go
index 70b9c2843..6da4fd2fb 100644
--- a/auth/callback.go
+++ b/auth/callback.go
@@ -348,7 +348,7 @@ func (m *Manager) handleRequest(cmixMsg format.Message,
 	var rndNum id.Round
 	if autoConfirm || resetSession {
 		// Call ConfirmRequestAuth to send confirmation
-		rndNum, err = m.ConfirmRequestAuth(c)
+		rndNum, err = m.confirmRequestAuth(c, true)
 		if err != nil {
 			jww.ERROR.Printf("Could not ConfirmRequestAuth: %+v",
 				err)
diff --git a/auth/confirm.go b/auth/confirm.go
index 28a5292ae..40ddc527d 100644
--- a/auth/confirm.go
+++ b/auth/confirm.go
@@ -32,6 +32,11 @@ func (m *Manager) ConfirmRequestAuth(partner contact.Contact) (id.Round, error)
 		return 0, errors.New("Cannot confirm authenticated message " +
 			"when the network is not healthy")
 	}
+	return m.confirmRequestAuth(partner, false)
+}
+
+func (m *Manager) confirmRequestAuth(partner contact.Contact, critical bool) (id.Round,
+	error) {
 
 	// Cannot confirm already established channels
 	if _, err := m.storage.E2e().GetPartner(partner.ID); err == nil {
@@ -156,15 +161,28 @@ func (m *Manager) ConfirmRequestAuth(partner contact.Contact) (id.Round, error)
 	param.IdentityPreimage = preimg
 	param.DebugTag = "auth.Confirm"
 	/*send message*/
+	if critical {
+		m.storage.GetCriticalRawMessages().AddProcessing(cmixMsg,
+			partner.ID)
+	}
 	round, _, err := m.net.SendCMIX(cmixMsg, partner.ID, param)
 	if err != nil {
 		// if the send fails just set it to failed, it will but automatically
 		// retried
 		jww.INFO.Printf("Auth Confirm with %s (msgDigest: %s) failed "+
 			"to transmit: %+v", partner.ID, cmixMsg.Digest(), err)
+		if critical {
+			m.storage.GetCriticalRawMessages().Failed(cmixMsg,
+				partner.ID)
+		}
 		return 0, errors.WithMessage(err, "Auth Confirm Failed to transmit")
 	}
 
+	if critical {
+		m.storage.GetCriticalRawMessages().Succeeded(cmixMsg,
+			partner.ID)
+	}
+
 	em := fmt.Sprintf("Confirm Request with %s (msgDigest: %s) sent on round %d",
 		partner.ID, cmixMsg.Digest(), round)
 	jww.INFO.Print(em)
-- 
GitLab