Skip to content
Snippets Groups Projects
echocfg.c 104 KiB
Newer Older

/****************************************************************************
 * @format.tab-size 4		(Plain Text/Source Code File Header)			*
 * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
 *																			*
 * Copyright Rob Swindell - http://www.synchro.net/copyright.html			*
 *																			*
 * This program is free software; you can redistribute it and/or			*
 * modify it under the terms of the GNU General Public License				*
 * as published by the Free Software Foundation; either version 2			*
 * of the License, or (at your option) any later version.					*
 * See the GNU General Public License for more details: gpl.txt or			*
 * http://www.fsf.org/copyleft/gpl.html										*
 *																			*
 * For Synchronet coding style and modification guidelines, see				*
 * http://www.synchro.net/source.html										*
 *																			*
 * Note: If this box doesn't appear square, then you need to fix your tabs.	*
 ****************************************************************************/

/* Portions written by Allen Christiansen 1994-1996 						*/

#include <stdio.h>
#undef JAVASCRIPT
/* XPDEV Headers */
#include "gen_defs.h"

#define __COLORS
#include "ciolib.h"
#include "uifc.h"
#include "scfgdefs.h"
#include "sockwrap.h"
#include "str_util.h"
#include "git_branch.h"
#include "git_hash.h"
rswindell's avatar
rswindell committed
sbbsecho_cfg_t cfg;
/* These correlate with the LOG_* definitions in syslog.h/gen_defs.h */
rswindell's avatar
rswindell committed
static char* logLevelStringList[]
	= {"Emergency", "Alert", "Critical", "Error", "Warning", "Notice", "Informational", "Debugging", NULL};
#define PACKET_TYPE_HELP_TEXT \
	"`Type-2  ` packets are defined in FTS-0001.16 (Stone Age)\n" \
	"`Type-2e ` packets are defined in FSC-0039.04 (Sometimes called 2+)\n" \
	"`Type-2+ ` packets are defined in FSC-0048.02 (4D address support)\n" \
	"`Type-2.2` packets are defined in FSC-0045.01 (5D address support)\n" \

