Modified to fill new header fiels in the mail table
authorMatthew Mondor <mmondor@pulsar-zone.net>
Mon, 19 Mar 2007 19:32:24 +0000 (19:32 +0000)
committerMatthew Mondor <mmondor@pulsar-zone.net>
Mon, 19 Mar 2007 19:32:24 +0000 (19:32 +0000)
mmsoftware/mmmail/src/mmsmtpd/mmsmtpd.c
mmsoftware/mmmail/src/mmsmtpd/mmsmtpd.h

index 87c734c..96afa00 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mmsmtpd.c,v 1.78 2007/03/19 09:00:10 mmondor Exp $ */
+/* $Id: mmsmtpd.c,v 1.79 2007/03/19 19:32:24 mmondor Exp $ */
 
 /*
  * Copyright (C) 2001-2007, Matthew Mondor
@@ -82,7 +82,7 @@
 
 MMCOPYRIGHT("@(#) Copyright (c) 2001-2007\n\
 \tMatthew Mondor. All rights reserved.\n");
-MMRCSID("$Id: mmsmtpd.c,v 1.78 2007/03/19 09:00:10 mmondor Exp $");
+MMRCSID("$Id: mmsmtpd.c,v 1.79 2007/03/19 19:32:24 mmondor Exp $");
 
 
 
@@ -1658,10 +1658,16 @@ validate_msg_line(char *line, ssize_t *len, int *res, void *udata)
            ud->msgid = TRUE;
        else if (mm_strncmp(line, "Date:", 5) == 0)
            ud->date = TRUE;
-       else if (mm_strncmp(line, "From:", 5) == 0)
+       else if (mm_strncmp(line, "From: ", 6) == 0 && !ud->from) {
            ud->from = TRUE;
-       else if (mm_strncmp(line, "To:", 3) == 0)
+           ud->h_from = mmstrdup(&line[6]);
+       } else if (mm_strncmp(line, "To: ", 4) == 0 && !ud->to) {
            ud->to = TRUE;
+           ud->h_to = mmstrdup(&line[4]);
+       } else if (mm_strncmp(line, "Subject: ", 9) == 0 && !ud->subject) {
+           ud->subject = TRUE;
+           ud->h_subject = mmstrdup(&line[9]);
+       }
 
        return FDBRB_OK;
 
@@ -1685,7 +1691,7 @@ endheader:
     ud->header = FALSE;
 
     {
-       char    tline[1024], tdata[32];
+       char    tline[1024], tdata[32], *cptr, *tptr;
 
        /* Create the headers we consider mendatory if they were not supplied.
         * We append them after all headers that were supplied, this way the
@@ -1695,24 +1701,32 @@ endheader:
         * by mmfd(3)'s fdbreadbuf(). Our additionnal expansion will never
         * exceed 320 bytes in this case.
         */
-       *tline = '\0';
+       cptr = tline;
+       *cptr = '\0';
        if (!ud->msgid) {
            iso_time(tdata);
-           (void) snprintf(tline, 1023, "Message-Id: <%s.%08lX-%lu@%s>\r\n",
-                           tdata, ud->clenv->id, ud->clenv->messages,
-                           ud->clenv->iface->hostname);
+           cptr += snprintf(cptr, 1023, "Message-Id: <%s.%08lX-%lu@%s>\r\n",
+                   tdata, ud->clenv->id, ud->clenv->messages,
+                   ud->clenv->iface->hostname);
        }
        if (!ud->date) {
            rfc_time(tdata);
-           (void) snprintf(tline, 1023, "%sDate: %s\r\n",
-                           tline, tdata);
+           cptr += snprintf(cptr, 1023 - (cptr - tline), "Date: %s\r\n", tdata);
+       }
+       if (!ud->from) {
+           tptr = cptr;
+           cptr += snprintf(cptr, 1023 - (cptr - tline), "From: <%s>\r\n",
+                   ud->clenv->from);
+           ud->h_from = mmstrdup(&tptr[6]);
+           ud->h_from[cptr - tptr - 8] = '\0';
+       }
+       if (!ud->to) {
+           tptr = cptr;
+           cptr += snprintf(cptr, 1023 - (cptr - tline),
+                   "To: undisclosed-recipients:;\r\n");
+           ud->h_to = mmstrdup(&tptr[4]);
+           ud->h_to[cptr - tptr - 8] = '\0';
        }
-       if (!ud->from)
-           (void) snprintf(tline, 1023, "%sFrom: %s\r\n",
-                           tline, ud->clenv->from);
-       if (!ud->to)
-           (void) snprintf(tline, 1023, "%sTo: undisclosed-recipients:;\r\n",
-                           tline);
 
        if (*len == 0) {
            /* Valid end of header, an empty line. If no headers to add, all
@@ -1721,8 +1735,12 @@ endheader:
             * contain a newline, we just copy it over the current line,
             * fdbreadbuf() will append an additional one automatically.
             */
-           if (*tline != '\0')
-               *len = (mm_strcpy(line, tline) - line);
+           if (cptr > tline) {
+               *cptr++ = '\0';
+               *len = cptr - tline;
+               mm_memcpy(line, tline, *len);
+               (*len)--;
+           }
        } else {
            /* Invalid end of header, we must insert our headers, if any,
             * before the current line, along with an empty line.
@@ -1731,9 +1749,7 @@ endheader:
             * long. However, this was a malformed message anyways and needed
             * major fixing. We could have errored instead if we were strict.
             */
-           (void) mm_strncat(tline, "\r\n", 1023);
-           (void) mm_strncat(tline, line, 1023);
-           *len = (mm_strcpy(line, tline) - line);
+           *len = snprintf(line, 1023, "\r\n%s\r\n", line);
        }
     }
 
