]> code.citadel.org Git - citadel.git/blobdiff - citadel/serv_smtp.c
* Shut off hostname resolution when dealing with Unix domain sockets
[citadel.git] / citadel / serv_smtp.c
index ce80fa44fe41ac6ea6b9bf9b75b9036b0a5680df..b9457afe171e61c83f769afd60186c4f0b996e85 100644 (file)
@@ -371,7 +371,7 @@ void smtp_rcpt(char *argbuf) {
        alias(recp);
 
        cvt = convert_internet_address(user, node, recp);
-       sprintf(recp, "%s@%s", user, node);
+       snprintf(recp, sizeof recp, "%s@%s", user, node);
        lprintf(9, "cvt=%d, citaddr=<%s@%s>\n", cvt, user, node);
 
        switch(cvt) {
@@ -438,23 +438,34 @@ void smtp_rcpt(char *argbuf) {
  * (This is kind of ugly.  IGnet should be done using clean server-to-server
  * code instead of the old style spool.)
  */
-void smtp_deliver_ignet(struct CtdlMessage *msg, char *user, char *room) {
+void smtp_deliver_ignet(struct CtdlMessage *msg, char *user, char *dest) {
        struct ser_ret smr;
-       char *hold_R, *hold_D;
+       char *hold_R, *hold_D, *hold_O;
        FILE *fp;
+       char filename[256];
+       static int seq = 0;
+
+       lprintf(9, "smtp_deliver_ignet(msg, %s, %s)\n", user, dest);
 
        hold_R = msg->cm_fields['R'];
        hold_D = msg->cm_fields['D'];
+       hold_O = msg->cm_fields['O'];
        msg->cm_fields['R'] = user;
-       msg->cm_fields['D'] = room;
+       msg->cm_fields['D'] = dest;
+       msg->cm_fields['O'] = MAILROOM;
 
        serialize_message(&smr, msg);
 
        msg->cm_fields['R'] = hold_R;
        msg->cm_fields['D'] = hold_D;
+       msg->cm_fields['O'] = hold_O;
 
        if (smr.len != 0) {
-               fp = fopen(tmpnam("./network/spoolin/"), "wb");
+               snprintf(filename, sizeof filename,
+                       "./network/spoolin/%s.%04x.%04x",
+                       dest, getpid(), ++seq);
+               lprintf(9, "spool file name is <%s>\n", filename);
+               fp = fopen(filename, "wb");
                if (fp != NULL) {
                        fwrite(smr.ser, smr.len, 1, fp);
                        fclose(fp);
@@ -493,6 +504,7 @@ int smtp_message_delivery(struct CtdlMessage *msg) {
        if (msg->cm_fields['A']==NULL) msg->cm_fields['A'] = strdoop(user);
        if (msg->cm_fields['N']==NULL) msg->cm_fields['N'] = strdoop(node);
        if (msg->cm_fields['H']==NULL) msg->cm_fields['H'] = strdoop(name);
+       if (msg->cm_fields['O']==NULL) msg->cm_fields['O'] = strdoop(MAILROOM);
 
        /* Save the message in the queue */
        msgid = CtdlSaveMsg(msg,
@@ -503,7 +515,8 @@ int smtp_message_delivery(struct CtdlMessage *msg) {
        ++successful_saves;
 
        instr = mallok(1024);
-       sprintf(instr, "Content-type: %s\n\nmsgid|%ld\nsubmitted|%ld\n"
+       snprintf(instr, 1024,
+                       "Content-type: %s\n\nmsgid|%ld\nsubmitted|%ld\n"
                        "bounceto|%s\n",
                SPOOLMIME, msgid, time(NULL),
                SMTP->from );
@@ -534,14 +547,17 @@ int smtp_message_delivery(struct CtdlMessage *msg) {
 
                /* Delivery over the local Citadel network (IGnet) */
                if (!strcasecmp(dtype, "ignet")) {
-                       smtp_deliver_ignet(msg, user, room);
+                       extract(user, buf, 1);
+                       extract(node, buf, 2);
+                       smtp_deliver_ignet(msg, user, node);
                }
 
                /* Remote delivery */
                if (!strcasecmp(dtype, "remote")) {
                        extract(user, buf, 1);
                        instr = reallok(instr, strlen(instr) + 1024);
-                       sprintf(&instr[strlen(instr)],
+                       snprintf(&instr[strlen(instr)],
+                               strlen(instr) + 1024,
                                "remote|%s|0\n",
                                user);
                        ++remote_spools;
@@ -597,7 +613,7 @@ void smtp_data(void) {
        generate_rfc822_datestamp(nowstamp, time(NULL));
        body = mallok(4096);
 
-       if (body != NULL) sprintf(body,
+       if (body != NULL) snprintf(body, 4096,
                "Received: from %s\n"
                "       by %s;\n"
                "       %s\n",
@@ -823,7 +839,7 @@ void smtp_try(char *key, char *addr, int *status, char *dsn, long msgnum)
        lprintf(9, "Number of MX hosts for <%s> is %d\n", node, num_mxhosts);
        if (num_mxhosts < 1) {
                *status = 5;
-               sprintf(dsn, "No MX hosts found for <%s>", node);
+               snprintf(dsn, 256, "No MX hosts found for <%s>", node);
                return;
        }
 
@@ -831,9 +847,9 @@ void smtp_try(char *key, char *addr, int *status, char *dsn, long msgnum)
                extract(buf, mxhosts, mx);
                lprintf(9, "Trying <%s>\n", buf);
                sock = sock_connect(buf, "25", "tcp");
-               sprintf(dsn, "Could not connect: %s", strerror(errno));
+               snprintf(dsn, 256, "Could not connect: %s", strerror(errno));
                if (sock >= 0) lprintf(9, "Connected!\n");
-               if (sock < 0) sprintf(dsn, "%s", strerror(errno));
+               if (sock < 0) snprintf(dsn, 256, "%s", strerror(errno));
                if (sock >= 0) break;
        }
 
@@ -865,7 +881,7 @@ void smtp_try(char *key, char *addr, int *status, char *dsn, long msgnum)
        /* At this point we know we are talking to a real SMTP server */
 
        /* Do a HELO command */
-       sprintf(buf, "HELO %s", config.c_fqdn);
+       snprintf(buf, sizeof buf, "HELO %s", config.c_fqdn);
        lprintf(9, ">%s\n", buf);
        sock_puts(sock, buf);
        if (sock_gets(sock, buf) < 0) {
@@ -889,7 +905,7 @@ void smtp_try(char *key, char *addr, int *status, char *dsn, long msgnum)
 
 
        /* HELO succeeded, now try the MAIL From: command */
-       sprintf(buf, "MAIL From: %s", mailfrom);
+       snprintf(buf, sizeof buf, "MAIL From: %s", mailfrom);
        lprintf(9, ">%s\n", buf);
        sock_puts(sock, buf);
        if (sock_gets(sock, buf) < 0) {
@@ -913,7 +929,7 @@ void smtp_try(char *key, char *addr, int *status, char *dsn, long msgnum)
 
 
        /* MAIL succeeded, now try the RCPT To: command */
-       sprintf(buf, "RCPT To: %s", addr);
+       snprintf(buf, sizeof buf, "RCPT To: %s", addr);
        lprintf(9, ">%s\n", buf);
        sock_puts(sock, buf);
        if (sock_gets(sock, buf) < 0) {
@@ -1065,14 +1081,14 @@ void smtp_do_bounce(char *instr) {
         bmsg->cm_fields['N'] = strdoop(config.c_nodename);
 
        if (give_up) bmsg->cm_fields['M'] = strdoop(
-"A message you sent could not be delivered to some or all of its recipients.\n"
-"The following addresses were undeliverable:\n\n"
-);
-
-        else bmsg->cm_fields['M'] = strdoop(
 "A message you sent could not be delivered to some or all of its recipients\n"
 "due to prolonged unavailability of its destination(s).\n"
 "Giving up on the following addresses:\n\n"
+);
+
+        else bmsg->cm_fields['M'] = strdoop(
+"A message you sent could not be delivered to some or all of its recipients.\n"
+"The following addresses were undeliverable:\n\n"
 );
 
        /*
@@ -1353,7 +1369,8 @@ void smtp_do_procmsg(long msgnum) {
                msg->cm_anon_type = MES_NORMAL;
                msg->cm_format_type = FMT_RFC822;
                msg->cm_fields['M'] = malloc(strlen(instr)+256);
-               sprintf(msg->cm_fields['M'],
+               snprintf(msg->cm_fields['M'],
+                       strlen(instr)+256,
                        "Content-type: %s\n\n%s\nattempted|%ld\n",
                        SPOOLMIME, instr, time(NULL) );
                phree(instr);
@@ -1408,9 +1425,17 @@ char *Dynamic_Module_Init(void)
 {
        SYM_SMTP = CtdlGetDynamicSymbol();
        SYM_SMTP_RECP = CtdlGetDynamicSymbol();
-       CtdlRegisterServiceHook(SMTP_PORT,
+
+       CtdlRegisterServiceHook(config.c_smtp_port,     /* On the net... */
+                               NULL,
                                smtp_greeting,
                                smtp_command_loop);
+
+       CtdlRegisterServiceHook(0,                      /* ...and locally */
+                               "smtp.socket",
+                               smtp_greeting,
+                               smtp_command_loop);
+
        create_room(SMTP_SPOOLOUT_ROOM, 3, "", 0);
        CtdlRegisterSessionHook(smtp_do_queue, EVT_TIMER);
        return "$Id$";