From 8be8a5b748c3ce194848cf0b148bab01f7803b4c Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Fri, 12 Aug 2011 15:51:14 +0000 Subject: [PATCH] network_spool_msg() handle QP while appending the [roomname] to the mailsubject, we have to - de-qp the original subject - search for the roomname - possibly prepend '[roomame] ' - and re-qp everything. that way we solve... - multiple [roomname] additions in case of QP encoded subjects - non RFC-Conformant behaviour in case of roomnames with umlauts. --- citadel/modules/network/serv_network.c | 37 +++++++++++++++++--------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/citadel/modules/network/serv_network.c b/citadel/modules/network/serv_network.c index 1187cfe58..9115b1fb4 100644 --- a/citadel/modules/network/serv_network.c +++ b/citadel/modules/network/serv_network.c @@ -679,8 +679,9 @@ void network_spool_msg(long msgnum, void *userdata) { */ msg = CtdlFetchMessage(msgnum, 1); if (msg != NULL) { - int len, rlen; + int rlen; char *pCh; + StrBuf *Subject, *FlatSubject; if (msg->cm_fields['V'] == NULL){ /* local message, no enVelope */ @@ -709,27 +710,37 @@ void network_spool_msg(long msgnum, void *userdata) { /* Prepend "[List name]" to the subject */ if (msg->cm_fields['U'] == NULL) { - msg->cm_fields['U'] = strdup("(no subject)"); + Subject = NewStrBufPlain(HKEY("(no subject)")); } - - len = strlen(msg->cm_fields['U']); + else { + Subject = NewStrBufPlain(msg->cm_fields['U'], -1); + } + FlatSubject = NewStrBufPlain(NULL, StrLength(Subject)); + StrBuf_RFC822_to_Utf8(FlatSubject, Subject, NULL, NULL); + rlen = strlen(CC->room.QRname); - pCh = strstr(msg->cm_fields['U'], CC->room.QRname); + pCh = strstr(ChrPtr(FlatSubject), CC->room.QRname); if ((pCh == NULL) || (*(pCh + rlen) != ']') || - (pCh == msg->cm_fields['U']) || + (pCh == ChrPtr(FlatSubject)) || (*(pCh - 1) != '[') ) { - char *pBuff; + StrBuf *tmp; + StrBufPlain(Subject, HKEY("[")); + StrBufAppendBufPlain(Subject, CC->room.QRname, rlen, 0); + StrBufAppendBufPlain(Subject, HKEY("] "), 0); + StrBufAppendBuf(Subject, FlatSubject, 0); + tmp = Subject; Subject = FlatSubject; FlatSubject = tmp; /* so we can free the right one... */ + StrBufRFC2047encode(&Subject, FlatSubject); + } + + if (msg->cm_fields['U'] != NULL) + free (msg->cm_fields['U']); + msg->cm_fields['U'] = SmashStrBuf(&Subject); - rlen += len + 4; - pBuff = malloc (rlen * sizeof(char)); + FreeStrBuf(&FlatSubject); - snprintf(pBuff, rlen, "[%s] %s", CC->room.QRname, msg->cm_fields['U']); - free(msg->cm_fields['U']); - msg->cm_fields['U'] = pBuff; - } /* else we won't modify the buffer, since the roomname is already here. */ /* if we don't already have a 'reply to' field, put our roomname in. */ -- 2.30.2