* to something ugly like "0000058008.Sent Items>" when the message
* is read with a Citadel client.
*/
- if ( (CC->logged_in) && (config.c_rfc822_strict_from == 0) ) {
+ if ( (CC->logged_in) && (config.c_rfc822_strict_from != CFG_SMTP_FROM_NOFILTER) ) {
+ int validemail = 0;
+
+ if (!IsEmptyStr(msg->cm_fields['F']) &&
+ ((config.c_rfc822_strict_from == CFG_SMTP_FROM_CORRECT) ||
+ (config.c_rfc822_strict_from == CFG_SMTP_FROM_REJECT) ) )
+ {
+ if (!IsEmptyStr(CC->cs_inet_email))
+ validemail = strcmp(CC->cs_inet_email, msg->cm_fields['F']) == 0;
+ 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, '|');
+ for (i=0; i < num_secondary_emails && !validemail; ++i) {
+ char buf[256];
+ extract_token(buf, CC->cs_inet_other_emails,i,'|',sizeof CC->cs_inet_other_emails);
+ validemail = strcmp(buf, msg->cm_fields['F']) == 0;
+ }
+ }
+ }
+
+ if (!validemail && (config.c_rfc822_strict_from == CFG_SMTP_FROM_REJECT)) {
+ syslog(LOG_ERR, "invalid sender '%s' - rejecting this message", msg->cm_fields['F']);
+ cprintf("550 Invalid sender '%s' - rejecting this message.\r\n", msg->cm_fields['F']);
+ return;
+ }
+
if (msg->cm_fields['A'] != NULL) free(msg->cm_fields['A']);
if (msg->cm_fields['N'] != NULL) free(msg->cm_fields['N']);
if (msg->cm_fields['H'] != NULL) free(msg->cm_fields['H']);
- if (msg->cm_fields['F'] != NULL) free(msg->cm_fields['F']);
if (msg->cm_fields['O'] != NULL) free(msg->cm_fields['O']);
msg->cm_fields['A'] = strdup(CC->user.fullname);
msg->cm_fields['N'] = strdup(config.c_nodename);
msg->cm_fields['H'] = strdup(config.c_humannode);
- msg->cm_fields['F'] = strdup(CC->cs_inet_email);
msg->cm_fields['O'] = strdup(MAILROOM);
+
+ if (!validemail) {
+ if (msg->cm_fields['F'] != NULL) free(msg->cm_fields['F']);
+ msg->cm_fields['F'] = strdup(CC->cs_inet_email);
+ }
}
/* Set the "envelope from" address */
NULL,
CitadelServiceSMTP_LMTP_UNF);
- CtdlRegisterSessionHook(smtp_cleanup_function, EVT_STOP);
+ CtdlRegisterSessionHook(smtp_cleanup_function, EVT_STOP, PRIO_STOP + 250);
}
/* return our module name for the log */