rswindell's avatar
rswindell committed
void global_settings(void)
{
	static int global_opt;

	while(1) {
		int i = 0;
		char str[128];
rswindell's avatar
rswindell committed
		char duration[64];
		sprintf(opt[i++], "%-30s %s", "Mailer Type"
rswindell's avatar
rswindell committed
			,cfg.flo_mailer ? "Binkley/FLO":"ArcMail/Attach");
		sprintf(opt[i++], "%-30s %s", "Log Level", logLevelStringList[cfg.log_level]);
		sprintf(opt[i++], "%-30s %s", "Log Timestamp Format", cfg.logtime);
		if(cfg.max_log_size) {
			SAFEPRINTF2(str, "%s bytes, keep %lu"
				,byte_count_to_str(cfg.max_log_size, tmp, sizeof(tmp))
				,cfg.max_logs_kept);
		} else {
			SAFECOPY(str, "Unlimited");
		}
		sprintf(opt[i++], "%-30s %s", "Maximum Log File Size", str);
		sprintf(opt[i++], "%-30s %s", "Strict Packet Passwords", cfg.strict_packet_passwords ? "Enabled" : "Disabled");
		sprintf(opt[i++], "%-30s %u", "Config File Backups", cfg.cfgfile_backups);
		sprintf(opt[i++], "%-30s %s bytes", "Minimum Free Disk Space"
			, byte_count_to_str(cfg.min_free_diskspace, str, sizeof(str)));
		snprintf(opt[i++],MAX_OPLN-1,"%-30s %-3.3s","Strip Incoming Soft CRs "
		snprintf(opt[i++],MAX_OPLN-1,"%-30s %-3.3s","Strip Outgoing Line Feeds "
		snprintf(opt[i++],MAX_OPLN-1,"%-30s %-3.3s","Auto-detect UTF-8 Messages "
			,cfg.auto_utf8 ? "Yes":"No");
		snprintf(opt[i++],MAX_OPLN-1,"%-30s %-3.3s","Use Outboxes for Mail Files "
			,cfg.use_outboxes ? "Yes":"No");
		snprintf(opt[i++],MAX_OPLN-1,"%-30s %-3.3s","Sort Linked Node List  "
			,cfg.sort_nodelist ? "Yes":"No");
		snprintf(opt[i++],MAX_OPLN-1,"%-30s %-3.3s","Delete Processed Packets"
			,cfg.delete_packets ? "Yes":"No");
		snprintf(opt[i++],MAX_OPLN-1,"%-30s %s","Incoming Bad Packets"
			,cfg.delete_bad_packets ? "Deleted" : cfg.verbose_bad_packet_names ? "Renamed *.reason.bad" : "Renamed *.bad");
		snprintf(opt[i++],MAX_OPLN-1,"%-30s %s", "Default Packet Type", pktTypeStringList[cfg.default_packet_type]);
		sprintf(opt[i++], "%-30s %s", "BSY Mutex File Timeout", duration_to_vstr(cfg.bsy_timeout, duration, sizeof(duration)));
			sprintf(opt[i++], "%-30s %s", "BSO Lock Attempt Delay", duration_to_vstr(cfg.bso_lock_delay, duration, sizeof(duration)));
			sprintf(opt[i++], "%-30s %lu", "BSO Lock Attempt Limit", cfg.bso_lock_attempts);
			sprintf(opt[i++], "%-30s %s", "BinkP Capabilities", cfg.binkp_caps);
			sprintf(opt[i++], "%-30s %s", "BinkP Sysop Name", cfg.binkp_sysop);
			sprintf(opt[i++], "%-30s %s", "BinkP Authentication", cfg.binkp_plainAuthOnly ? "Plain Only" : "Plain or CRAM-MD5");
			sprintf(opt[i++], "%-30s %s", "BinkP Encryption", !cfg.binkp_plainTextOnly && !cfg.binkp_plainAuthOnly ? "Supported" : "Unsupported");
rswindell's avatar
rswindell committed
		opt[i][0] = 0;
		uifc.helpbuf=
			"~ Global Settings ~\n"
			"\n"
			"`Mailer Type` should normally be set to `Binkley/FLO` to enable SBBSecho's\n"
			"    \"Binkley-Style Outbound\" operating mode (a.k.a. `BSO` or `FLO` mode).\n"
			"    If you are using an `Attach`, `ArcMail`, or `FrontDoor` style FidoNet\n"
			"    mailer, then set this setting to `ArcMail/Attach`, but know that most\n"
			"    modern FidoNet mailers are Binkley-Style and therefore that mode of\n"
			"    operation in SBBSecho is much more widely tested and supported.\n"
rswindell's avatar
rswindell committed
			"\n"
			"`Log Level` should normally be set to `Informational` but if you're\n"
			"    experiencing problems with SBBSecho and would like more verbose log\n"
			"    output, set this to `Debugging`. If you want less verbose logging,\n"
			"    set to higher-severity levels to reduce the number of log messages.\n"
			"\n"
			"`Log Timestamp Format` defines the format of the date/time-stamps added\n"
rswindell's avatar
rswindell committed
			"    along with each log message to the log file (e.g. sbbsecho.log).\n"
			"    The timestamp format is defined using standard C `strftime` notation.\n"
			"    The default format is: `" DEFAULT_LOG_TIME_FMT "`\n"
			"    For SBBSecho v2 timestamp format, use `%m/%d/%y %H:%M:%S`\n"
			"\n"
			"`Strict Packet Passwords`, when enabled, requires that Packet Passwords\n"
			"    must match the password for the linked node from which the packet\n"
			"    was received, even if that linked node has no password configured.\n"
rswindell's avatar
rswindell committed
			"    If you wish to revert to the SBBSecho v2 behavior with less strict\n"
			"    enforcement of matching packet passwords, disable this option.\n"
			"    Default: Enabled\n"
			"\n"
			"`Config File Backups` determines the number of automatic backups of your\n"
			"    SBBSecho configuration file (e.g. `sbbsecho.ini`) that will be\n"
			"    maintained by FidoNet Config (`echocfg`) and SBBSecho AreaFix.\n"
			"\n"
			"`Minimum Free Disk Space` determines the minimum amount of free disk\n"
			"    space for SBBSecho to run.  SBBSecho will just exit with an error\n"
			"    message (and an error level of 1) if the minimum amount of free\n"
			"    space is not found in directories into which SBBSecho may write.\n"
			"\n"
			"`Strip Incoming Soft CRs` instructs SBBSecho to remove any \"Soft\"\n"
			"    Carriage Return (ASCII 141) characters from the text of `imported`\n"
			"    EchoMail and NetMail messages.\n"
			"\n"
			"`Strip Outgoing Line Feeds` instructs SBBSecho to remove any Line Feed\n"
			"    (ASCII 10) characters from the body text of `exported` EchoMail and\n"
			"    NetMail messages.\n"
			"\n"
			"`Auto-detect UTF-8 Messages` instructs SBBSecho to treat incoming\n"
			"    messages which lack a CHRS/CHARSET control line and contain valid\n"
			"    UTF-8 character sequences in the message text, as UTF-8 encoded\n"
			"    messages.\n"
			"\n"
			"`Use Outboxes for Mail Files` instructs SBBSecho to place outbound\n"
			"    NetMail and EchoMail files into the configured `Outbox Directory`\n"
			"    of the relevant linked node. If the linked node has no configured\n"
			"    outbox, then outbound mail files for that node are placed in the\n"
			"    normal outbound directory hierarchy.  The BinkIT mailer will\n"
			"    send files from configured outboxes in addition to the normal\n"
			"    outbound directories, even when this option is set to `No`.\n"
			"\n"
			"`Sort Linked Node List` instructs SBBSecho to sort the list of linked\n"
			"    nodes (in sbbsecho.ini) both when reading and writing the file.\n"
			"\n"
			"`Delete Processed Packets` instructs SBBSecho to delete packet files\n"
			"    after they've been imported (as one would normally expect).\n"
			"\n"
			"`Incoming Bad Packets` can be `Deleted` or `Renamed` (*.bad) and optionally\n"
			"    include the `reason` in the renamed packet filename (the default).\n"
			"`Default Packet Type` is the type of packets that SBBSecho will generate\n"
			"    by default (i.e. for newly created and un-linked destination nodes).\n"
			"\n"
rswindell's avatar
rswindell committed
			"`BSY Mutex File Timeout` determines the maximum age of an existing\n"
			"    mutex file (`*.bsy`) before SBBSecho will act as though the mutex\n"
			"    file was not present.  This setting applies to the global\n"
			"    `sbbsecho.bsy` file as well as the BSO lock (`*.bsy`) files for\n"
			"    individual nodes.\n"
			"    Default: 12 hours\n"
			"\n"
			"`BSO Lock Attempt Delay` determines the amount of time between BSO\n"
			"    node lock attempts (via `*.bsy` files in the relevant outbound\n"
			"    directory).\n"
			"    Default: 10 seconds\n"
			"\n"
			"`BSO Lock Attempt Limit` determines the maximum number of BSO node lock\n"
rswindell's avatar
rswindell committed
			"    attempts before SBBSecho will give-up and move on to another node\n"
			"    to process mail.  This value multiplied by the `BSO Lock Attempt\n"
			"    Delay` should be much less than the `BSY Mutex File Timeout` value.\n"
			"    Default: 60 attempts\n"
			"\n"
			"`BinkP Capabilities` may be used to over-ride the default BinkP node\n"
			"    capabilities sent during a `BinkIT` mailer session (via the NDL\n"
			"    command). Default capabilities value is '115200,TCP,BINKP'\n"
			"\n"
			"`BinkP Sysop` may be used to over-ride the default BinkP sysop name\n"
			"    sent during a `BinkIT` mailer session (via the ZYZ command).\n"
			"    Default sysop name is that set in `SCFG->System->Operator`\n"
			"\n"
			"`BinkP Authentication` may be set to `Plain Only` if you wish to disable\n"
			"    CRAM-MD5 authentication for both inbound and outbound sessions.\n"
		    "    Note: CRAM-MD5 authentication is required for encrypted sessions.\n"
			"    Default: Plain or CRAM-MD5\n"
			"\n"
			"`BinkP Encryption` may be set to `Supported` (the default) only when\n"
			"    BinkP Authentication is set to Plain or CRAM-MD5.\n"
			"    Default: Supported\n"
rswindell's avatar
rswindell committed
			;

		int key = uifc.list(WIN_ACT|WIN_SAV, 0, 0, 0, &global_opt,0, "Global Settings", opt);
rswindell's avatar
rswindell committed

		switch(key) {

			case -1:
				return;

			case 0:
				cfg.flo_mailer = !cfg.flo_mailer;
				break;

			case 1:
	uifc.helpbuf=
	"~ Log Level ~\n"
	"\n"
	"Select the minimum severity of log entries to be logged to the log file.\n"
	"The default/normal setting is `Informational`.";
				int i = cfg.log_level;
				i = uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0,"Log Level",logLevelStringList);
				if(i>=0 && i<=LOG_DEBUG)
					cfg.log_level=i;
				break;

			case 2:
				uifc.input(WIN_MID|WIN_SAV,0,0
					,"Log Timestamp Format", cfg.logtime, sizeof(cfg.logtime)-1, K_EDIT);
				break;

			case 3:
				byte_count_to_str(cfg.max_log_size, str, sizeof(str));
				if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "Maximum Log File Size (in bytes, 0=unlimited)", str, 10, K_EDIT|K_UPPER) > 0) {
					cfg.max_log_size = parse_byte_count(str, 1);
					if(cfg.max_log_size) {
						SAFEPRINTF(str, "%lu", cfg.max_logs_kept);
						if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "Maximum Number of old Log Files to Keep", str, 5, K_EDIT|K_NUMBER) > 0)
							cfg.max_logs_kept = strtoul(str, NULL, 10);
					}
				}
