]> source.dussan.org Git - rspamd.git/commitdiff
* Add additional headers support in protocol
authorVsevolod Stakhov <vsevolod@rambler-co.ru>
Mon, 18 Aug 2008 13:11:16 +0000 (17:11 +0400)
committerVsevolod Stakhov <vsevolod@rambler-co.ru>
Mon, 18 Aug 2008 13:11:16 +0000 (17:11 +0400)
main.h
worker.c

diff --git a/main.h b/main.h
index 62a5244c99e6cbd49579f04a5097e08452f417dd..e263b952198133a3ee1182acab7c3586fa0a96f4 100644 (file)
--- a/main.h
+++ b/main.h
@@ -84,6 +84,11 @@ struct worker_task {
                WRITE_ERROR,
        } state;
        size_t content_length;
+       char *helo;
+       char *from;
+       char *rcpt;
+       unsigned int nrcpt;
+       struct in_addr from_addr;
        f_str_buf_t *msg;
        struct bufferevent *bev;
        /* Number of mime parts */
index c9ed1f9f427550f1387902c0ccd47998631d9b6c..ab02ecea2e9d6071f75e81c8e92cae1e91907339 100644 (file)
--- a/worker.c
+++ b/worker.c
 #include "cfg_file.h"
 #include "url.h"
 
-#define CONTENT_LENGTH_HEADER "Content-Length:"
+#define CONTENT_LENGTH_HEADER "Content-Length: "
+#define HELO_HEADER "Helo: "
+#define FROM_HEADER "From: "
+#define IP_ADDR_HEADER "IP: "
+#define NRCPT_HEADER "Recipient-Number: "
+#define RCPT_HEADER "Rcpt: "
 
 const f_str_t CRLF = {
        /* begin */"\r\n",
@@ -74,6 +79,15 @@ free_task (struct worker_task *task)
                        fstrfree (task->msg->buf);
                        free (task->msg);
                }
+               if (task->helo) {
+                       free (task->helo);
+               }
+               if (task->from) {
+                       free (task->from);
+               }
+               if (task->rcpt) {
+                       free (task->rcpt);
+               }
                while (!TAILQ_EMPTY (&task->urls)) {
                        cur = TAILQ_FIRST (&task->urls);
                        free (cur->string);
@@ -182,7 +196,7 @@ read_socket (struct bufferevent *bev, void *arg)
 {
        struct worker_task *task = (struct worker_task *)arg;
        ssize_t r;
-       char *s;
+       char *s, *c;
 
        switch (task->state) {
                case READ_COMMAND:
@@ -198,7 +212,7 @@ read_socket (struct bufferevent *bev, void *arg)
                        if (s != NULL) {
                                msg_info ("read_socket: got header %s", s);
                                if (strncasecmp (s, CONTENT_LENGTH_HEADER, sizeof (CONTENT_LENGTH_HEADER) - 1) == 0) {
-                                       task->content_length = atoi (s + sizeof (CONTENT_LENGTH_HEADER));
+                                       task->content_length = atoi (s + sizeof (CONTENT_LENGTH_HEADER) - 1);
                                        msg_info ("read_socket: parsed content-length: %ld", (long int)task->content_length);
                                        task->msg = malloc (sizeof (f_str_buf_t));
                                        if (task->msg == NULL) {
@@ -218,7 +232,67 @@ read_socket (struct bufferevent *bev, void *arg)
                                        task->msg->pos = task->msg->buf->begin;
                                        update_buf_size (task->msg);
                                }
-                               else if (strlen (s) == 0) {
+                               else if (strncasecmp (s, HELO_HEADER, sizeof (HELO_HEADER) - 1) == 0) {
+                                       c = rindex (s, '\r');
+                                       if (c != NULL) {
+                                               task->helo = malloc (c - (s + sizeof (HELO_HEADER) - 1));
+                                               if (task->helo) {
+                                                       strlcpy (task->helo, s + sizeof (HELO_HEADER) - 1, (c - (s + sizeof (HELO_HEADER) - 1)));
+                                               }
+                                               else {
+                                                       msg_err ("read_socket: malloc failed for HELO header: %m");
+                                               }
+                                       }
+                                       else {
+                                               msg_err ("read_socket: header " HELO_HEADER " has invalid format, ignored");
+                                       }
+                               }
+                               else if (strncasecmp (s, FROM_HEADER, sizeof (FROM_HEADER) - 1) == 0) {
+                                       c = rindex (s, '\r');
+                                       if (c != NULL) {
+                                               task->from = malloc (c - (s + sizeof (FROM_HEADER) - 1));
+                                               if (task->from) {
+                                                       strlcpy (task->from, s + sizeof (FROM_HEADER) - 1, (c - (s + sizeof (FROM_HEADER) - 1)));
+                                               }
+                                               else {
+                                                       msg_err ("read_socket: malloc failed for FROM header: %m");
+                                               }
+                                       }
+                                       else {
+                                               msg_err ("read_socket: header " FROM_HEADER " has invalid format, ignored");
+                                       }
+                               }
+                               else if (strncasecmp (s, RCPT_HEADER, sizeof (RCPT_HEADER) - 1) == 0) {
+                                       c = rindex (s, '\r');
+                                       if (c != NULL) {
+                                               task->rcpt = malloc (c - (s + sizeof (RCPT_HEADER) - 1));
+                                               if (task->rcpt) {
+                                                       strlcpy (task->rcpt, s + sizeof (RCPT_HEADER) - 1, (c - (s + sizeof (RCPT_HEADER) - 1)));
+                                               }
+                                               else {
+                                                       msg_err ("read_socket: malloc failed for RCPT header: %m");
+                                               }
+                                       }
+                                       else {
+                                               msg_err ("read_socket: header " RCPT_HEADER " has invalid format, ignored");
+                                       }
+                               }
+                               else if (strncasecmp (s, NRCPT_HEADER, sizeof (NRCPT_HEADER) - 1) == 0) {
+                                       task->nrcpt = atoi (s + sizeof (NRCPT_HEADER) - 1);
+                               }
+                               else if (strncasecmp (s, IP_ADDR_HEADER, sizeof (IP_ADDR_HEADER) - 1) == 0) {
+                                       c = rindex (s, '\r');
+                                       if (c != NULL) {
+                                               *c = 0;
+                                               if (!inet_aton (s + sizeof (IP_ADDR_HEADER) - 1, &task->from_addr)) {
+                                                       msg_info ("read_socket: bad ip header: '%s'", s);
+                                               }
+                                       }
+                                       else {
+                                               msg_err ("read_socket: header " IP_ADDR_HEADER " has invalid format, ignored");
+                                       }
+                               }
+                               else if (strlen (s) == 0 || (*s == '\r' && *(s+1) == '\n')) {
                                        if (task->content_length != 0) {
                                                task->state = READ_MESSAGE;
                                        }