SMTP-Relay: add other ways of filtering
[citadel.git] / citadel / modules / smtp / serv_smtp.c
index d6f8e2a30e72ace82cfa10d1287a976d684a8a6a..a4e7d75afb00d2a131631eeb304950a881a85071 100644 (file)
@@ -690,17 +690,48 @@ void smtp_data(void) {
         * 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 */
@@ -961,7 +992,7 @@ CTDL_MODULE_INIT(smtp)
                                        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 */