]> code.citadel.org Git - citadel.git/blobdiff - citadel/serv_smtp.c
* Any "delete message" operation which is synchronous to a client is now
[citadel.git] / citadel / serv_smtp.c
index 770a254c55058743b523e20a2ca5509ffe7d9c60..91e8ed50ad9b1083aeba9bec33b493884dbd0caf 100644 (file)
@@ -92,6 +92,7 @@ struct citsmtp {              /* Information about the current session */
        int delivery_mode;
        int message_originated_locally;
        int is_lmtp;
+       int is_unfiltered;
        int is_msa;
 };
 
@@ -168,6 +169,16 @@ void lmtp_greeting(void) {
 }
 
 
+/*
+ * We also have an unfiltered LMTP socket that bypasses spam filters.
+ */
+void lmtp_unfiltered_greeting(void) {
+       smtp_greeting();
+       SMTP->is_lmtp = 1;
+       SMTP->is_unfiltered = 1;
+}
+
+
 /*
  * Login greeting common to all auth methods
  */
@@ -276,7 +287,7 @@ void smtp_get_user(char *argbuf) {
        char username[SIZ];
 
        CtdlDecodeBase64(username, argbuf, SIZ);
-       lprintf(CTDL_DEBUG, "Trying <%s>\n", username);
+       /* lprintf(CTDL_DEBUG, "Trying <%s>\n", username); */
        if (CtdlLoginExistingUser(username) == login_ok) {
                CtdlEncodeBase64(buf, "Password:", 9);
                cprintf("334 %s\r\n", buf);
@@ -296,7 +307,7 @@ void smtp_get_pass(char *argbuf) {
        char password[SIZ];
 
        CtdlDecodeBase64(password, argbuf, SIZ);
-       lprintf(CTDL_DEBUG, "Trying <%s>\n", password);
+       /* lprintf(CTDL_DEBUG, "Trying <%s>\n", password); */
        if (CtdlTryPassword(password) == pass_ok) {
                smtp_auth_greeting();
        }
@@ -454,6 +465,7 @@ void smtp_expn(char *argbuf) {
  */
 void smtp_rset(int do_response) {
        int is_lmtp;
+       int is_unfiltered;
 
        /*
         * Our entire SMTP state is discarded when a RSET command is issued,
@@ -461,6 +473,7 @@ void smtp_rset(int do_response) {
         * we save it for later.
         */
        is_lmtp = SMTP->is_lmtp;
+       is_unfiltered = SMTP->is_unfiltered;
 
        memset(SMTP, 0, sizeof(struct citsmtp));
 
@@ -479,6 +492,7 @@ void smtp_rset(int do_response) {
         * Reinstate this little piece of information we saved (see above).
         */
        SMTP->is_lmtp = is_lmtp;
+       SMTP->is_unfiltered = is_unfiltered;
 
        if (do_response) {
                cprintf("250 2.0.0 Zap!\r\n");
@@ -724,7 +738,12 @@ void smtp_data(void) {
         * 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 (SMTP->is_unfiltered) {
+               scan_errors = 0;
+       }
+       else {
+               scan_errors = PerformMessageHooks(msg, EVT_SMTPSCAN);
+       }
 
        if (scan_errors > 0) {  /* We don't want this message! */
 
@@ -1508,8 +1527,8 @@ void smtp_do_procmsg(long msgnum, void *userdata) {
         * message and the message message.
         */
        if (incomplete_deliveries_remaining <= 0) {
-               CtdlDeleteMessages(SMTP_SPOOLOUT_ROOM, msgnum, "");
-               CtdlDeleteMessages(SMTP_SPOOLOUT_ROOM, text_msgid, "");
+               CtdlDeleteMessages(SMTP_SPOOLOUT_ROOM, msgnum, "", 0);
+               CtdlDeleteMessages(SMTP_SPOOLOUT_ROOM, text_msgid, "", 0);
        }
 
 
@@ -1518,7 +1537,7 @@ void smtp_do_procmsg(long msgnum, void *userdata) {
         * instructions and replace with the updated ones.
         */
        if (incomplete_deliveries_remaining > 0) {
-               CtdlDeleteMessages(SMTP_SPOOLOUT_ROOM, msgnum, "");
+               CtdlDeleteMessages(SMTP_SPOOLOUT_ROOM, msgnum, "", 0);
                msg = malloc(sizeof(struct CtdlMessage));
                memset(msg, 0, sizeof(struct CtdlMessage));
                msg->cm_magic = CTDLMESSAGE_MAGIC;
@@ -1687,10 +1706,26 @@ char *serv_smtp_init(void)
                                NULL);
 
        CtdlRegisterServiceHook(0,                      /* local LMTP */
-                               "lmtp.socket",
-                               lmtp_greeting,
-                               smtp_command_loop,
-                               NULL);
+#ifndef HAVE_RUN_DIR
+                                                       "."
+#else
+                                                       RUN_DIR
+#endif
+                                                       "/lmtp.socket",
+                                                       lmtp_greeting,
+                                                       smtp_command_loop,
+                                                       NULL);
+
+       CtdlRegisterServiceHook(0,                      /* local LMTP */
+#ifndef HAVE_RUN_DIR
+                                                       "."
+#else
+                                                       RUN_DIR
+#endif
+                                                       "/lmtp-unfiltered.socket",
+                                                       lmtp_unfiltered_greeting,
+                                                       smtp_command_loop,
+                                                       NULL);
 
        smtp_init_spoolout();
        CtdlRegisterSessionHook(smtp_do_queue, EVT_TIMER);