Protect precious strlens, as pointed out by John Goerzen
[citadel.git] / citadel / modules / instmsg / serv_instmsg.c
index 17ed7cc629830d372d2ffdc6230ede42ab34490a..b150a9167dcdbb701288d0153ec18a04dfb2e6f4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This module handles instant messaging between users.
  * 
- * Copyright (c) 1987-2012 by the citadel.org team
+ * Copyright (c) 1987-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.
@@ -11,6 +11,7 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
+
 #include "sysdep.h"
 #include <stdlib.h>
 #include <unistd.h>
@@ -110,9 +111,6 @@ void log_instant_message(struct CitContext *me, struct CitContext *them, char *m
                this_im->next = imlist;
                imlist = this_im;
                StrBufAppendBufPlain(this_im->conversation, HKEY(
-                       "Content-type: text/html\r\n"
-                       "Content-transfer-encoding: 7bit\r\n"
-                       "\r\n"
                        "<html><body>\r\n"
                        ), 0);
        }
@@ -177,7 +175,7 @@ void cmd_gexp(char *argbuf) {
                (long)ptr->timestamp,                   /* time sent */
                ptr->flags,                             /* flags */
                ptr->sender,                            /* sender of msg */
-               config.c_nodename,                      /* static for now (and possibly deprecated) */
+               CtdlGetConfigStr("c_nodename"),         /* static for now (and possibly deprecated) */
                ptr->sender_email                       /* email or jid of sender */
        );
 
@@ -245,7 +243,7 @@ int send_instant_message(char *lun, char *lem, char *x_user, char *x_msg)
        int do_send = 0;                /* 1 = send message; 0 = only check for valid recipient */
        static int serial_number = 0;   /* this keeps messages from getting logged twice */
 
-       if (strlen(x_msg) > 0) {
+       if (!IsEmptyStr(x_msg)) {
                do_send = 1;
        }
 
@@ -446,6 +444,7 @@ void flush_individual_conversation(struct imlog *im) {
        struct CtdlMessage *msg;
        long msgnum = 0;
        char roomname[ROOMNAMELEN];
+       StrBuf *MsgBuf, *FullMsgBuf;
 
        StrBufAppendBufPlain(im->conversation, HKEY(
                "</body>\r\n"
@@ -453,6 +452,18 @@ void flush_individual_conversation(struct imlog *im) {
                ), 0
        );
 
+       MsgBuf = StrBufRFC2047encodeMessage(im->conversation);
+       FlushStrBuf(im->conversation);
+       FullMsgBuf = NewStrBufPlain(NULL, StrLength(im->conversation) + 100);
+
+       StrBufAppendBufPlain(FullMsgBuf, HKEY(
+                       "Content-type: text/html; charset=UTF-8\r\n"
+                       "Content-Transfer-Encoding: quoted-printable\r\n"
+                       "\r\n"
+                       ), 0);
+       StrBufAppendBuf (FullMsgBuf, MsgBuf, 0);
+       FreeStrBuf(&MsgBuf);
+
        msg = malloc(sizeof(struct CtdlMessage));
        memset(msg, 0, sizeof(struct CtdlMessage));
        msg->cm_magic = CTDLMESSAGE_MAGIC;
@@ -468,8 +479,8 @@ void flush_individual_conversation(struct imlog *im) {
        }
 
        CM_SetField(msg, eOriginalRoom, HKEY(PAGELOGROOM));
-       CM_SetField(msg, eNodeName, CFG_KEY(c_nodename));
-       CM_SetAsFieldSB(msg, eMesageText, &im->conversation);   /* we own this memory now */
+       CM_SetField(msg, eNodeName, CtdlGetConfigStr("c_nodename"), strlen(CtdlGetConfigStr("c_nodename")));
+       CM_SetAsFieldSB(msg, eMesageText, &FullMsgBuf); /* we own this memory now */
 
        /* Start with usernums[1] because it's guaranteed to be higher than usernums[0],
         * so if there's only one party, usernums[0] will be zero but usernums[1] won't.
@@ -493,9 +504,9 @@ void flush_individual_conversation(struct imlog *im) {
        }
 
        /* Finally, if we're logging instant messages globally, do that now. */
-       if (!IsEmptyStr(config.c_logpages)) {
-               CtdlCreateRoom(config.c_logpages, 3, "", 0, 1, 1, VIEW_BBS);
-               CtdlSaveMsgPointerInRoom(config.c_logpages, msgnum, 0, NULL);
+       if (!IsEmptyStr(CtdlGetConfigStr("c_logpages"))) {
+               CtdlCreateRoom(CtdlGetConfigStr("c_logpages"), 3, "", 0, 1, 1, VIEW_BBS);
+               CtdlSaveMsgPointerInRoom(CtdlGetConfigStr("c_logpages"), msgnum, 0, NULL);
        }
 
 }