X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fnetwork%2Fserv_netmail.c;h=ddd3ba19d9182b009dd55ced4198015b46e97f9d;hb=5c39ca8a3c875df98163fed8923c258f21bb3f66;hp=c488388f9090735c0910c22cb5e07d40b7f11970;hpb=55013f95f08eafe1b375df4241e8defe387c6cdc;p=citadel.git diff --git a/citadel/modules/network/serv_netmail.c b/citadel/modules/network/serv_netmail.c index c488388f9..ddd3ba19d 100644 --- a/citadel/modules/network/serv_netmail.c +++ b/citadel/modules/network/serv_netmail.c @@ -2,15 +2,15 @@ * This module handles shared rooms, inter-Citadel mail, and outbound * mailing list processing. * - * Copyright (c) 2000-2012 by the citadel.org team + * Copyright (c) 2000-2016 by the citadel.org team * - * This program is open source software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 3. + * This program is open source software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License, version 3. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * * ** NOTE ** A word on the S_NETCONFIGS semaphore: * This is a fairly high-level type of critical section. It ensures that no @@ -86,7 +86,6 @@ void aggregate_recipients(StrBuf **recps, RoomNetCfg Which, OneRoomNetCfg *OneRN int i; size_t recps_len = 0; RoomNetCfgLine *nptr; - struct CitContext *CCC = CC; *recps = NULL; /* @@ -103,9 +102,7 @@ void aggregate_recipients(StrBuf **recps, RoomNetCfg Which, OneRoomNetCfg *OneRN *recps = NewStrBufPlain(NULL, recps_len); if (*recps == NULL) { - QN_syslog(LOG_EMERG, - "Cannot allocate %ld bytes for recps...\n", - (long)recps_len); + syslog(LOG_ERR, "netmail: cannot allocate %ld bytes for recps", (long)recps_len); abort(); } @@ -182,15 +179,9 @@ void network_deliver_digest(SpoolControl *sc) recptypes *valid; char bounce_to[256]; - if (sc->Users[listrecp] == NULL) + if (sc->Users[digestrecp] == NULL) return; - if (sc->num_msgs_spooled < 1) { - fclose(sc->digestfp); - sc->digestfp = NULL; - return; - } - msg = malloc(sizeof(struct CtdlMessage)); memset(msg, 0, sizeof(struct CtdlMessage)); msg->cm_magic = CTDLMESSAGE_MAGIC; @@ -219,19 +210,15 @@ void network_deliver_digest(SpoolControl *sc) fread(pbuf, (size_t)msglen, 1, sc->digestfp); pbuf[msglen] = '\0'; CM_SetAsField(msg, eMesageText, &pbuf, msglen); - fclose(sc->digestfp); - sc->digestfp = NULL; /* Now generate the delivery instructions */ - if (sc->Users[listrecp] == NULL) - return; /* Where do we want bounces and other noise to be heard? - *Surely not the list members! */ - snprintf(bounce_to, sizeof bounce_to, "room_aide@%s", config.c_fqdn); + * Surely not the list members! */ + snprintf(bounce_to, sizeof bounce_to, "room_aide@%s", CtdlGetConfigStr("c_fqdn")); /* Now submit the message */ - valid = validate_recipients(ChrPtr(sc->Users[listrecp]), NULL, 0); + valid = validate_recipients(ChrPtr(sc->Users[digestrecp]), NULL, 0); if (valid != NULL) { valid->bounce_to = strdup(bounce_to); valid->envelope_from = strdup(bounce_to); @@ -247,15 +234,27 @@ void network_process_digest(SpoolControl *sc, struct CtdlMessage *omsg, long *de struct CtdlMessage *msg = NULL; - /* - * Process digest recipients - */ - if ((sc->Users[digestrecp] == NULL)|| - (sc->digestfp == NULL)) + if (sc->Users[digestrecp] == NULL) return; + /* If there are digest recipients, we have to build a digest */ + if (sc->digestfp == NULL) { + + sc->digestfp = create_digest_file(&sc->room, 1); + + if (sc->digestfp == NULL) + return; + + sc->haveDigest = ftell(sc->digestfp) > 0; + if (!sc->haveDigest) { + fprintf(sc->digestfp, "Content-type: text/plain\n\n"); + } + sc->haveDigest = 1; + } + msg = CM_Duplicate(omsg); if (msg != NULL) { + sc->haveDigest = 1; fprintf(sc->digestfp, " -----------------------------------" "------------------------------------" @@ -325,7 +324,7 @@ void network_process_list(SpoolControl *sc, struct CtdlMessage *omsg, long *dele msg = CM_Duplicate(omsg); - CM_SetField(msg, eListID, SKEY(sc->Users[roommailalias])); + CM_SetField(msg, eReplyTo, SKEY(sc->Users[roommailalias])); /* if there is no other recipient, Set the recipient * of the list message to the email address of the @@ -364,7 +363,7 @@ void network_deliver_list(struct CtdlMessage *msg, SpoolControl *sc, const char /* Where do we want bounces and other noise to be heard? * Surely not the list members! */ - snprintf(bounce_to, sizeof bounce_to, "room_aide@%s", config.c_fqdn); + snprintf(bounce_to, sizeof bounce_to, "room_aide@%s", CtdlGetConfigStr("c_fqdn")); /* Now submit the message */ valid = validate_recipients(ChrPtr(sc->Users[listrecp]), NULL, 0); @@ -401,8 +400,8 @@ void network_process_participate(SpoolControl *sc, struct CtdlMessage *omsg, lon */ ok_to_participate = 0; if (!CM_IsEmpty(msg, eNodeName)) { - if (!strcasecmp(msg->cm_fields[eNodeName], - config.c_nodename)) { + if (!strcasecmp(msg->cm_fields[eNodeName], CtdlGetConfigStr("c_nodename"))) + { ok_to_participate = 1; } @@ -491,15 +490,12 @@ void network_process_ignetpush(SpoolControl *sc, struct CtdlMessage *omsg, long sc->working_ignetcfg, sc->the_netmap) != 0) { - QN_syslog(LOG_ERR, - "Invalid node <%s>\n", - ChrPtr(Recipient)); - + syslog(LOG_ERR, "netmail: invalid node <%s>", ChrPtr(Recipient)); send = 0; } /* Check for split horizon */ - QN_syslog(LOG_DEBUG, "Path is %s\n", msg->cm_fields[eMessagePath]); + syslog(LOG_DEBUG, "netmail: path is %s", msg->cm_fields[eMessagePath]); bang = num_tokens(msg->cm_fields[eMessagePath], '!'); if (bang > 1) { for (i=0; i<(bang-1); ++i) { @@ -508,18 +504,14 @@ void network_process_ignetpush(SpoolControl *sc, struct CtdlMessage *omsg, long i, '!', sizeof buf); - QN_syslog(LOG_DEBUG, "Compare <%s> to <%s>\n", - buf, ChrPtr(Recipient)) ; + syslog(LOG_DEBUG, "netmail: compare <%s> to <%s>", buf, ChrPtr(Recipient)) ; if (!strcasecmp(buf, ChrPtr(Recipient))) { send = 0; break; } } - QN_syslog(LOG_INFO, - " %sSending to %s\n", - (send)?"":"Not ", - ChrPtr(Recipient)); + syslog(LOG_INFO, "netmail: %ssending to %s", (send)?"":"not ", ChrPtr(Recipient)); } /* Send the message */ @@ -543,29 +535,23 @@ void network_process_ignetpush(SpoolControl *sc, struct CtdlMessage *omsg, long /* write it to a spool file */ snprintf(filename, - sizeof(filename), - "%s/%s@%lx%x", - ctdl_netout_dir, - ChrPtr(Recipient), - time(NULL), - rand() - ); + sizeof(filename), + "%s/%s@%lx%x", + ctdl_netout_dir, + ChrPtr(Recipient), + time(NULL), + rand() + ); - QN_syslog(LOG_DEBUG, - "Appending to %s\n", - filename); + syslog(LOG_DEBUG, "netmail: appending to %s", filename); fp = fopen(filename, "ab"); if (fp != NULL) { - fwrite(sermsg.ser, - sermsg.len, 1, fp); + fwrite(sermsg.ser, sermsg.len, 1, fp); fclose(fp); } else { - QN_syslog(LOG_ERR, - "%s: %s\n", - filename, - strerror(errno)); + syslog(LOG_ERR, "%s: %s\n", filename, strerror(errno)); } /* free the serialized version */ @@ -583,23 +569,18 @@ void network_process_ignetpush(SpoolControl *sc, struct CtdlMessage *omsg, long /* * Spools out one message from the list. */ -void network_spool_msg(long msgnum, - void *userdata) +void network_spool_msg(long msgnum, void *userdata) { - struct CitContext *CCC = CC; struct CtdlMessage *msg = NULL; long delete_after_send = 0; /* Set to 1 to delete after spooling */ SpoolControl *sc; sc = (SpoolControl *)userdata; - - msg = CtdlFetchMessage(msgnum, 1); + msg = CtdlFetchMessage(msgnum, 1, 1); if (msg == NULL) { - QN_syslog(LOG_ERR, - "failed to load Message <%ld> from disk\n", - msgnum); + syslog(LOG_ERR, "netmail: failed to load Message <%ld> from disk", msgnum); return; } network_process_list(sc, msg, &delete_after_send);