// The VRFY and EXPN commands have been removed from this implementation
// because nobody uses these commands anymore, except for spammers.
//
-// Copyright (c) 1998-2022 by the citadel.org team
+// Copyright (c) 1998-2023 by the citadel.org team
//
// This program is open source software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 3.
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
+#include <assert.h>
#include <libcitadel.h>
-#include "../../citadel.h"
+#include "../../citadel_defs.h"
#include "../../server.h"
#include "../../citserver.h"
#include "../../support.h"
else
cprintf("550 %s\r\n", message_to_spammer);
CC->kill_me = KILLME_SPAMMER;
- /* no need to free_recipients(valid), it's not allocated yet */
+ // no need to free_recipients(valid), it's not allocated yet
return;
}
}
}
else {
if (which_command == EHLO) {
- cprintf("250-Hello %s (%s [%s])\r\n",
- ChrPtr(SMTP->helo_node),
- CC->cs_host,
- CC->cs_addr
- );
+ cprintf("250-Hello %s (%s [%s])\r\n", ChrPtr(SMTP->helo_node), CC->cs_host, CC->cs_addr);
}
else {
cprintf("250-Greetings and joyous salutations.\r\n");
cprintf("250-SIZE %ld\r\n", CtdlGetConfigLong("c_maxmsglen"));
#ifdef HAVE_OPENSSL
- // Offer TLS, but only if TLS is not already active.
- // Furthermore, only offer TLS when running on
- // the SMTP-MSA port, not on the SMTP-MTA port, due to
- // questionable reliability of TLS in certain sending MTA's.
- if ( (!CC->redirect_ssl) && (SMTP->is_msa) ) {
+ // Offer the STARTTLS option...
+ if ( (!CC->redirect_ssl) // not if we're already TLS
+ && ( (SMTP->is_msa) // Always on port 587
+ || (CtdlGetConfigInt("smtp_advertise_starttls") != 0) // On port 25 only if enabled
+ )
+ ) {
cprintf("250-STARTTLS\r\n");
}
#endif
if ( !CM_IsEmpty(msg, eMsgSubject) && (!strcasecmp(msg->cm_fields[eMsgSubject], "__ WebCit Preferences __"))) {
// This is it! Change ownership of the message text so it doesn't get freed.
- *webcit_conf = (char *)msg->cm_fields[eMesageText];
- msg->cm_fields[eMesageText] = NULL;
+ *webcit_conf = (char *)msg->cm_fields[eMessageText];
+ msg->cm_fields[eMessageText] = NULL;
}
CM_Free(msg);
}
StrBufDecodeBase64(UserName);
if (CtdlLoginExistingUser(ChrPtr(UserName)) == login_ok) {
- size_t len = CtdlEncodeBase64(buf, "Password:", 9, 0);
+ size_t len = CtdlEncodeBase64(buf, "Password:", 9, BASE64_NO_LINEBREAKS);
if (buf[len - 1] == '\n') {
buf[len - 1] = '\0';
smtp_get_user(11);
}
else {
- size_t len = CtdlEncodeBase64(username_prompt, "Username:", 9, 0);
+ size_t len = CtdlEncodeBase64(username_prompt, "Username:", 9, BASE64_NO_LINEBREAKS);
if (username_prompt[len - 1] == '\n') {
username_prompt[len - 1] = '\0';
}
return;
}
- len = extract_token(encoded_authstring,
- ChrPtr(SMTP->Cmd) + 5,
- 1, ' ',
- sizeof encoded_authstring);
+ len = extract_token(encoded_authstring, ChrPtr(SMTP->Cmd) + 5, 1, ' ', sizeof encoded_authstring);
StrBufPlain(SMTP->Cmd, encoded_authstring, len);
smtp_try_plain();
return;
((CtdlGetConfigInt("c_rfc822_strict_from") == CFG_SMTP_FROM_CORRECT) ||
(CtdlGetConfigInt("c_rfc822_strict_from") == CFG_SMTP_FROM_REJECT) ) )
{
- if (!IsEmptyStr(CC->cs_inet_email))
+ if (!IsEmptyStr(CC->cs_inet_email)) {
validemail = strcmp(CC->cs_inet_email, msg->cm_fields[erFc822Addr]) == 0;
- if ((!validemail) &&
- (!IsEmptyStr(CC->cs_inet_other_emails)))
- {
+ }
+ if ((!validemail) && (!IsEmptyStr(CC->cs_inet_other_emails))) {
int num_secondary_emails = 0;
int i;
num_secondary_emails = num_tokens(CC->cs_inet_other_emails, '|');
return;
}
- CM_SetField(msg, eOriginalRoom, HKEY(MAILROOM));
+ CM_SetField(msg, eOriginalRoom, MAILROOM);
if (SMTP->preferred_sender_name != NULL)
- CM_SetField(msg, eAuthor, SKEY(SMTP->preferred_sender_name));
+ CM_SetField(msg, eAuthor, ChrPtr(SMTP->preferred_sender_name));
else
- CM_SetField(msg, eAuthor, CC->user.fullname, strlen(CC->user.fullname));
+ CM_SetField(msg, eAuthor, CC->user.fullname);
if (!validemail) {
if (SMTP->preferred_sender_email != NULL) {
- CM_SetField(msg, erFc822Addr, SKEY(SMTP->preferred_sender_email));
+ CM_SetField(msg, erFc822Addr, ChrPtr(SMTP->preferred_sender_email));
}
else {
- CM_SetField(msg, erFc822Addr, CC->cs_inet_email, strlen(CC->cs_inet_email));
+ CM_SetField(msg, erFc822Addr, CC->cs_inet_email);
}
}
}
// Set the "envelope from" address
- CM_SetField(msg, eMessagePath, SKEY(SMTP->from));
+ CM_SetField(msg, eMessagePath, ChrPtr(SMTP->from));
// Set the "envelope to" address
- CM_SetField(msg, eenVelopeTo, SKEY(SMTP->recipients));
+ CM_SetField(msg, eenVelopeTo, ChrPtr(SMTP->recipients));
// Submit the message into the Citadel system.
valid = validate_recipients(
if (scan_errors > 0) { // We don't want this message!
if (CM_IsEmpty(msg, eErrorMsg)) {
- CM_SetField(msg, eErrorMsg, HKEY("Message rejected by filter"));
+ CM_SetField(msg, eErrorMsg, "Message rejected by filter");
}
StrBufPrintf(SMTP->OneRcpt, "550 %s\r\n", msg->cm_fields[eErrorMsg]);
void smtp_command_loop(void) {
static const ConstStr AuthPlainStr = {HKEY("AUTH PLAIN")};
- if (SMTP == NULL) {
- syslog(LOG_ERR, "serv_smtp: Session SMTP data is null. WTF? We will crash now.");
- abort();
- }
+ assert(SMTP != NULL);
time(&CC->lastcmd);
if (CtdlClientGetLine(SMTP->Cmd) < 1) {
}
-/*****************************************************************************/
-/* MODULE INITIALIZATION STUFF */
-/*****************************************************************************/
-/*
- * This cleanup function blows away the temporary memory used by
- * the SMTP server.
- */
-void smtp_cleanup_function(void)
-{
- /* Don't do this stuff if this is not an SMTP session! */
+// *****************************************************************************
+// * MODULE INITIALIZATION STUFF *
+// *****************************************************************************
+
+// This cleanup function blows away the temporary memory used by
+// the SMTP server.
+void smtp_cleanup_function(void) {
+ // Don't do this stuff if this is not an SMTP session!
if (CC->h_command_function != smtp_command_loop) return;
syslog(LOG_DEBUG, "Performing SMTP cleanup hook");
// Initialization function, called from modules_init.c
char *ctdl_module_init_smtp(void) {
if (!threading) {
- CtdlRegisterServiceHook(CtdlGetConfigInt("c_smtp_port"), /* SMTP MTA */
+ CtdlRegisterServiceHook(CtdlGetConfigInt("c_smtp_port"), // SMTP MTA
NULL,
smtp_mta_greeting,
smtp_command_loop,
CitadelServiceSMTP_MTA);
#ifdef HAVE_OPENSSL
- CtdlRegisterServiceHook(CtdlGetConfigInt("c_smtps_port"), /* SMTPS MTA */
+ CtdlRegisterServiceHook(CtdlGetConfigInt("c_smtps_port"), // SMTPS MTA
NULL,
smtps_greeting,
smtp_command_loop,
CitadelServiceSMTPS_MTA);
#endif
- CtdlRegisterServiceHook(CtdlGetConfigInt("c_msa_port"), /* SMTP MSA */
+ CtdlRegisterServiceHook(CtdlGetConfigInt("c_msa_port"), // SMTP MSA
NULL,
smtp_msa_greeting,
smtp_command_loop,
NULL,
CitadelServiceSMTP_MSA);
- CtdlRegisterServiceHook(0, /* local LMTP */
+ CtdlRegisterServiceHook(0, // local LMTP
file_lmtp_socket,
lmtp_greeting,
smtp_command_loop,
NULL,
CitadelServiceSMTP_LMTP);
- CtdlRegisterServiceHook(0, /* local LMTP */
+ CtdlRegisterServiceHook(0, // local LMTP
file_lmtp_unfiltered_socket,
lmtp_unfiltered_greeting,
smtp_command_loop,
CtdlRegisterSessionHook(smtp_cleanup_function, EVT_STOP, PRIO_STOP + 250);
}
- /* return our module name for the log */
+ // return our module name for the log
return "smtp";
}