From 15f6d0bee66c98565144fc6f0708f7e256a66986 Mon Sep 17 00:00:00 2001
From: Rob Swindell <rob@synchro.net>
Date: Tue, 20 Dec 2022 17:52:36 -0800
Subject: [PATCH] Add MQTT TLS support

---
 src/sbbs3/scfgdefs.h | 13 +++++++++++++
 src/sbbs3/scfglib1.c | 15 +++++++++++----
 src/sbbs3/scfgsave.c |  8 ++++++++
 3 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/src/sbbs3/scfgdefs.h b/src/sbbs3/scfgdefs.h
index 686451d5cc..5893b94d32 100644
--- a/src/sbbs3/scfgdefs.h
+++ b/src/sbbs3/scfgdefs.h
@@ -374,6 +374,19 @@ struct mqtt_cfg {
 	int			subscribe_qos;
 	int			protocol_version;
 	int			log_level;
+	struct {
+		enum {
+			MQTT_TLS_DISABLED,
+			MQTT_TLS_CERT,
+			MQTT_TLS_PSK
+		} mode;
+		char	cafile[256];
+		char	certfile[256];
+		char	keyfile[256];
+		char	keypass[256];
+		char	psk[256];
+		char	identity[256];
+	} tls;
 };
 
 typedef struct 
diff --git a/src/sbbs3/scfglib1.c b/src/sbbs3/scfglib1.c
index 80a009d2dc..6cfc349f50 100644
--- a/src/sbbs3/scfglib1.c
+++ b/src/sbbs3/scfglib1.c
@@ -208,11 +208,18 @@ BOOL read_main_cfg(scfg_t* cfg, char* error, size_t maxerrlen)
 	SAFECOPY(cfg->mqtt.password, iniGetString(section, NULL, "password", "", value));
 	SAFECOPY(cfg->mqtt.broker_addr, iniGetString(section, NULL, "broker_addr", "127.0.0.1", value));
 	cfg->mqtt.broker_port = iniGetUInt16(section, NULL, "broker_port", IPPORT_MQTT);
-	cfg->mqtt.keepalive = iniGetInteger(section, NULL, "keepalive", 5 * 60); // 5 minutes
-	cfg->mqtt.publish_qos = iniGetInteger(section, NULL, "publish_qos", 0);
-	cfg->mqtt.subscribe_qos = iniGetInteger(section, NULL, "subscribe_qos", 2);
-	cfg->mqtt.protocol_version = iniGetInteger(section, NULL, "protocol_version", 5);
+	cfg->mqtt.keepalive = iniGetIntInRange(section, NULL, "keepalive", 5, 60, INT_MAX); // seconds
+	cfg->mqtt.publish_qos = iniGetIntInRange(section, NULL, "publish_qos", 0, 0, 2);
+	cfg->mqtt.subscribe_qos = iniGetIntInRange(section, NULL, "subscribe_qos", 0, 2, 2);
+	cfg->mqtt.protocol_version = iniGetIntInRange(section, NULL, "protocol_version", 3, 5, 5);
 	cfg->mqtt.log_level = iniGetLogLevel(section, NULL, "LogLevel", LOG_INFO);
+	cfg->mqtt.tls.mode = iniGetIntInRange(section, NULL, "tls_mode", MQTT_TLS_DISABLED, MQTT_TLS_DISABLED, MQTT_TLS_PSK);
+	SAFECOPY(cfg->mqtt.tls.cafile, iniGetString(section, NULL, "tls_cafile", "", value));
+	SAFECOPY(cfg->mqtt.tls.certfile, iniGetString(section, NULL, "tls_certfile", "", value));
+	SAFECOPY(cfg->mqtt.tls.keyfile, iniGetString(section, NULL, "tls_keyfile", "", value));
+	SAFECOPY(cfg->mqtt.tls.keypass, iniGetString(section, NULL, "tls_keypass", "", value));
+	SAFECOPY(cfg->mqtt.tls.psk, iniGetString(section, NULL, "tls_psk", "", value));
+	SAFECOPY(cfg->mqtt.tls.identity, iniGetString(section, NULL, "tls_identity", "", value));
 
 	/***********/
 	/* Modules */
diff --git a/src/sbbs3/scfgsave.c b/src/sbbs3/scfgsave.c
index 554817f4ad..ae5d28656c 100644
--- a/src/sbbs3/scfgsave.c
+++ b/src/sbbs3/scfgsave.c
@@ -219,6 +219,14 @@ BOOL write_main_cfg(scfg_t* cfg, int backup_level)
 		iniSetString(&ini, name, "Username", cfg->mqtt.username, NULL);
 		iniSetString(&ini, name, "Password", cfg->mqtt.password, NULL);
 		iniSetLogLevel(&ini, name , "LogLevel", cfg->mqtt.log_level, NULL);
+		// TLS
+		iniSetInteger(&ini, name, "TLS_mode", cfg->mqtt.tls.mode, NULL);
+		iniSetString(&ini, name, "TLS_cafile", cfg->mqtt.tls.cafile, NULL);
+		iniSetString(&ini, name, "TLS_certfile", cfg->mqtt.tls.certfile, NULL);
+		iniSetString(&ini, name, "TLS_keyfile", cfg->mqtt.tls.keyfile, NULL);
+		iniSetString(&ini, name, "TLS_keypass", cfg->mqtt.tls.keypass, NULL);
+		iniSetString(&ini, name, "TLS_psk", cfg->mqtt.tls.psk, NULL);
+		iniSetString(&ini, name, "TLS_identity", cfg->mqtt.tls.identity, NULL);
 	}
 
 	{
-- 
GitLab