From: Art Cancro Date: Fri, 7 Jun 2002 22:10:51 +0000 (+0000) Subject: * Added a new message function hook type EVT_SMTPSCAN which permits modules to X-Git-Tag: v7.86~6381 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=9efc6048ae21ab4e374ac4d22a1e4c50740d48be * Added a new message function hook type EVT_SMTPSCAN which permits modules to register hooks that can scan incoming SMTP messages and elect to reject them (due to virus or spam content, for example). --- diff --git a/citadel/ChangeLog b/citadel/ChangeLog index 2768183f4..0a8ba560f 100644 --- a/citadel/ChangeLog +++ b/citadel/ChangeLog @@ -1,4 +1,9 @@ $Log$ + Revision 591.36 2002/06/07 22:10:51 ajc + * Added a new message function hook type EVT_SMTPSCAN which permits modules to + register hooks that can scan incoming SMTP messages and elect to reject them + (due to virus or spam content, for example). + Revision 591.35 2002/06/07 03:22:13 ajc * Added a module "serv_mrtg" which allows activity reporting to MRTG (http://www.mrtg.org) -- this will replace our stats program. @@ -3692,3 +3697,4 @@ Sat Jul 11 00:20:48 EDT 1998 Nathan Bryant Fri Jul 10 1998 Art Cancro * Initial CVS import + diff --git a/citadel/serv_smtp.c b/citadel/serv_smtp.c index 6617cc2c4..43896c280 100644 --- a/citadel/serv_smtp.c +++ b/citadel/serv_smtp.c @@ -457,6 +457,7 @@ void smtp_data(void) { long msgnum; char nowstamp[SIZ]; struct recptypes *valid; + int scan_errors; if (strlen(SMTP->from) == 0) { cprintf("503 Need MAIL command first.\r\n"); @@ -508,17 +509,35 @@ void smtp_data(void) { /* Submit the message into the Citadel system. */ valid = validate_recipients(SMTP->recipients); - msgnum = CtdlSubmitMsg(msg, valid, ""); - CtdlFreeMessage(msg); - phree(valid); - if (msgnum > 0L) { - cprintf("250 Message accepted.\r\n"); + /* If there are modules that want to scan this message before final + * submission (such as virus checkers or spam filters), call them now + * and give them an opportunity to reject the message. + */ + scan_errors = PerformMessageHooks(msg, EVT_SMTPSCAN); + + if (scan_errors > 0) { /* We don't want this message! */ + + if (msg->cm_fields['0'] == NULL) { + msg->cm_fields['0'] = strdoop( + "Message rejected by filter"); + } + + cprintf("552 %s\r\n", msg->cm_fields['0']); } - else { - cprintf("550 Internal delivery error\r\n"); + + else { /* Ok, we'll accept this message. */ + msgnum = CtdlSubmitMsg(msg, valid, ""); + if (msgnum > 0L) { + cprintf("250 Message accepted.\r\n"); + } + else { + cprintf("550 Internal delivery error\r\n"); + } } + CtdlFreeMessage(msg); + phree(valid); smtp_data_clear(); /* clear out the buffers now */ } diff --git a/citadel/server.h b/citadel/server.h index c8cb89254..127be4c95 100644 --- a/citadel/server.h +++ b/citadel/server.h @@ -338,6 +338,7 @@ extern DLEXP struct MessageFunctionHook *MessageHookTable; #define EVT_BEFOREREAD 200 #define EVT_BEFORESAVE 201 #define EVT_AFTERSAVE 202 +#define EVT_SMTPSCAN 203 /* called before submitting a msg from SMTP */ diff --git a/citadel/techdoc/hack.txt b/citadel/techdoc/hack.txt index 90bbe404a..af5ce2cd1 100644 --- a/citadel/techdoc/hack.txt +++ b/citadel/techdoc/hack.txt @@ -117,6 +117,11 @@ T Date/Time A 32-bit integer containing the date and time of U Subject Optional. Developers may choose whether they wish to generate or display subject fields. Citadel/UX does not generate them, but it does print them when found. +0 Error This field is typically never found in a message on + disk or in transit. Message scanning modules are + expected to fill in this field when rejecting a message + with an explanation as to what happened (virus found, + message looks like spam, etc.) EXAMPLE