rswindell's avatar
rswindell committed
				break;

			case 4:
				cfg.strict_packet_passwords = !cfg.strict_packet_passwords;
				break;

			case 5:
				sprintf(str, "%u", cfg.cfgfile_backups);
				if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "Configuration File Backups", str, 5, K_EDIT|K_NUMBER) > 0)
					cfg.cfgfile_backups = atoi(str);
				break;

				byte_count_to_str(cfg.min_free_diskspace, str, sizeof(str));
				if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "Minimum Free Disk Space (in bytes)", str, 10, K_EDIT|K_UPPER) > 0)
					cfg.min_free_diskspace = parse_byte_count(str, 1);
				break;

			{
				int k = !cfg.strip_soft_cr;
				switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
					,"Strip Soft Carriage Returns from Incoming Messages",uifcYesNoOpts)) {
					case 0:	cfg.strip_soft_cr = true;	break;
					case 1:	cfg.strip_soft_cr = false;	break;
				}
				break;
			}
			{
				int k = !cfg.strip_lf;
				switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
					,"Strip Line Feeds from Outgoing Messages",uifcYesNoOpts)) {
					case 0:	cfg.strip_lf = true;	break;
					case 1:	cfg.strip_lf = false;	break;
				}
				break;
			}
			{
				int k = !cfg.auto_utf8;
				switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
					,"Auto-detect incoming UTF-8 encoded messages",uifcYesNoOpts)) {
					case 0:	cfg.auto_utf8 = true;	break;
					case 1:	cfg.auto_utf8 = false;	break;
				}
				break;
			}
			{
				int k = !cfg.use_outboxes;
				switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
					,"Use Outboxes for Outbound NetMail and EchoMail",uifcYesNoOpts)) {
					case 0:	cfg.use_outboxes = true;	break;
					case 1:	cfg.use_outboxes = false;	break;
				}
				break;
			}
			{
				int k = !cfg.sort_nodelist;
				switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
					,"Sort List of Linked Nodes",uifcYesNoOpts)) {
					case 0:	cfg.sort_nodelist = true;	break;
					case 1:	cfg.sort_nodelist = false;	break;
				}
				break;
			}
			case 12:
			{
				int k = !cfg.delete_packets;
				switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
					,"Delete Incoming Processed Packets (.pkt files)",uifcYesNoOpts)) {
					case 0:	cfg.delete_packets = true;	break;
					case 1:	cfg.delete_packets = false;	break;
				}
				break;
			}
			case 13:
			{
				int k = !cfg.delete_bad_packets;
				switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
					,"Delete Bad Incoming Packets (.pkt files) When Detected", uifcYesNoOpts)) {
					case 0:	cfg.delete_bad_packets = true;
						break;
					case 1:	cfg.delete_bad_packets = false;
						int k = !cfg.verbose_bad_packet_names;
						switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
							,"Include Reason in Renamed Bad Packet Filenames", uifcYesNoOpts)) {
							case 0:	cfg.verbose_bad_packet_names = true;	break;
							case 1:	cfg.verbose_bad_packet_names = false;	break;
						}
						break;
			{
				uifc.helpbuf=
					"~ Default Packet Type ~\n\n"
					"This is the packet header type that will be used in mail packets\n"
					"by default (for newly created and un-linked nodes).\n"
					"\n"
					PACKET_TYPE_HELP_TEXT
					"\n"
					"The suggested default packet type is `Type-2+`.\n"
				;
				int k = cfg.default_packet_type;
				k = uifc.list(WIN_RHT|WIN_SAV,0,0,0,&k,0, "Packet Type", pktTypeStringList);
				if(k < 0)
					break;
				cfg.default_packet_type=k;
				uifc.changes=TRUE;
				break;
			}
			case 15:
