From d2c4b66d4cb94cb2195c208ec8f12bb30456e627 Mon Sep 17 00:00:00 2001
From: relesgoe <RElesgoe@users.noreply.github.com>
Date: Fri, 22 May 2020 02:02:02 -0700
Subject: [PATCH] Fix bug where sent emails were empty.

---
 src/bnetd/smtp.cpp | 43 ++++++++++++++-----------------------------
 1 file changed, 14 insertions(+), 29 deletions(-)

diff --git a/src/bnetd/smtp.cpp b/src/bnetd/smtp.cpp
index 6066799..5ab5eae 100644
--- a/src/bnetd/smtp.cpp
+++ b/src/bnetd/smtp.cpp
@@ -42,34 +42,21 @@ namespace pvpgn
 		static std::string smtp_username;
 		static std::string smtp_password;
 
-		static int debug_callback(CURL* handle, curl_infotype type, char* data, size_t size, void* userptr)
+		typedef struct
 		{
-			char* info = (char*)std::malloc(size + 1);
-			info[size] = '\0';
-			std::memcpy(info, data, size);
-			
-
-			eventlog(eventlog_level_debug, __FUNCTION__, "DEBUG: {}", info);
-
-			return 0;
-		}
+			std::string message;
+			std::size_t bytes_remaining;
+		} read_callback_message;
 
 		static std::size_t read_callback(char* buffer, std::size_t size, std::size_t nitems, void* message)
 		{
+			read_callback_message* rcbmessage = reinterpret_cast<read_callback_message*>(message);
 			std::size_t buffer_size = size * nitems;
-			std::size_t message_size = std::strlen(reinterpret_cast<const char*>(message)) + 1;
+			std::size_t copy_size = rcbmessage->bytes_remaining <= buffer_size ? rcbmessage->bytes_remaining : buffer_size;
 
-			if (message_size <= buffer_size)
-			{
-				std::memcpy(buffer, message, message_size);
-				eventlog(eventlog_level_trace, __FUNCTION__, "buffer: {}", buffer);
-				return 0;
-			}
-			else
-			{
-				std::memcpy(buffer, message, buffer_size);
-				return buffer_size;
-			}
+			std::memcpy(buffer, rcbmessage->message.c_str(), copy_size);
+			rcbmessage->bytes_remaining -= copy_size;
+			return copy_size;
 		}
 
 		/**
@@ -153,16 +140,14 @@ namespace pvpgn
 
 			curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
 
-			// \r\nContent-Type: text/plain; charset=\"UTF-8\"
-			message.insert(0, fmt::format("Date: {:%a, %d %b %Y %T %z}\r\nFrom: <{}>\r\nTo: <{}>\r\nSubject: {}\r\n\r\n", *std::localtime(&now), from_address, to_address, subject));
-			message.append("\r\n.\r\n");
-			curl_easy_setopt(curl, CURLOPT_READDATA, reinterpret_cast<void *>(const_cast<char*>(message.c_str())));
+			message.insert(0, fmt::format("MIME-Version: 1.0\r\nContent-Type: text/plain; charset=\"UTF-8\"\r\nDate: {:%a, %d %b %Y %T %z}\r\nFrom: <{}>\r\nTo: <{}>\r\nSubject: {}\r\n\r\n", *std::localtime(&now), from_address, to_address, subject));
+			read_callback_message rcbmessage = {};
+			rcbmessage.message = message;
+			rcbmessage.bytes_remaining = message.length() + 1;
+			curl_easy_setopt(curl, CURLOPT_READDATA, reinterpret_cast<void *>(&rcbmessage));
 
 			curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
 
-			curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
-			curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, debug_callback);
-
 			CURLcode result = curl_easy_perform(curl);
 			if (result != CURLE_OK)
 			{