From 884e804430595a757ef7525fc14797f003489864 Mon Sep 17 00:00:00 2001
From: relesgoe <RElesgoe@users.noreply.github.com>
Date: Sat, 23 May 2020 16:20:40 -0700
Subject: [PATCH] Add "verify_account_email_from_name" option in bnetd.conf to
 support a name in the "From" field in emails

---
 conf/bnetd.conf.in                       |  2 ++
 src/bnetd/account_email_verification.cpp | 12 +++++++++--
 src/bnetd/prefs.cpp                      | 27 ++++++++++++++++++++++++
 src/bnetd/prefs.h                        |  1 +
 src/bnetd/smtp.cpp                       |  4 ++--
 src/bnetd/smtp.h                         |  2 +-
 6 files changed, 43 insertions(+), 5 deletions(-)

diff --git a/conf/bnetd.conf.in b/conf/bnetd.conf.in
index 3a7e8ce..d5b8e13 100644
--- a/conf/bnetd.conf.in
+++ b/conf/bnetd.conf.in
@@ -383,6 +383,8 @@ verify_account_email_expiration = 10
 # Email address to use for the 'From' field in email verification emails.
 verify_account_email_from_address = ""
 
+verify_account_email_from_name = ""
+
 #                                                                            #
 ##############################################################################
 
diff --git a/src/bnetd/account_email_verification.cpp b/src/bnetd/account_email_verification.cpp
index 15e8e4a..77e7e5b 100644
--- a/src/bnetd/account_email_verification.cpp
+++ b/src/bnetd/account_email_verification.cpp
@@ -41,8 +41,9 @@ namespace pvpgn
 
 		static std::string message;
 		static std::string verify_account_email_from_address;
+		static std::string verify_account_email_from_name;
 
-		bool account_email_verification_load(const char* filepath, const char* prefs_servername, const char* prefs_verify_account_email_from_address)
+		bool account_email_verification_load(const char* filepath, const char* prefs_servername, const char* prefs_verify_account_email_from_address, const char* prefs_verify_account_email_from_name)
 		{
 			if (filepath == nullptr)
 			{
@@ -62,6 +63,12 @@ namespace pvpgn
 				return false;
 			}
 
+			if (prefs_verify_account_email_from_name == nullptr)
+			{
+				eventlog(eventlog_level_error, __FUNCTION__, "got NULL prefs_verify_account_email_from_name");
+				return false;
+			}
+
 			std::ifstream infile{ filepath };
 			if (!infile.is_open())
 			{
@@ -83,6 +90,7 @@ namespace pvpgn
 			}
 
 			verify_account_email_from_address = prefs_verify_account_email_from_address;
+			verify_account_email_from_name = prefs_verify_account_email_from_name;
 
 			return true;
 		}
@@ -177,7 +185,7 @@ namespace pvpgn
 			std::string personalized_message = fmt::format(message, fmt::arg("account_name", account_get_name(account)), fmt::arg("account_email_verification_code", code), fmt::arg("account_email_verification_expiration", prefs_get_verify_account_email_expiration()));
 
 			eventlog(eventlog_level_debug, __FUNCTION__, "Sending email verification code to {} for account uid {}", account_get_email(account), account_get_uid(account));
-			smtp_send_email(account_get_email(account), verify_account_email_from_address, "Email Verification", personalized_message);
+			smtp_send_email(account_get_email(account), verify_account_email_from_address, verify_account_email_from_name, "Email Verification", personalized_message);
 
 			return true;
 		}
diff --git a/src/bnetd/prefs.cpp b/src/bnetd/prefs.cpp
index 5eb73a1..a0e5a62 100644
--- a/src/bnetd/prefs.cpp
+++ b/src/bnetd/prefs.cpp
@@ -160,6 +160,7 @@ namespace pvpgn
 			unsigned int verify_account_email;
 			unsigned int verify_account_email_expiration;
 			char const* verify_account_email_from_address;
+			char const * verify_account_email_from_name;
 			char const * supportfile;
 			char const * allowed_clients;
 			char const * ladder_games;
@@ -664,6 +665,10 @@ namespace pvpgn
 		static const char* conf_get_verify_account_email_from_address(void);
 		static int conf_setdef_verify_account_email_from_address(void);
 
+		static int conf_set_verify_account_email_from_name(const char* valstr);
+		static const char* conf_get_verify_account_email_from_name(void);
+		static int conf_setdef_verify_account_email_from_name(void);
+
 		static int conf_set_allowed_clients(const char *valstr);
 		static const char *conf_get_allowed_clients(void);
 		static int conf_setdef_allowed_clients(void);