rswindell's avatar
rswindell committed
				duration_to_vstr(cfg.bsy_timeout, duration, sizeof(duration));
				if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "BSY Mutex File Timeout", duration, 10, K_EDIT) > 0)
					cfg.bsy_timeout = (ulong)parse_duration(duration);
				break;

rswindell's avatar
rswindell committed
				duration_to_vstr(cfg.bso_lock_delay, duration, sizeof(duration));
				if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "Delay Between BSO Lock Attempts", duration, 10, K_EDIT) > 0)
					cfg.bso_lock_delay = (ulong)parse_duration(duration);
				break;

				sprintf(str, "%lu", cfg.bso_lock_attempts);
rswindell's avatar
rswindell committed
				if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "Maximum BSO Lock Attempts", str, 5, K_EDIT|K_NUMBER) > 0)
					cfg.bso_lock_attempts = atoi(str);
				break;

					,"BinkP Capabilities (BinkIT)", cfg.binkp_caps, sizeof(cfg.binkp_caps)-1, K_EDIT);
					,"BinkP Sysop Name (BinkIT)", cfg.binkp_sysop, sizeof(cfg.binkp_sysop)-1, K_EDIT);
			{
				int k = !cfg.binkp_plainAuthOnly;
				strcpy(opt[0], "Plain-Password Only");
				strcpy(opt[1], "Plain-Password or CRAM-MD5");
				opt[2][0] = 0;
				switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
					,"BinkP Authentication",opt)) {
					case 0:
						cfg.binkp_plainAuthOnly = true;
						break;
					case 1:
						cfg.binkp_plainAuthOnly = false;
						break;
				}
				break;
			}
			{
				if(cfg.binkp_plainAuthOnly) {
					uifc.msg("CRAM-MD5 authentication/encryption has been disabled globally");
					break;
				}
				switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
					,"BinkP Encryption Supported",uifcYesNoOpts)) {
					case 0:
static bool new_node(unsigned new_nodenum)
{
	nodecfg_t* nodecfg = realloc(cfg.nodecfg, sizeof(nodecfg_t)*(cfg.nodecfgs+1));
	if(nodecfg == NULL)
		return false;

	cfg.nodecfg = nodecfg;
	for(unsigned int i=cfg.nodecfgs; i > new_nodenum; i--)
		memcpy(&cfg.nodecfg[i], &cfg.nodecfg[i-1], sizeof(nodecfg_t));

	cfg.nodecfgs++;
	memset(&cfg.nodecfg[new_nodenum], 0, sizeof(nodecfg_t));
	cfg.nodecfg[new_nodenum].binkp_allowPlainText = true;
	cfg.nodecfg[new_nodenum].binkp_port = IPPORT_BINKP;
	cfg.nodecfg[new_nodenum].pkt_type = cfg.default_packet_type;
	return true;
}

static bool new_arcdef(unsigned new_arcnum)
{
	arcdef_t * arcdef = realloc(cfg.arcdef, sizeof(arcdef_t)*(cfg.arcdefs+1));

	if(arcdef == NULL)
		return false;

	cfg.arcdef = arcdef;

	for(unsigned j=cfg.arcdefs;j>new_arcnum;j--)
		memcpy(&cfg.arcdef[j],&cfg.arcdef[j-1], sizeof(arcdef_t));
	cfg.arcdefs++;
	memset(&cfg.arcdef[new_arcnum], 0, sizeof(arcdef_t));
	return true;
}

static bool new_list(unsigned new_listnum)
{
	echolist_t *listcfg = realloc(cfg.listcfg, sizeof(echolist_t)*(cfg.listcfgs+1));

	if(listcfg == NULL)
		return false;
	cfg.listcfg = listcfg;
	for(unsigned j=cfg.listcfgs;j>new_listnum;j--)
		memcpy(&cfg.listcfg[j],&cfg.listcfg[j-1], sizeof(echolist_t));
	cfg.listcfgs++;
	memset(&cfg.listcfg[new_listnum],0,sizeof(echolist_t));
	return true;
}

static bool new_domain(unsigned new_domnum)
{
	struct fido_domain* new_list = realloc(cfg.domain_list, sizeof(struct fido_domain) * (cfg.domain_count + 1));
	if(new_list == NULL)
		return false;
	cfg.domain_list = new_list;
	for(unsigned i = cfg.domain_count; i > new_domnum; i--)
		memcpy(&cfg.domain_list[i], &cfg.domain_list[i-1], sizeof(struct fido_domain));
	cfg.domain_count++;
	memset(&cfg.domain_list[new_domnum], 0, sizeof(struct fido_domain));
	return true;
}

static bool new_robot(unsigned new_botnum)
{
	struct robot* new_list = realloc(cfg.robot_list, sizeof(struct robot) * (cfg.robot_count + 1));
	if(new_list == NULL)
		return false;
	cfg.robot_list = new_list;
	for(unsigned i = cfg.robot_count; i > new_botnum; i--)
		memcpy(&cfg.robot_list[i], &cfg.robot_list[i-1], sizeof(struct robot));
	cfg.robot_count++;
	memset(&cfg.robot_list[new_botnum], 0, sizeof(struct robot));
	return true;
}

static char* int_list(int* list, unsigned count)
{
	static char str[128];

	str[0]=0;
	for(unsigned i = 0; i < count; i++) {
		if(i)
			sprintf(str + strlen(str), ",%d", *(list + i));
		else
			sprintf(str, "%d", *list);
	}

	return str;
}

void binkp_settings(nodecfg_t* node)
{
	static int cur;

	while(1) {
		char str[128];
		int i = 0;
		sprintf(opt[i++], "%-20s %s", "Host", node->binkp_host);
		sprintf(opt[i++], "%-20s %u", "Port", node->binkp_port);
		sprintf(opt[i++], "%-20s %s", "Poll", node->binkp_poll ? "Yes" : "No");
		char* auth = "Plain Only";
		char* crypt = "Unsupported";
		if(!cfg.binkp_plainAuthOnly && !node->binkp_plainAuthOnly) {
				crypt = node->binkp_allowPlainText ? "Supported" : "Required";
			if(node->binkp_allowPlainAuth)
				auth = "Plain or CRAM-MD5";
			else
				auth = "CRAM-MD5 Only";
		}
		sprintf(opt[i++], "%-20s %s", "Authentication", auth);
		sprintf(opt[i++], "%-20s %s", "Encryption", crypt);
		sprintf(opt[i++], "%-20s %s", "Implicit TLS", node->binkp_tls ? "Yes" : "No");
		sprintf(opt[i++], "%-20s %s", "Source Address", node->binkp_src);
		opt[i][0]=0;
		char title[128];
		SAFEPRINTF(title, "%s BinkP Settings", faddrtoa(&node->addr));
		uifc.helpbuf=
			"~ BinkP Settings ~\n"
			"\nThese settings are used by the Synchronet `BinkIT` BinkP/BSO mailer.\n"
			"\n"
			"`Host` defines the TCP/IP address or host name with which to connect for\n"
			"    sessions with this linked node.  If the host is not set, then a\n"
			"    DNS-based look-up will be attempted (e.g. the IP address for\n"
			"    `1:103/705` would be looked-up via host name `f705.n103.z1.binkp.net`).\n"
			"    Nodelist-based look-ups are also supported.\n"
			"\n"
			"`Port` defines the TCP port used by this linked node for BinkP sessions.\n"
			"    The default BinkP TCP port is `24554`.\n"
			"\n"
			"`Poll` defines whether or not to periodically poll this linked node.\n"
			"\n"
			"`Authentication` determines what types of authentication will be supported\n"
			"    during both inbound and outbound sessions with this linked node.\n"
			"    The supported BinkP-auth methods are `Plain-Password` and `CRAM-MD5`.\n"
			"    Note: For `incoming` connections, CRAM-MD5 will be supported unless\n"
			"    CRAM-MD5 authentication has been `globally` disabled.\n"
			"`Encryption` determines whether unencrypted data transfers will be\n"
			"    supported or required when communicating with this linked node.\n"
			"    With this setting set to `Required`, ~only~ BinkD-style-encrypted BinkP\n"
			"    sessions will be supported.\n"
			"    CRAM-MD5 authentication `must` be used when encrypting BinkP sessions.\n"
			"`Implicit TLS` defines whether or not to use `BINKPS` when connecting\n"
			"    (outbound) with this linked node.\n"
			"\n"
Loading
Loading full blame...