X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fnetwork%2Fserv_netspool.c;h=86cad97b4a7144f83f91963e776c09f0c9279f7c;hb=30a4090b04dff1084df3789efe78afd1e2bf6d90;hp=0edb1f11efa0e240bcf7c7c3d79ead11d21b3934;hpb=4db4fc48793f3680c5defd28ea32c97044a2b569;p=citadel.git diff --git a/citadel/modules/network/serv_netspool.c b/citadel/modules/network/serv_netspool.c index 0edb1f11e..86cad97b4 100644 --- a/citadel/modules/network/serv_netspool.c +++ b/citadel/modules/network/serv_netspool.c @@ -93,6 +93,86 @@ #endif +/* + * Bounce a message back to the sender + */ +void network_bounce(struct CtdlMessage **pMsg, char *reason) +{ + struct CitContext *CCC = CC; + char buf[SIZ]; + char bouncesource[SIZ]; + char recipient[SIZ]; + recptypes *valid = NULL; + char force_room[ROOMNAMELEN]; + static int serialnum = 0; + long len; + struct CtdlMessage *msg = *pMsg; + *pMsg = NULL; + QNM_syslog(LOG_DEBUG, "entering network_bounce()\n"); + + if (msg == NULL) return; + + snprintf(bouncesource, sizeof bouncesource, "%s@%s", BOUNCESOURCE, config.c_nodename); + + /* + * Give it a fresh message ID + */ + len = snprintf(buf, sizeof(buf), + "%ld.%04lx.%04x@%s", + (long)time(NULL), + (long)getpid(), + ++serialnum, + config.c_fqdn); + + CM_SetField(msg, emessageId, buf, len); + + /* + * FIXME ... right now we're just sending a bounce; we really want to + * include the text of the bounced message. + */ + CM_SetField(msg, eMesageText, reason, strlen(reason)); + msg->cm_format_type = 0; + + /* + * Turn the message around + */ + CM_FlushField(msg, eRecipient); + CM_FlushField(msg, eDestination); + + len = snprintf(recipient, sizeof(recipient), "%s@%s", + msg->cm_fields[eAuthor], + msg->cm_fields[eNodeName]); + + CM_SetField(msg, eAuthor, HKEY(BOUNCESOURCE)); + CM_SetField(msg, eNodeName, CFG_KEY(c_nodename)); + CM_SetField(msg, eMsgSubject, HKEY("Delivery Status Notification (Failure)")); + + Netmap_AddMe(msg, HKEY("unknown_user")); + + /* Now submit the message */ + valid = validate_recipients(recipient, NULL, 0); + if (valid != NULL) if (valid->num_error != 0) { + free_recipients(valid); + valid = NULL; + } + if ( (valid == NULL) || (!strcasecmp(recipient, bouncesource)) ) { + strcpy(force_room, config.c_aideroom); + } + else { + strcpy(force_room, ""); + } + if ( (valid == NULL) && IsEmptyStr(force_room) ) { + strcpy(force_room, config.c_aideroom); + } + CtdlSubmitMsg(msg, valid, force_room, 0); + + /* Clean up */ + if (valid != NULL) free_recipients(valid); + CM_Free(msg); + QNM_syslog(LOG_DEBUG, "leaving network_bounce()\n"); +} + + void ParseLastSent(const CfgLineType *ThisOne, StrBuf *Line, const char *LinePos, OneRoomNetCfg *OneRNCFG) { RoomNetCfgLine *nptr; @@ -434,6 +514,53 @@ void network_spoolout_room(SpoolControl *sc) } } + +/* + * Check the use table. This is a list of messages which have recently + * arrived on the system. It is maintained and queried to prevent the same + * message from being entered into the database multiple times if it happens + * to arrive multiple times by accident. + */ +int network_usetable(struct CtdlMessage *msg) +{ + StrBuf *msgid; + struct CitContext *CCC = CC; + time_t now; + + /* Bail out if we can't generate a message ID */ + if ((msg == NULL) || CM_IsEmpty(msg, emessageId)) + { + return(0); + } + + /* Generate the message ID */ + msgid = NewStrBufPlain(CM_KEY(msg, emessageId)); + if (haschar(ChrPtr(msgid), '@') == 0) { + StrBufAppendBufPlain(msgid, HKEY("@"), 0); + if (!CM_IsEmpty(msg, eNodeName)) { + StrBufAppendBufPlain(msgid, CM_KEY(msg, eNodeName), 0); + } + else { + FreeStrBuf(&msgid); + return(0); + } + } + now = time(NULL); + if (CheckIfAlreadySeen("Networker Import", + msgid, + now, 0, + eUpdate, + CCC->cs_pid, 0) != 0) + { + FreeStrBuf(&msgid); + return(1); + } + FreeStrBuf(&msgid); + + return(0); +} + + /* * Process a buffer containing a single message from a single file * from the inbound queue @@ -530,10 +657,9 @@ void network_process_buffer(char *buffer, long size, HashList *working_ignetcfg, else { /* invalid destination node name */ FreeStrBuf(&Buf); - network_bounce(msg, + network_bounce(&msg, "A message you sent could not be delivered due to an invalid destination node" " name. Please check the address and try sending the message again.\n"); - msg = NULL; return; } @@ -570,10 +696,9 @@ void network_process_buffer(char *buffer, long size, HashList *working_ignetcfg, else if (!CM_IsEmpty(msg, eRecipient)) { recp = validate_recipients(msg->cm_fields[eRecipient], NULL, 0); if (recp != NULL) if (recp->num_error != 0) { - network_bounce(msg, + network_bounce(&msg, "A message you sent could not be delivered due to an invalid address.\n" "Please check the address and try sending the message again.\n"); - msg = NULL; free_recipients(recp); QNM_syslog(LOG_DEBUG, "Bouncing message due to invalid recipient address.\n"); return;