@@ -898,6 +903,7 @@ namespace pvpgn
 			{ "verify_account_email", conf_set_verify_account_email, conf_get_verify_account_email, conf_setdef_verify_account_email },
 			{ "verify_account_email_expiration", conf_set_verify_account_email_expiration, conf_get_verify_account_email_expiration, conf_setdef_verify_account_email_expiration },
 			{ "verify_account_email_from_address", conf_set_verify_account_email_from_address, conf_get_verify_account_email_from_address, conf_setdef_verify_account_email_from_address },
+			{ "verify_account_email_from_name", conf_set_verify_account_email_from_name, conf_get_verify_account_email_from_name, conf_setdef_verify_account_email_from_name },
 			{ "allowed_clients", conf_set_allowed_clients, conf_get_allowed_clients, conf_setdef_allowed_clients },
 			{ "ladder_games", conf_set_ladder_games, conf_get_ladder_games, conf_setdef_ladder_games },
 			{ "max_connections", conf_set_max_connections, conf_get_max_connections, conf_setdef_max_connections },
@@ -3468,6 +3474,27 @@ namespace pvpgn
 		}
 
 
+		extern char const* prefs_get_verify_account_email_from_name(void)
+		{
+			return prefs_runtime_config.verify_account_email_from_name;
+		}
+
+		static int conf_set_verify_account_email_from_name(const char* valstr)
+		{
+			return conf_set_str(&prefs_runtime_config.verify_account_email_from_name, valstr, NULL);
+		}
+
+		static const char* conf_get_verify_account_email_from_name(void)
+		{
+			return prefs_runtime_config.verify_account_email_from_name;
+		}
+
+		static int conf_setdef_verify_account_email_from_name(void)
+		{
+			return conf_set_str(&prefs_runtime_config.verify_account_email_from_name, NULL, NULL);
+		}
+
+
 		extern char const * prefs_get_supportfile(void)
 		{
 			return prefs_runtime_config.supportfile;
diff --git a/src/bnetd/prefs.h b/src/bnetd/prefs.h
index 9fb7696..0773e3d 100644
--- a/src/bnetd/prefs.h
+++ b/src/bnetd/prefs.h
@@ -175,6 +175,7 @@ namespace pvpgn
 		extern void prefs_set_verify_account_email(bool enable);
 		extern unsigned int prefs_get_verify_account_email_expiration(void);
 		extern char const* prefs_get_verify_account_email_from_address(void);
+		extern char const* prefs_get_verify_account_email_from_name(void);
 		extern char const * prefs_get_supportfile(void);
 		extern char const * prefs_get_allowed_clients(void);
 		extern char const * prefs_get_ladder_games(void);
diff --git a/src/bnetd/smtp.cpp b/src/bnetd/smtp.cpp
index c9bddd7..faa3164 100644
--- a/src/bnetd/smtp.cpp
+++ b/src/bnetd/smtp.cpp
@@ -114,7 +114,7 @@ namespace pvpgn
 			}
 		}
 
-		void smtp_send_email(const std::string& to_address, const std::string& from_address, const std::string& subject, std::string message)
+		void smtp_send_email(const std::string& to_address, const std::string& from_address, const std::string& from_name, const std::string& subject, std::string message)
 		{
 			if (!is_curl_initialized)
 			{
@@ -153,7 +153,7 @@ namespace pvpgn
 
 			curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
 
-			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));
+			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_name, from_address, to_address, subject));
 			read_callback_message rcbmessage = {};
 			rcbmessage.message = message;
 			rcbmessage.bytes_remaining = message.length() + 1;
diff --git a/src/bnetd/smtp.h b/src/bnetd/smtp.h
index 8cad470..77b2d42 100644
--- a/src/bnetd/smtp.h
+++ b/src/bnetd/smtp.h
@@ -25,7 +25,7 @@ namespace pvpgn
 		bool smtp_init();
 		bool smtp_config(const char* prefs_smtp_ca_cert_store, const char* prefs_smtp_server_url, unsigned int prefs_smtp_port, const char* prefs_smtp_username, const char* prefs_smtp_password);
 		void smtp_cleanup();
-		void smtp_send_email(const std::string& to_address, const std::string& from_address, const std::string& subject, std::string message);
+		void smtp_send_email(const std::string& to_address, const std::string& from_address, const std::string& from_name, const std::string& subject, std::string message);
 
 	}