X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fnetwork%2Fserv_netmail.c;h=30b92b7203c89e4e6d7b84eb726fb8754551cade;hb=1a2ef2893789470310f1a844dbfac0850680131d;hp=dd47f2592c3f2562c743b1fa8bdd6738aa6b07ac;hpb=848934c1722edc208c4df49c571586b72c3fc486;p=citadel.git diff --git a/citadel/modules/network/serv_netmail.c b/citadel/modules/network/serv_netmail.c index dd47f2592..30b92b720 100644 --- a/citadel/modules/network/serv_netmail.c +++ b/citadel/modules/network/serv_netmail.c @@ -2,7 +2,7 @@ * 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-2015 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. @@ -72,7 +72,6 @@ #include "internet_addressing.h" #include "serv_network.h" #include "clientsocket.h" -#include "file_ops.h" #include "citadel_dirs.h" #include "threads.h" #include "context.h" @@ -133,12 +132,11 @@ static void ListCalculateSubject(struct CtdlMessage *msg) int rlen; char *pCh; - if (msg->cm_fields[eMsgSubject] == NULL) { + if (CM_IsEmpty(msg, eMsgSubject)) { Subject = NewStrBufPlain(HKEY("(no subject)")); } else { - Subject = NewStrBufPlain( - msg->cm_fields[eMsgSubject], -1); + Subject = NewStrBufPlain(CM_KEY(msg, eMsgSubject)); } FlatSubject = NewStrBufPlain(NULL, StrLength(Subject)); StrBuf_RFC822_to_Utf8(FlatSubject, Subject, NULL, NULL); @@ -181,17 +179,11 @@ void network_deliver_digest(SpoolControl *sc) char *pbuf; struct CtdlMessage *msg = NULL; long msglen; - struct recptypes *valid; + recptypes *valid; char bounce_to[256]; - if (sc->Users[listrecp] == NULL) - return; - - if (sc->num_msgs_spooled < 1) { - fclose(sc->digestfp); - sc->digestfp = NULL; + if (sc->Users[digestrecp] == NULL) return; - } msg = malloc(sizeof(struct CtdlMessage)); memset(msg, 0, sizeof(struct CtdlMessage)); @@ -221,25 +213,21 @@ 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); CtdlSubmitMsg(msg, valid, NULL, 0); } - CtdlFreeMessage(msg); + CM_Free(msg); free_recipients(valid); } @@ -249,37 +237,49 @@ 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; - msg = CtdlDuplicateMessage(omsg); + /* 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, " -----------------------------------" "------------------------------------" "-------\n"); fprintf(sc->digestfp, "From: "); - if (msg->cm_fields[eAuthor] != NULL) { + if (!CM_IsEmpty(msg, eAuthor)) { fprintf(sc->digestfp, "%s ", msg->cm_fields[eAuthor]); } - if (msg->cm_fields[erFc822Addr] != NULL) { + if (!CM_IsEmpty(msg, erFc822Addr)) { fprintf(sc->digestfp, "<%s> ", msg->cm_fields[erFc822Addr]); } - else if (msg->cm_fields[eNodeName] != NULL) { + else if (!CM_IsEmpty(msg, eNodeName)) { fprintf(sc->digestfp, "@%s ", msg->cm_fields[eNodeName]); } fprintf(sc->digestfp, "\n"); - if (msg->cm_fields[eMsgSubject] != NULL) { + if (!CM_IsEmpty(msg, eMsgSubject)) { fprintf(sc->digestfp, "Subject: %s\n", msg->cm_fields[eMsgSubject]); @@ -304,7 +304,7 @@ void network_process_digest(SpoolControl *sc, struct CtdlMessage *omsg, long *de FreeStrBuf(&CC->redirect_buffer); sc->num_msgs_spooled += 1; - CtdlFreeMessage(msg); + CM_Free(msg); } } @@ -324,17 +324,16 @@ void network_process_list(SpoolControl *sc, struct CtdlMessage *omsg, long *dele * in order to insert the [list name] in it, etc. */ - msg = CtdlDuplicateMessage(omsg); + 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 * room itself. */ - if ((msg->cm_fields[eRecipient] == NULL) || - IsEmptyStr(msg->cm_fields[eRecipient])) + if (CM_IsEmpty(msg, eRecipient)) { CM_SetField(msg, eRecipient, SKEY(sc->Users[roommailalias])); } @@ -348,7 +347,7 @@ void network_process_list(SpoolControl *sc, struct CtdlMessage *omsg, long *dele /* Handle delivery */ network_deliver_list(msg, sc, CC->room.QRname); - CtdlFreeMessage(msg); + CM_Free(msg); } /* @@ -356,7 +355,7 @@ void network_process_list(SpoolControl *sc, struct CtdlMessage *omsg, long *dele */ void network_deliver_list(struct CtdlMessage *msg, SpoolControl *sc, const char *RoomName) { - struct recptypes *valid; + recptypes *valid; char bounce_to[256]; /* Don't do this if there were no recipients! */ @@ -367,7 +366,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); @@ -378,7 +377,7 @@ void network_deliver_list(struct CtdlMessage *msg, SpoolControl *sc, const char CtdlSubmitMsg(msg, valid, NULL, 0); free_recipients(valid); } - /* Do not call CtdlFreeMessage(msg) here; the caller will free it. */ + /* Do not call CM_Free(msg) here; the caller will free it. */ } @@ -387,7 +386,7 @@ void network_process_participate(SpoolControl *sc, struct CtdlMessage *omsg, lon struct CtdlMessage *msg = NULL; int ok_to_participate = 0; StrBuf *Buf = NULL; - struct recptypes *valid; + recptypes *valid; /* * Process client-side list participations for this room @@ -395,7 +394,7 @@ void network_process_participate(SpoolControl *sc, struct CtdlMessage *omsg, lon if (sc->Users[participate] == NULL) return; - msg = CtdlDuplicateMessage(omsg); + msg = CM_Duplicate(omsg); /* Only send messages which originated on our own * Citadel network, otherwise we'll end up sending the @@ -403,13 +402,13 @@ void network_process_participate(SpoolControl *sc, struct CtdlMessage *omsg, lon * is rude... */ ok_to_participate = 0; - if (msg->cm_fields[eNodeName] != NULL) { - if (!strcasecmp(msg->cm_fields[eNodeName], - config.c_nodename)) { + if (!CM_IsEmpty(msg, eNodeName)) { + if (!strcasecmp(msg->cm_fields[eNodeName], CtdlGetConfigStr("c_nodename"))) + { ok_to_participate = 1; } - Buf = NewStrBufPlain(msg->cm_fields[eNodeName], -1); + Buf = NewStrBufPlain(CM_KEY(msg, eNodeName)); if (CtdlIsValidNode(NULL, NULL, Buf, @@ -435,7 +434,7 @@ void network_process_participate(SpoolControl *sc, struct CtdlMessage *omsg, lon free_recipients(valid); } FreeStrBuf(&Buf); - CtdlFreeMessage(msg); + CM_Free(msg); } void network_process_ignetpush(SpoolControl *sc, struct CtdlMessage *omsg, long *delete_after_send) @@ -460,7 +459,7 @@ void network_process_ignetpush(SpoolControl *sc, struct CtdlMessage *omsg, long /* * Process IGnet push shares */ - msg = CtdlDuplicateMessage(omsg); + msg = CM_Duplicate(omsg); /* Prepend our node name to the Path field whenever * sending a message to another IGnet node @@ -471,7 +470,7 @@ void network_process_ignetpush(SpoolControl *sc, struct CtdlMessage *omsg, long * Determine if this message is set to be deleted * after sending out on the network */ - if (msg->cm_fields[eSpecialField] != NULL) { + if (!CM_IsEmpty(msg, eSpecialField)) { if (!strcasecmp(msg->cm_fields[eSpecialField], "CANCEL")) { *delete_after_send = 1; } @@ -541,7 +540,7 @@ void network_process_ignetpush(SpoolControl *sc, struct CtdlMessage *omsg, long } /* serialize it for transmission */ - serialize_message(&sermsg, msg); + CtdlSerializeMessage(&sermsg, msg); if (sermsg.len > 0) { /* write it to a spool file */ @@ -579,7 +578,7 @@ void network_process_ignetpush(SpoolControl *sc, struct CtdlMessage *omsg, long FreeStrBuf(&Buf); FreeStrBuf(&Recipient); FreeStrBuf(&RemoteRoom); - CtdlFreeMessage(msg); + CM_Free(msg); } @@ -610,7 +609,7 @@ void network_spool_msg(long msgnum, network_process_participate(sc, msg, &delete_after_send); network_process_ignetpush(sc, msg, &delete_after_send); - CtdlFreeMessage(msg); + CM_Free(msg); /* update lastsent */ sc->lastsent = msgnum;