void headers_brief_filter(long msgnum, void *userdata) { long i, l; struct CtdlMessage *msg; msg_filter *flt = (msg_filter*) userdata; l = GetCount(flt->Filter); msg = CtdlFetchMessage(msgnum, 0, 1); StrBufPrintf(flt->buffer, "%ld", msgnum); if (msg == NULL) { for (i = 0; i < l; i++) { StrBufAppendBufPlain(flt->buffer, HKEY("|"), 0); } } else { const char *k; long len; void *v; RewindHashPos(flt->Filter, flt->p, 0); while (GetNextHashPos(flt->Filter, flt->p, &len, &k, &v)) { eMsgField f = (eMsgField) v; StrBufAppendBufPlain(flt->buffer, HKEY("|"), 0); if (!CM_IsEmpty(msg, f)) { StrBufAppendBufPlain(flt->buffer, CM_KEY(msg, f), 0); } } } StrBufAppendBufPlain(flt->buffer, HKEY("\n"), 0); cputbuf(flt->buffer); }
void network_process_participate(SpoolControl *sc, struct CtdlMessage *omsg, long *delete_after_send) { struct CtdlMessage *msg = NULL; int ok_to_participate = 0; StrBuf *Buf = NULL; recptypes *valid; /* * Process client-side list participations for this room */ if (sc->Users[participate] == NULL) return; msg = CM_Duplicate(omsg); /* Only send messages which originated on our own * Citadel network, otherwise we'll end up sending the * remote mailing list's messages back to it, which * is rude... */ ok_to_participate = 0; if (!CM_IsEmpty(msg, eNodeName)) { if (!strcasecmp(msg->cm_fields[eNodeName], config.c_nodename)) { ok_to_participate = 1; } Buf = NewStrBufPlain(CM_KEY(msg, eNodeName)); if (CtdlIsValidNode(NULL, NULL, Buf, sc->working_ignetcfg, sc->the_netmap) == 0) { ok_to_participate = 1; } } if (ok_to_participate) { /* Replace the Internet email address of the * actual author with the email address of the * room itself, so the remote listserv doesn't * reject us. */ CM_SetField(msg, erFc822Addr, SKEY(sc->Users[roommailalias])); valid = validate_recipients(ChrPtr(sc->Users[participate]) , NULL, 0); CM_SetField(msg, eRecipient, SKEY(sc->Users[roommailalias])); CtdlSubmitMsg(msg, valid, "", 0); free_recipients(valid); } FreeStrBuf(&Buf); CM_Free(msg); }
static void ListCalculateSubject(struct CtdlMessage *msg) { struct CitContext *CCC = CC; StrBuf *Subject, *FlatSubject; int rlen; char *pCh; if (CM_IsEmpty(msg, eMsgSubject)) { Subject = NewStrBufPlain(HKEY("(no subject)")); } else { Subject = NewStrBufPlain(CM_KEY(msg, eMsgSubject)); } FlatSubject = NewStrBufPlain(NULL, StrLength(Subject)); StrBuf_RFC822_to_Utf8(FlatSubject, Subject, NULL, NULL); rlen = strlen(CCC->room.QRname); pCh = strstr(ChrPtr(FlatSubject), CCC->room.QRname); if ((pCh == NULL) || (*(pCh + rlen) != ']') || (pCh == ChrPtr(FlatSubject)) || (*(pCh - 1) != '[') ) { StrBuf *tmp; StrBufPlain(Subject, HKEY("[")); StrBufAppendBufPlain(Subject, CCC->room.QRname, rlen, 0); StrBufAppendBufPlain(Subject, HKEY("] "), 0); StrBufAppendBuf(Subject, FlatSubject, 0); /* so we can free the right one swap them */ tmp = Subject; Subject = FlatSubject; FlatSubject = tmp; StrBufRFC2047encode(&Subject, FlatSubject); } CM_SetAsFieldSB(msg, eMsgSubject, &Subject); FreeStrBuf(&FlatSubject); }