@@ -1766,9 +1782,10 @@ do_data(clientenv *clenv)
      * See mmfd(3) man page for details, and mmlib/mmfd.c
      */
     ud.hops = 0;
-    ud.msgid = ud.date = ud.from = ud.to = FALSE;
+    ud.msgid = ud.date = ud.from = ud.to = ud.subject = FALSE;
     ud.header = TRUE;
     ud.clenv = clenv;
+    ud.h_from = ud.h_to = ud.h_subject = NULL;
     res = fdbreadbuf(&fdbrb, clenv->fdb, 32768, 1024, CONF.MAX_DATA_SIZE,
            CONF.MAX_DATA_LINES, validate_msg_line, &ud, FALSE);
 
@@ -1804,7 +1821,14 @@ do_data(clientenv *clenv)
     }
 
     if (ok)
-       ok = do_data_file(clenv, fdbrb);
+       ok = do_data_file(clenv, fdbrb, &ud);
+
+    if (ud.h_from != NULL)
+       mmstrfree(ud.h_from);
+    if (ud.h_to != NULL)
+       mmstrfree(ud.h_to);
+    if (ud.h_subject != NULL)
+       mmstrfree(ud.h_subject);
 
     fdbfreebuf(&fdbrb);        /* Internally only frees if not already freed */
     if (ok)
@@ -2035,7 +2059,8 @@ message_write(char *path, const char *recvline, size_t recvlen,
 
 /* For each RCPT, queue the message appropriately */
 static bool
-do_data_file(clientenv *clenv, struct fdbrb_buffer *fdbrb)
+do_data_file(clientenv *clenv, struct fdbrb_buffer *fdbrb,
+    struct validate_udata *ud)
 {
     char       smtptime[32], recvline[1024];
     rcptnode   *rnode;
@@ -2050,7 +2075,7 @@ do_data_file(clientenv *clenv, struct fdbrb_buffer *fdbrb)
        recvlen = do_data_received(recvline, 1024, clenv, rnode, smtptime);
        /* Queue for relaying or into the mailbox if local */
        if (!rnode->relay)
-           ok = do_data_queue_box(clenv, recvline, recvlen, fdbrb, rnode);
+           ok = do_data_queue_box(clenv, recvline, recvlen, fdbrb, rnode, ud);
        else {
            if (!CONF.RELAYING)
                ok = FALSE;
@@ -2068,11 +2093,11 @@ do_data_file(clientenv *clenv, struct fdbrb_buffer *fdbrb)
 /* Queue a message to a local mailbox */
 static bool
 do_data_queue_box(clientenv *clenv, const char *recvline, size_t recvlen,
-       struct fdbrb_buffer *fdbrb, rcptnode *rnode)
+       struct fdbrb_buffer *fdbrb, rcptnode *rnode, struct validate_udata *ud)
 {
     char       path[256], v[16];
     PGresult   *pgres;
-    const char *params[4];
+    const char *params[7];
 
     /* Obtain global lock. This ensures that both file and database data
      * are in sync and between both mmsmtpd and mmpop3d. Moreover, it even
@@ -2088,10 +2113,14 @@ do_data_queue_box(clientenv *clenv, const char *recvline, size_t recvlen,
     params[0] = rnode->address;
     params[1] = v;
     params[2] = path;
-    params[3] = NULL;
+    params[3] = ud->h_from;
+    params[4] = ud->h_to;
+    params[5] = ud->h_subject;
+    params[6] = NULL;
     if ((pgres = PQexecParams(clenv->pgconn,
-           "INSERT INTO mail (box,size,file) VALUES($1,$2,$3)", 3, NULL,
-           params, NULL, NULL, 0)) != NULL)
+           "INSERT INTO mail (box,size,file,h_from,h_to,h_subject) "
+           "VALUES($1,$2,$3,$4,$5,$6)", 6, NULL, params, NULL, NULL, 0))
+           != NULL)
        PQclear(pgres);
     else {
        syslog(LOG_NOTICE, "do_date_queue_box() - PQexecParams()");
index 3b89284..497b7da 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mmsmtpd.h,v 1.37 2007/03/19 14:38:39 mmondor Exp $ */
+/* $Id: mmsmtpd.h,v 1.38 2007/03/19 19:32:24 mmondor Exp $ */
 
 /*
  * Copyright (C) 2001-2007, Matthew Mondor
@@ -233,11 +233,12 @@ struct validate_udata
     /* Used to count number of Received: lines */
     long hops;
     /* Headers we consider mandatory, which we'll add if necessary */
-    bool msgid, date, from, to;
+    bool msgid, date, from, to, subject;
     /* Still considering to read the header */
     bool header;
     /* Internal linking */
     clientenv *clenv;
+    char *h_from, *h_to, *h_subject;
 };
 
 /* Our union for async_resquery() */
@@ -305,9 +306,10 @@ static bool address_relay_allow(clientenv *, int *, const char *);
 static void iso_time(char *);
 static bool message_write(char *, const char *, size_t, struct fdbrb_buffer *,
        const char *);
-static bool do_data_file(clientenv *, struct fdbrb_buffer *);
+static bool do_data_file(clientenv *, struct fdbrb_buffer *,
+               struct validate_udata *);
 static bool do_data_queue_box(clientenv *, const char *, size_t, struct
-       fdbrb_buffer *, rcptnode *);
+       fdbrb_buffer *, rcptnode *, struct validate_udata *);
 static bool do_data_queue_relay(clientenv *, const char *, size_t, struct
        fdbrb_buffer *, rcptnode *);
 static void do_data_queue_notify(clientenv *);