diff --git a/src/sbbs3/scfg/scfgsrvr.c b/src/sbbs3/scfg/scfgsrvr.c index 1cd48671442fc43cf2455cd71b35ae476220c9f5..5bcd575a38e816eafdbcf2a2021aaaae430e47fa 100644 --- a/src/sbbs3/scfg/scfgsrvr.c +++ b/src/sbbs3/scfg/scfgsrvr.c @@ -336,13 +336,13 @@ static void telnet_srvr_cfg(bbs_startup_t* startup) while(1) { int i = 0; - snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Enabled", startup->options & BBS_OPT_NO_TELNET ? "No" : "Yes"); - snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Interfaces" + snprintf(opt[i++], MAX_OPLN, "%-20s%s", "Enabled", startup->options & BBS_OPT_NO_TELNET ? "No" : "Yes"); + snprintf(opt[i++], MAX_OPLN, "%-20s%s", "Interfaces" ,startup->options & BBS_OPT_NO_TELNET ? "N/A" : strListCombine(startup->telnet_interfaces, tmp, sizeof(tmp), ", ")); - snprintf(opt[i++], MAX_OPLN, "%-30s%u", "Port", startup->telnet_port); - snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Command Debug" + snprintf(opt[i++], MAX_OPLN, "%-20s%u", "Port", startup->telnet_port); + snprintf(opt[i++], MAX_OPLN, "%-20s%s", "Command Debug" ,startup->options & BBS_OPT_NO_TELNET ? "N/A" : startup->options & BBS_OPT_DEBUG_TELNET ? "Yes" : "No"); - snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Send Go-Aheads" + snprintf(opt[i++], MAX_OPLN, "%-20s%s", "Send Go-Aheads" ,startup->options & BBS_OPT_NO_TELNET ? "N/A" : startup->options & BBS_OPT_NO_TELNET_GA ? "No" : "Yes"); opt[i][0] = '\0'; @@ -471,10 +471,10 @@ static void rlogin_srvr_cfg(bbs_startup_t* startup) while(1) { int i = 0; - snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Enabled", startup->options & BBS_OPT_ALLOW_RLOGIN ? "Yes" : "No"); - snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Interfaces" + snprintf(opt[i++], MAX_OPLN, "%-20s%s", "Enabled", startup->options & BBS_OPT_ALLOW_RLOGIN ? "Yes" : "No"); + snprintf(opt[i++], MAX_OPLN, "%-20s%s", "Interfaces" ,startup->options & BBS_OPT_ALLOW_RLOGIN ? strListCombine(startup->rlogin_interfaces, tmp, sizeof(tmp), ", ") : "N/A"); - snprintf(opt[i++], MAX_OPLN, "%-30s%u", "Port", startup->rlogin_port); + snprintf(opt[i++], MAX_OPLN, "%-20s%u", "Port", startup->rlogin_port); opt[i][0] = '\0'; switch(uifc.list(WIN_ACT|WIN_ESC|WIN_MID|WIN_SAV, 0, 0, 0, &cur, &bar @@ -645,6 +645,8 @@ static void termsrvr_cfg(void) startup.options ^= BBS_OPT_NO_EVENTS; break; case 16: + if(startup.options & BBS_OPT_NO_EVENTS) + break; startup.options ^= BBS_OPT_NO_QWK_EVENTS; break; case 17: @@ -701,6 +703,98 @@ static void termsrvr_cfg(void) } } +static void http_srvr_cfg(web_startup_t* startup) +{ + static int cur, bar; + char tmp[256]; + char str[256]; + + while(1) { + int i = 0; + snprintf(opt[i++], MAX_OPLN, "%-20s%s", "Enabled", startup->options & WEB_OPT_NO_HTTP ? "No" : "Yes"); + snprintf(opt[i++], MAX_OPLN, "%-20s%s", "Interfaces" + ,startup->options & WEB_OPT_NO_HTTP ? "N/A" : strListCombine(startup->interfaces, tmp, sizeof(tmp), ", ")); + snprintf(opt[i++], MAX_OPLN, "%-20s%u", "Port", startup->port); + opt[i][0] = '\0'; + + switch(uifc.list(WIN_ACT|WIN_ESC|WIN_MID|WIN_SAV, 0, 0, 0, &cur, &bar + ,"HTTP Support",opt)) { + case 0: + startup->options ^= WEB_OPT_NO_HTTP; + break; + case 1: + if(startup->options & WEB_OPT_NO_HTTP) + break; + strListCombine(startup->interfaces, str, sizeof(str), ", "); + if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "HTTP Network Interfaces (IPv4/6)", str, sizeof(str)-1, K_EDIT) >= 0) { + strListFree(&startup->interfaces); + strListSplitCopy(&startup->interfaces, str, ", "); + uifc.changes = true; + } + break; + case 3: + if(startup->options & WEB_OPT_NO_HTTP) + break; + SAFEPRINTF(str, "%u", startup->port); + if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "HTTP TCP Port", str, 5, K_NUMBER|K_EDIT) > 0) + startup->port = atoi(str); + break; + default: + return; + } + } +} + +static void https_srvr_cfg(web_startup_t* startup) +{ + static int cur, bar; + char tmp[256]; + char str[256]; + + while(1) { + int i = 0; + snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Enabled", startup->options & WEB_OPT_ALLOW_TLS ? "Yes" : "No"); + snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Interfaces" + ,startup->options & WEB_OPT_ALLOW_TLS ? strListCombine(startup->tls_interfaces, tmp, sizeof(tmp), ", ") : "N/A"); + snprintf(opt[i++], MAX_OPLN, "%-30s%u", "Port", startup->tls_port); + snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Strict Transport Security" + ,startup->options & WEB_OPT_ALLOW_TLS ? (startup->options & WEB_OPT_HSTS_SAFE ? "Yes" : "No") : "N/A"); + opt[i][0] = '\0'; + + switch(uifc.list(WIN_ACT|WIN_ESC|WIN_MID|WIN_SAV, 0, 0, 0, &cur, &bar + ,"HTTPS Support",opt)) { + case 0: + startup->options ^= WEB_OPT_ALLOW_TLS; + break; + case 1: + if(!(startup->options & WEB_OPT_ALLOW_TLS)) + break; + strListCombine(startup->tls_interfaces, str, sizeof(str), ", "); + if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "HTTP/TLS (HTTPS) Network Interfaces (IPv4/6)", str, sizeof(str)-1, K_EDIT) >= 0) { + strListFree(&startup->tls_interfaces); + strListSplitCopy(&startup->tls_interfaces, str, ", "); + uifc.changes = true; + } + break; + case 2: + if(!(startup->options & WEB_OPT_ALLOW_TLS)) + break; + SAFEPRINTF(str, "%u", startup->tls_port); + if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "HTTP/TLS (HTTPS) TCP Port", str, 5, K_NUMBER|K_EDIT) > 0) + startup->tls_port = atoi(str); + break; + case 3: + if(!(startup->options & WEB_OPT_ALLOW_TLS)) + break; + startup->options ^= WEB_OPT_HSTS_SAFE; + break; + default: + return; + } + } +} + + static void websrvr_cfg(void) { static int cur, bar; @@ -738,17 +832,14 @@ static void websrvr_cfg(void) int i = 0; snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Enabled", enabled ? "Yes" : "No"); snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Log Level", iniLogLevelStringList()[startup.log_level]); - snprintf(opt[i++], MAX_OPLN, "%-30s%s", "HTTP Interfaces", strListCombine(startup.interfaces, tmp, sizeof(tmp), ", ")); - snprintf(opt[i++], MAX_OPLN, "%-30s%u", "HTTP Port", startup.port); - snprintf(opt[i++], MAX_OPLN, "%-30s%s", "HTTPS Support", startup.options & WEB_OPT_ALLOW_TLS ? "Yes" : "No"); - snprintf(opt[i++], MAX_OPLN, "%-30s%s", "HTTPS Interfaces" - ,startup.options & WEB_OPT_ALLOW_TLS ? strListCombine(startup.tls_interfaces, tmp, sizeof(tmp), ", ") : "N/A"); - snprintf(opt[i++], MAX_OPLN, "%-30s%u", "HTTPS Port", startup.tls_port); + snprintf(str, sizeof str, "Port %u", startup.port); + snprintf(opt[i++], MAX_OPLN, "%-30s%s", "HTTP Support...", startup.options & WEB_OPT_NO_HTTP ? strDisabled : str); + snprintf(str, sizeof str, "Port %u", startup.tls_port); + snprintf(opt[i++], MAX_OPLN, "%-30s%s", "HTTPS Support...", startup.options & WEB_OPT_ALLOW_TLS ? str : strDisabled); snprintf(opt[i++], MAX_OPLN, "%-30s%s", "SSJS File Extension", startup.ssjs_ext); snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Index Filenames", strListCombine(startup.index_file_name, tmp, sizeof(tmp), ", ")); snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Content Root Directory", startup.root_dir); snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Error Sub-directory", startup.error_dir); - snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Strict Transport Security", startup.options & WEB_OPT_HSTS_SAFE ? "Yes" : "No"); snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Virtual Host Support", startup.options & WEB_OPT_VIRTUAL_HOSTS ? "Yes" : "No"); SAFECOPY(str, startup.logfile_base); if(*str == '\0') @@ -758,15 +849,19 @@ static void websrvr_cfg(void) snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Max Inactivity", vduration(startup.max_inactivity)); snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Filebase Index Script", startup.file_index_script); snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Filebase VPath Prefix", startup.file_vpath_prefix); - snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Filebase VPath for VHosts", startup.file_vpath_for_vhosts ? "Yes" : "No"); + snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Filebase VPath for VHosts" + ,startup.options & WEB_OPT_VIRTUAL_HOSTS ? startup.file_vpath_for_vhosts ? "Yes" : "No" : "N/A"); snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Authentication Methods", startup.default_auth_list); snprintf(opt[i++], MAX_OPLN, "%-30s%u ms", "Output Buffer Drain Timeout", startup.outbuf_drain_timeout); snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Lookup Client Hostname", startup.options & BBS_OPT_NO_HOST_LOOKUP ? "No" : "Yes"); snprintf(opt[i++], MAX_OPLN, "%-30s%s", "CGI Support", startup.options & WEB_OPT_NO_CGI ? "No" : "Yes"); - snprintf(opt[i++], MAX_OPLN, "%-30s%s", "CGI Directory", startup.cgi_dir); - snprintf(opt[i++], MAX_OPLN, "%-30s%s", "CGI File Extensions", strListCombine(startup.cgi_ext, tmp, sizeof(tmp), ", ")); - snprintf(opt[i++], MAX_OPLN, "%-30s%s", "CGI Default Content-Type", startup.default_cgi_content); - snprintf(opt[i++], MAX_OPLN, "%-30s%s", "CGI Max Inactivity", vduration(startup.max_cgi_inactivity)); + snprintf(opt[i++], MAX_OPLN, "%-30s%s", "CGI Directory", startup.options & WEB_OPT_NO_CGI ? "N/A" : startup.cgi_dir); + snprintf(opt[i++], MAX_OPLN, "%-30s%s", "CGI File Extensions" + ,startup.options & WEB_OPT_NO_CGI ? "N/A" : strListCombine(startup.cgi_ext, tmp, sizeof(tmp), ", ")); + snprintf(opt[i++], MAX_OPLN, "%-30s%s", "CGI Default Content-Type" + ,startup.options & WEB_OPT_NO_CGI ? "N/A" : startup.default_cgi_content); + snprintf(opt[i++], MAX_OPLN, "%-30s%s", "CGI Max Inactivity" + ,startup.options & WEB_OPT_NO_CGI ? "N/A" : vduration(startup.max_cgi_inactivity)); snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Login Requirements", startup.login_ars); strcpy(opt[i++], "JavaScript Settings..."); strcpy(opt[i++], "Failed Login Attempts..."); @@ -798,39 +893,16 @@ static void websrvr_cfg(void) uifc.list(WIN_MID|WIN_SAV, 0, 0, 0, &startup.log_level, 0, "Log Level", iniLogLevelStringList()); break; case 2: - strListCombine(startup.interfaces, str, sizeof(str), ", "); - if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "HTTP Network Interfaces (IPv4/6)", str, sizeof(str)-1, K_EDIT) >= 0) { - strListFree(&startup.interfaces); - strListSplitCopy(&startup.interfaces, str, ", "); - uifc.changes = true; - } + http_srvr_cfg(&startup); break; case 3: - SAFEPRINTF(str, "%u", startup.port); - if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "HTTP TCP Port", str, 5, K_NUMBER|K_EDIT) > 0) - startup.port = atoi(str); + https_srvr_cfg(&startup); break; case 4: - startup.options ^= WEB_OPT_ALLOW_TLS; - break; - case 5: - strListCombine(startup.tls_interfaces, str, sizeof(str), ", "); - if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "HTTP/TLS (HTTPS) Network Interfaces (IPv4/6)", str, sizeof(str)-1, K_EDIT) >= 0) { - strListFree(&startup.tls_interfaces); - strListSplitCopy(&startup.tls_interfaces, str, ", "); - uifc.changes = true; - } - break; - case 6: - SAFEPRINTF(str, "%u", startup.tls_port); - if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "HTTP/TLS (HTTPS) TCP Port", str, 5, K_NUMBER|K_EDIT) > 0) - startup.tls_port = atoi(str); - break; - case 7: uifc.input(WIN_MID|WIN_SAV, 0, 0, "Server-side JavaScript File Extension" , startup.ssjs_ext, sizeof(startup.ssjs_ext) -1, K_EDIT); break; - case 8: + case 5: strListCombine(startup.index_file_name, str, sizeof(str), ", "); if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "Index Filenames", str, sizeof(str)-1, K_EDIT) >= 0) { strListFree(&startup.index_file_name); @@ -838,21 +910,18 @@ static void websrvr_cfg(void) uifc.changes = true; } break; - case 9: + case 6: uifc.input(WIN_MID|WIN_SAV, 0, 0, "Content Root Directory" ,startup.root_dir, sizeof(startup.root_dir)-1, K_EDIT); break; - case 10: + case 7: uifc.input(WIN_MID|WIN_SAV, 0, 0, "Error Sub-directory" ,startup.error_dir, sizeof(startup.error_dir)-1, K_EDIT); break; - case 11: - startup.options ^= WEB_OPT_HSTS_SAFE; - break; - case 12: + case 8: startup.options ^= WEB_OPT_VIRTUAL_HOSTS; break; - case 13: + case 9: i = startup.options & WEB_OPT_HTTP_LOGGING ? 0 : 1; i = uifc.list(WIN_SAV|WIN_MID, 0, 0, 0, &i, 0, "Log Requests to Files in Combined Log Format", uifcYesNoOpts); if(i == 0) { @@ -862,48 +931,52 @@ static void websrvr_cfg(void) } else if(i == 1) startup.options &= ~WEB_OPT_HTTP_LOGGING; break; - case 14: + case 10: SAFECOPY(str, maximum(startup.max_clients)); if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "Maximum Client Count (0=Unlimited)", str, 10, K_EDIT) > 0) startup.max_clients = atoi(str); break; - case 15: + case 11: SAFECOPY(str, duration(startup.max_inactivity, false)); if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "Maximum Client Inactivity", str, 10, K_EDIT) > 0) startup.max_inactivity = (uint16_t)parse_duration(str); break; - case 16: + case 12: uifc.input(WIN_MID|WIN_SAV, 0, 0, "Filebase Index Script" ,startup.file_index_script, sizeof(startup.file_index_script)-1, K_EDIT); break; - case 17: + case 13: uifc.input(WIN_MID|WIN_SAV, 0, 0, "Filebase Virtual Path Prefix" ,startup.file_vpath_prefix, sizeof(startup.file_vpath_prefix)-1, K_EDIT); break; - case 18: + case 14: startup.file_vpath_for_vhosts = !startup.file_vpath_for_vhosts; break; - case 19: + case 15: uifc.input(WIN_MID|WIN_SAV, 0, 0, "Authentication Methods" ,startup.default_auth_list, sizeof(startup.default_auth_list)-1, K_EDIT); break; - case 20: + case 16: SAFEPRINTF(str, "%u", startup.outbuf_drain_timeout); if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "Output Buffer Drain Timeout (milliseconds)" ,str, 5, K_NUMBER|K_EDIT) > 0) startup.outbuf_drain_timeout = atoi(str); break; - case 21: + case 17: startup.options ^= BBS_OPT_NO_HOST_LOOKUP; break; - case 22: + case 18: startup.options ^= WEB_OPT_NO_CGI; break; - case 23: + case 19: + if(startup.options & WEB_OPT_NO_CGI) + break; uifc.input(WIN_MID|WIN_SAV, 0, 0, "CGI Directory" ,startup.cgi_dir, sizeof(startup.cgi_dir)-1, K_EDIT); break; - case 24: + case 20: + if(startup.options & WEB_OPT_NO_CGI) + break; strListCombine(startup.cgi_ext, str, sizeof(str), ", "); if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "CGI File Extensions", str, sizeof(str)-1, K_EDIT) >= 0) { strListFree(&startup.cgi_ext); @@ -911,22 +984,26 @@ static void websrvr_cfg(void) uifc.changes = true; } break; - case 25: + case 21: + if(startup.options & WEB_OPT_NO_CGI) + break; uifc.input(WIN_MID|WIN_SAV, 0, 0, "Default CGI MIME Content-Type" ,startup.default_cgi_content, sizeof(startup.default_cgi_content)-1, K_EDIT); break; - case 26: + case 22: + if(startup.options & WEB_OPT_NO_CGI) + break; duration_to_str(startup.max_cgi_inactivity, str, sizeof(str)); if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "Maximum CGI Inactivity", str, 10, K_EDIT) > 0) startup.max_cgi_inactivity = (uint16_t)parse_duration(str); break; - case 27: + case 23: getar("Web Server Login", startup.login_ars); break; - case 28: + case 24: js_startup_cfg(&startup.js); break; - case 29: + case 25: login_attempt_cfg(&startup.login_attempt); break; default: @@ -1183,12 +1260,16 @@ static void sendmail_cfg(mail_startup_t* startup) while(1) { int i = 0; snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Enabled", startup->options & MAIL_OPT_NO_SENDMAIL ? "No" : "Yes"); - snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Rescan Interval", vduration(startup->rescan_frequency)); - snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Connect Timeout", vduration(startup->connect_timeout)); - snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Auto-exempt Recipients", startup->options & MAIL_OPT_NO_AUTO_EXEMPT ? "No" : "Yes"); + snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Rescan Interval" + ,startup->options & MAIL_OPT_NO_SENDMAIL ? "N/A" : vduration(startup->rescan_frequency)); + snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Connect Timeout" + ,startup->options & MAIL_OPT_NO_SENDMAIL ? "N/A" : vduration(startup->connect_timeout)); + snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Auto-exempt Recipients" + ,startup->options & MAIL_OPT_NO_SENDMAIL ? "N/A" : startup->options & MAIL_OPT_NO_AUTO_EXEMPT ? "No" : "Yes"); snprintf(opt[i++], MAX_OPLN, "%-30s%u", "Max Delivery Attempts", startup->max_delivery_attempts); - bool applicable = startup->options & MAIL_OPT_RELAY_TX; - snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Delivery Method", applicable ? "Relay" : "Direct"); + bool applicable = (startup->options & (MAIL_OPT_RELAY_TX | MAIL_OPT_NO_SENDMAIL)) == MAIL_OPT_RELAY_TX; + snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Delivery Method" + ,startup->options & MAIL_OPT_NO_SENDMAIL ? "N/A" : applicable ? "Relay" : "Direct"); if(applicable) { snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Relay Server Address", startup->relay_server); snprintf(opt[i++], MAX_OPLN, "%-30s%u", "Relay Server TCP Port", startup->relay_port); @@ -1206,12 +1287,10 @@ static void sendmail_cfg(mail_startup_t* startup) snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Relay Server Password", startup->relay_pass); } } - if(startup->options & MAIL_OPT_NO_SENDMAIL) - i = 1; opt[i][0] = '\0'; uifc.helpbuf= - "`SendMail Thread Configuration:`\n" + "`SendMail Configuration:`\n" "\n" "Set the operating parameters of the Synchronet Mail Server SendMail\n" "Thread.\n" @@ -1219,29 +1298,39 @@ static void sendmail_cfg(mail_startup_t* startup) "For full documentation, see `http://wiki.synchro.net/server:mail`\n" ; switch(uifc.list(WIN_ACT|WIN_ESC|WIN_BOT|WIN_SAV, 0, 0, 0, &cur, &bar - ,"SendMail Thread",opt)) { + ,"SendMail Support",opt)) { case 0: startup->options ^= MAIL_OPT_NO_SENDMAIL; break; case 1: + if(startup->options & MAIL_OPT_NO_SENDMAIL) + break; SAFECOPY(str, duration(startup->rescan_frequency, false)); if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "MailBase Rescan Interval", str, 5, K_EDIT) > 0) startup->rescan_frequency = (uint16_t)parse_duration(str); break; case 2: + if(startup->options & MAIL_OPT_NO_SENDMAIL) + break; SAFECOPY(str, duration(startup->connect_timeout, false)); if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "SendMail Connect Timeout", str, 5, K_EDIT) > 0) startup->connect_timeout = (uint32_t)parse_duration(str); break; case 3: + if(startup->options & MAIL_OPT_NO_SENDMAIL) + break; startup->options ^= MAIL_OPT_NO_AUTO_EXEMPT; break; case 4: + if(startup->options & MAIL_OPT_NO_SENDMAIL) + break; SAFEPRINTF(str, "%u", startup->max_delivery_attempts); if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "Maximum Number of SendMail Delivery Attempts", str, 5, K_NUMBER|K_EDIT) > 0) startup->max_delivery_attempts = atoi(str); break; case 5: + if(startup->options & MAIL_OPT_NO_SENDMAIL) + break; startup->options ^= MAIL_OPT_RELAY_TX; break; case 6: @@ -1294,6 +1383,122 @@ static void sendmail_cfg(mail_startup_t* startup) } } +static void submission_srvr_cfg(mail_startup_t* startup) +{ + static int cur, bar; + char str[256]; + + while(1) { + int i = 0; + snprintf(opt[i++], MAX_OPLN, "%-10s%s", "Enabled", startup->options & MAIL_OPT_USE_SUBMISSION_PORT ? "Yes" : "No"); + snprintf(opt[i++], MAX_OPLN, "%-10s%u", "Port", startup->submission_port); + opt[i][0] = '\0'; + + switch(uifc.list(WIN_ACT|WIN_ESC|WIN_MID|WIN_SAV, 0, 0, 0, &cur, &bar + ,"Submission Support",opt)) { + case 0: + startup->options ^= MAIL_OPT_USE_SUBMISSION_PORT; + break; + case 1: + if(!(startup->options & MAIL_OPT_USE_SUBMISSION_PORT)) + break; + SAFEPRINTF(str, "%u", startup->submission_port); + if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "SMTP-Submission TCP Port", str, 5, K_NUMBER|K_EDIT) > 0) + startup->submission_port = atoi(str); + break; + default: + return; + } + } +} + +static void submissions_srvr_cfg(mail_startup_t* startup) +{ + static int cur, bar; + char str[256]; + + while(1) { + int i = 0; + snprintf(opt[i++], MAX_OPLN, "%-10s%s", "Enabled", startup->options & MAIL_OPT_TLS_SUBMISSION ? "Yes" : "No"); + snprintf(opt[i++], MAX_OPLN, "%-10s%u", "Port", startup->submissions_port); + opt[i][0] = '\0'; + + switch(uifc.list(WIN_ACT|WIN_ESC|WIN_MID|WIN_SAV, 0, 0, 0, &cur, &bar + ,"Submission/TLS Support",opt)) { + case 0: + startup->options ^= MAIL_OPT_TLS_SUBMISSION; + break; + case 1: + if(!(startup->options & MAIL_OPT_TLS_SUBMISSION)) + break; + SAFEPRINTF(str, "%u", startup->submissions_port); + if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "SMTP-Submission/TLS TCP Port", str, 5, K_NUMBER|K_EDIT) > 0) + startup->submissions_port = atoi(str); + break; + default: + return; + } + } +} + +static void pop3_srvr_cfg(mail_startup_t* startup) +{ + static int cur, bar; + char str[256]; + + while(1) { + int i = 0; + snprintf(opt[i++], MAX_OPLN, "%-10s%s", "Enabled", startup->options & MAIL_OPT_ALLOW_POP3 ? "Yes" : "No"); + snprintf(opt[i++], MAX_OPLN, "%-10s%u", "Port", startup->pop3_port); + opt[i][0] = '\0'; + + switch(uifc.list(WIN_ACT|WIN_ESC|WIN_MID|WIN_SAV, 0, 0, 0, &cur, &bar + ,"POP3 Support",opt)) { + case 0: + startup->options ^= MAIL_OPT_ALLOW_POP3; + break; + case 1: + if(!(startup->options & MAIL_OPT_ALLOW_POP3)) + break; + SAFEPRINTF(str, "%u", startup->pop3_port); + if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "POP3 TCP Port", str, 5, K_NUMBER|K_EDIT) > 0) + startup->pop3_port = atoi(str); + break; + default: + return; + } + } +} + +static void pop3s_srvr_cfg(mail_startup_t* startup) +{ + static int cur, bar; + char str[256]; + + while(1) { + int i = 0; + snprintf(opt[i++], MAX_OPLN, "%-10s%s", "Enabled", startup->options & MAIL_OPT_TLS_POP3 ? "Yes" : "No"); + snprintf(opt[i++], MAX_OPLN, "%-10s%u", "Port", startup->pop3s_port); + opt[i][0] = '\0'; + + switch(uifc.list(WIN_ACT|WIN_ESC|WIN_MID|WIN_SAV, 0, 0, 0, &cur, &bar + ,"POP3/TLS Support",opt)) { + case 0: + startup->options ^= MAIL_OPT_TLS_POP3; + break; + case 1: + if(!(startup->options & MAIL_OPT_TLS_POP3)) + break; + SAFEPRINTF(str, "%u", startup->pop3s_port); + if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "POP3/TLS TCP Port", str, 5, K_NUMBER|K_EDIT) > 0) + startup->pop3s_port = atoi(str); + break; + default: + return; + } + } +} + static void mailsrvr_cfg(void) { static int cur, bar; @@ -1333,18 +1538,19 @@ static void mailsrvr_cfg(void) snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Enabled", enabled ? "Yes" : "No"); snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Log Level", iniLogLevelStringList()[startup.log_level]); snprintf(opt[i++], MAX_OPLN, "%-30s%s", "SMTP Interfaces", strListCombine(startup.interfaces, tmp, sizeof(tmp), ", ")); - snprintf(opt[i++], MAX_OPLN, "%-30s%u", "SMTP Port", startup.smtp_port); - snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Submission Support", startup.options & MAIL_OPT_USE_SUBMISSION_PORT ? "Yes" : "No"); - snprintf(opt[i++], MAX_OPLN, "%-30s%u", "Submission Port", startup.submission_port); - snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Submission/TLS Support", startup.options & MAIL_OPT_TLS_SUBMISSION ? "Yes" : "No"); - snprintf(opt[i++], MAX_OPLN, "%-30s%u", "Submission/TLS Port", startup.submissions_port); - snprintf(opt[i++], MAX_OPLN, "%-30s%s", "POP3 Support", startup.options & MAIL_OPT_ALLOW_POP3 ? "Yes" : "No"); + snprintf(str, sizeof str, "Port %u", startup.smtp_port); + snprintf(opt[i++], MAX_OPLN, "%-30s%s", "SMTP Support", str); + snprintf(str, sizeof str, "Port %u", startup.submission_port); + snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Submission Support", startup.options & MAIL_OPT_USE_SUBMISSION_PORT ? str : strDisabled); + snprintf(str, sizeof str, "Port %u", startup.submissions_port); + snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Submission/TLS Support", startup.options & MAIL_OPT_TLS_SUBMISSION ? str : strDisabled); snprintf(opt[i++], MAX_OPLN, "%-30s%s", "POP3 Interfaces" ,startup.options & (MAIL_OPT_ALLOW_POP3 | MAIL_OPT_TLS_POP3) ? strListCombine(startup.pop3_interfaces, tmp, sizeof(tmp), ", ") : "N/A"); - snprintf(opt[i++], MAX_OPLN, "%-30s%u", "POP3 Port", startup.pop3_port); - snprintf(opt[i++], MAX_OPLN, "%-30s%s", "POP3/TLS Support", startup.options & MAIL_OPT_TLS_POP3 ? "Yes" : "No"); - snprintf(opt[i++], MAX_OPLN, "%-30s%u", "POP3/TLS Port", startup.pop3s_port); + snprintf(str, sizeof str, "Port %u", startup.pop3_port); + snprintf(opt[i++], MAX_OPLN, "%-30s%s", "POP3 Support", startup.options & MAIL_OPT_ALLOW_POP3 ? str : strDisabled); + snprintf(str, sizeof str, "Port %u", startup.pop3s_port); + snprintf(opt[i++], MAX_OPLN, "%-30s%s", "POP3/TLS Support", startup.options & MAIL_OPT_TLS_POP3 ? str : strDisabled); snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Max Clients", maximum(startup.max_clients)); snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Max Inactivity", vduration(startup.max_inactivity)); snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Max Concurrent Connections", maximum(startup.max_concurrent_connections)); @@ -1370,7 +1576,7 @@ static void mailsrvr_cfg(void) snprintf(opt[i++], MAX_OPLN, "%-30s%s%s", "DNS-Blacklisted Servers", startup.options & MAIL_OPT_DNSBL_THROTTLE ? "Throttle and " : "", p); snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Hash DNS-Blacklisted Msgs", startup.options & MAIL_OPT_DNSBL_SPAMHASH ? "Yes" : "No"); snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Kill SPAM When Read", startup.options & MAIL_OPT_KILL_READ_SPAM ? "Yes": "No"); - snprintf(opt[i++], MAX_OPLN, "%-30s%s", "SendMail Thread...", startup.options & MAIL_OPT_NO_SENDMAIL ? strDisabled : ""); + snprintf(opt[i++], MAX_OPLN, "%-30s%s", "SendMail Support...", startup.options & MAIL_OPT_NO_SENDMAIL ? strDisabled : ""); snprintf(opt[i++], MAX_OPLN, "%-30s%s", "Login Requirements", startup.login_ars); strcpy(opt[i++], "JavaScript Settings..."); strcpy(opt[i++], "Failed Login Attempts..."); @@ -1410,25 +1616,12 @@ static void mailsrvr_cfg(void) startup.smtp_port = atoi(str); break; case 4: - startup.options ^= MAIL_OPT_USE_SUBMISSION_PORT; + submission_srvr_cfg(&startup); break; case 5: - SAFEPRINTF(str, "%u", startup.submission_port); - if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "SMTP-Submission TCP Port", str, 5, K_NUMBER|K_EDIT) > 0) - startup.submission_port = atoi(str); + submissions_srvr_cfg(&startup); break; case 6: - startup.options ^= MAIL_OPT_TLS_SUBMISSION; - break; - case 7: - SAFEPRINTF(str, "%u", startup.submissions_port); - if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "SMTP-Submission/TLS TCP Port", str, 5, K_NUMBER|K_EDIT) > 0) - startup.submissions_port = atoi(str); - break; - case 8: - startup.options ^= MAIL_OPT_ALLOW_POP3; - break; - case 9: strListCombine(startup.pop3_interfaces, str, sizeof(str), ", "); if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "POP3 Network Interfaces (IPv4/6)", str, sizeof(str)-1, K_EDIT) >= 0) { strListFree(&startup.pop3_interfaces); @@ -1436,75 +1629,68 @@ static void mailsrvr_cfg(void) uifc.changes = true; } break; - case 10: - SAFEPRINTF(str, "%u", startup.pop3_port); - if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "POP3 TCP Port", str, 5, K_NUMBER|K_EDIT) > 0) - startup.pop3_port = atoi(str); - break; - case 11: - startup.options ^= MAIL_OPT_TLS_POP3; + case 7: + pop3_srvr_cfg(&startup); break; - case 12: - SAFEPRINTF(str, "%u", startup.pop3s_port); - if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "POP3/TLS TCP Port", str, 5, K_NUMBER|K_EDIT) > 0) - startup.pop3s_port = atoi(str); + case 8: + pop3s_srvr_cfg(&startup); break; - case 13: + case 9: SAFECOPY(str, maximum(startup.max_clients)); if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "Maximum Client Count (0=Unlimited)", str, 10, K_EDIT) > 0) startup.max_clients = atoi(str); break; - case 14: + case 10: SAFECOPY(str, duration(startup.max_inactivity, false)); if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "Maximum Client Inactivity", str, 10, K_EDIT) > 0) startup.max_inactivity = (uint16_t)parse_duration(str); break; - case 15: + case 11: SAFECOPY(str, maximum(startup.max_concurrent_connections)); if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "Maximum Concurrent (Unauthenticated) Connections", str, 10, K_EDIT) > 0) startup.max_concurrent_connections = atoi(str); break; - case 16: + case 12: SAFECOPY(str, maximum(startup.max_recipients)); if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "Maximum Recipients per Message", str, 10, K_EDIT) > 0) startup.max_recipients = atoi(str); break; - case 17: + case 13: SAFECOPY(str, maximum(startup.max_msgs_waiting)); if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "Maximum Messages Waiting per User", str, 10, K_EDIT) > 0) startup.max_msgs_waiting = atoi(str); break; - case 18: + case 14: byte_count_to_str(startup.max_msg_size, str, sizeof(str)); if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "Maximum Received Message Size (in bytes)", str, 10, K_EDIT) > 0) startup.max_msg_size = (uint32_t)parse_byte_count(str, 1); break; - case 19: + case 15: uifc.input(WIN_MID|WIN_SAV, 0, 0, "Default Recipient (user alias)" ,startup.default_user, sizeof(startup.default_user)-1, K_EDIT); break; - case 20: + case 16: startup.options ^= MAIL_OPT_ALLOW_RX_BY_NUMBER; break; - case 21: + case 17: startup.options ^= MAIL_OPT_ALLOW_SYSOP_ALIASES; break; - case 22: + case 18: startup.options ^= MAIL_OPT_NO_NOTIFY; break; - case 23: + case 19: startup.notify_offline_users = !startup.notify_offline_users; break; - case 24: + case 20: startup.options ^= MAIL_OPT_ALLOW_RELAY; break; - case 25: + case 21: startup.options ^= BBS_OPT_NO_HOST_LOOKUP; break; - case 26: + case 22: startup.options ^= MAIL_OPT_DNSBL_CHKRECVHDRS; break; - case 27: + case 23: i = 0; strcpy(opt[i++], "Refuse Session"); strcpy(opt[i++], "Silently Ignore"); @@ -1540,22 +1726,22 @@ static void mailsrvr_cfg(void) else startup.options &= ~MAIL_OPT_DNSBL_THROTTLE; break; - case 28: + case 24: startup.options ^= MAIL_OPT_DNSBL_SPAMHASH; break; - case 29: + case 25: startup.options ^= MAIL_OPT_KILL_READ_SPAM; break; - case 30: + case 26: sendmail_cfg(&startup); break; - case 31: + case 27: getar("Mail Server Login", startup.login_ars); break; - case 32: + case 28: js_startup_cfg(&startup.js); break; - case 33: + case 29: login_attempt_cfg(&startup.login_attempt); break; default: