X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Finstmsg%2Fserv_instmsg.c;h=a774c61f2f4d030160bf0c7bc39e550b2c7b7120;hb=0387f48886a9395d89eaca01cd40ab751610426f;hp=fb74d9716863572b9538fba4c4c89ffb423b40c9;hpb=0428f9c321bffd2afbd5c41c1170b74d240a5c64;p=citadel.git diff --git a/citadel/modules/instmsg/serv_instmsg.c b/citadel/modules/instmsg/serv_instmsg.c index fb74d9716..a774c61f2 100644 --- a/citadel/modules/instmsg/serv_instmsg.c +++ b/citadel/modules/instmsg/serv_instmsg.c @@ -1,23 +1,17 @@ /* * This module handles instant messaging between users. * - * Copyright (c) 1987-2010 by the citadel.org team + * Copyright (c) 1987-2020 by the citadel.org team * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. + * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * */ + #include "sysdep.h" #include #include @@ -51,11 +45,6 @@ #include "config.h" #include "msgbase.h" #include "user_ops.h" - -#ifndef HAVE_SNPRINTF -#include "snprintf.h" -#endif - #include "ctdl_module.h" struct imlog { @@ -121,15 +110,9 @@ void log_instant_message(struct CitContext *me, struct CitContext *them, char *m this_im->conversation = NewStrBuf(); 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" - "\r\n" - ), 0); + StrBufAppendBufPlain(this_im->conversation, HKEY("\r\n"), 0); } - /* Since it's possible for this function to get called more than once if a user is logged * in on multiple sessions, we use the message's serial number to keep track of whether * we've already logged it. @@ -166,7 +149,6 @@ void delete_instant_messages(void) { } - /* * Retrieve instant messages */ @@ -189,7 +171,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 */ ); @@ -202,6 +184,7 @@ void cmd_gexp(char *argbuf) { free(ptr); } + /* * Asynchronously deliver instant messages */ @@ -216,6 +199,7 @@ void cmd_gexp_async(void) { cprintf("%d instant msg\n", ASYNC_MSG + ASYNC_GEXP); } + /* * Back end support function for send_instant_message() and company */ @@ -241,8 +225,6 @@ void add_xmsg_to_context(struct CitContext *ccptr, struct ExpressMessage *newmsg } - - /* * This is the back end to the instant message sending function. * Returns the number of users to which the message was sent. @@ -253,11 +235,10 @@ int send_instant_message(char *lun, char *lem, char *x_user, char *x_msg) int message_sent = 0; /* number of successful sends */ struct CitContext *ccptr; struct ExpressMessage *newmsg = NULL; - char *un; 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; } @@ -266,14 +247,7 @@ int send_instant_message(char *lun, char *lem, char *x_user, char *x_msg) ++serial_number; for (ccptr = ContextList; ccptr != NULL; ccptr = ccptr->next) { - if (ccptr->fake_username[0]) { - un = ccptr->fake_username; - } - else { - un = ccptr->user.fullname; - } - - if ( ((!strcasecmp(un, x_user)) + if ( ((!strcasecmp(ccptr->user.fullname, x_user)) || (!strcasecmp(x_user, "broadcast"))) && (ccptr->can_receive_im) && ((ccptr->disable_exp == 0) @@ -303,6 +277,7 @@ int send_instant_message(char *lun, char *lem, char *x_user, char *x_msg) return (message_sent); } + /* * send instant messages */ @@ -311,7 +286,6 @@ void cmd_sexp(char *argbuf) int message_sent = 0; char x_user[USERNAME_SIZE]; char x_msg[1024]; - char *lun; char *lem; char *x_big_msgbuf = NULL; @@ -319,12 +293,8 @@ void cmd_sexp(char *argbuf) cprintf("%d Not logged in.\n", ERROR + NOT_LOGGED_IN); return; } - if (CC->fake_username[0]) - lun = CC->fake_username; - else - lun = CC->user.fullname; - lem = CC->cs_inet_email; + lem = CC->cs_principal_id; extract_token(x_user, argbuf, 0, '|', sizeof x_user); extract_token(x_msg, argbuf, 1, '|', sizeof x_msg); @@ -340,7 +310,7 @@ void cmd_sexp(char *argbuf) } /* This loop handles text-transfer pages */ if (!strcmp(x_msg, "-")) { - message_sent = PerformXmsgHooks(lun, lem, x_user, ""); + message_sent = PerformXmsgHooks(CC->user.fullname, lem, x_user, ""); if (message_sent == 0) { if (CtdlGetUser(NULL, x_user)) cprintf("%d '%s' does not exist.\n", @@ -364,29 +334,32 @@ void cmd_sexp(char *argbuf) strcat(x_big_msgbuf, "\n"); strcat(x_big_msgbuf, x_msg); } - PerformXmsgHooks(lun, lem, x_user, x_big_msgbuf); + PerformXmsgHooks(CC->user.fullname, lem, x_user, x_big_msgbuf); free(x_big_msgbuf); /* This loop handles inline pages */ } else { - message_sent = PerformXmsgHooks(lun, lem, x_user, x_msg); + message_sent = PerformXmsgHooks(CC->user.fullname, lem, x_user, x_msg); if (message_sent > 0) { - if (!IsEmptyStr(x_msg)) + if (!IsEmptyStr(x_msg)) { cprintf("%d Message sent", CIT_OK); - else + } + else { cprintf("%d Ok to send message", CIT_OK); - if (message_sent > 1) + } + if (message_sent > 1) { cprintf(" to %d users", message_sent); + } cprintf(".\n"); } else { - if (CtdlGetUser(NULL, x_user)) - cprintf("%d '%s' does not exist.\n", - ERROR + NO_SUCH_USER, x_user); - else - cprintf("%d '%s' is not logged in " - "or is not accepting pages.\n", + if (CtdlGetUser(NULL, x_user)) { + cprintf("%d '%s' does not exist.\n", ERROR + NO_SUCH_USER, x_user); + } + else { + cprintf("%d '%s' is not logged in or is not accepting instant messages.\n", ERROR + RESOURCE_NOT_OPEN, x_user); + } } @@ -394,7 +367,6 @@ void cmd_sexp(char *argbuf) } - /* * Enter or exit paging-disabled mode */ @@ -458,6 +430,7 @@ void flush_individual_conversation(struct imlog *im) { struct CtdlMessage *msg; long msgnum = 0; char roomname[ROOMNAMELEN]; + StrBuf *MsgBuf, *FullMsgBuf; StrBufAppendBufPlain(im->conversation, HKEY( "\r\n" @@ -465,22 +438,35 @@ 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; msg->cm_anon_type = MES_NORMAL; msg->cm_format_type = FMT_RFC822; if (!IsEmptyStr(im->usernames[0])) { - msg->cm_fields['A'] = strdup(im->usernames[0]); + CM_SetField(msg, eAuthor, im->usernames[0], strlen(im->usernames[0])); } else { - msg->cm_fields['A'] = strdup("Citadel"); + CM_SetField(msg, eAuthor, HKEY("Citadel")); } if (!IsEmptyStr(im->usernames[1])) { - msg->cm_fields['R'] = strdup(im->usernames[1]); + CM_SetField(msg, eRecipient, im->usernames[1], strlen(im->usernames[1])); } - msg->cm_fields['O'] = strdup(PAGELOGROOM); - msg->cm_fields['N'] = strdup(NODENAME); - msg->cm_fields['M'] = SmashStrBuf(&im->conversation); /* we own this memory now */ + + CM_SetField(msg, eOriginalRoom, HKEY(PAGELOGROOM)); + 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,8 +479,8 @@ void flush_individual_conversation(struct imlog *im) { */ snprintf(roomname, sizeof roomname, "%010ld.%s", im->usernums[1], PAGELOGROOM); CtdlCreateRoom(roomname, 5, "", 0, 1, 1, VIEW_BBS); - msgnum = CtdlSubmitMsg(msg, NULL, roomname, 0); - CtdlFreeMessage(msg); + msgnum = CtdlSubmitMsg(msg, NULL, roomname); + CM_Free(msg); /* If there is a valid user number in usernums[0], save a copy for them too. */ if (im->usernums[0] > 0) { @@ -504,9 +490,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); } } @@ -599,11 +585,11 @@ CTDL_MODULE_INIT(instmsg) CtdlRegisterProtoHook(cmd_sexp, "SEXP", "Send an instant message"); CtdlRegisterProtoHook(cmd_dexp, "DEXP", "Disable instant messages"); CtdlRegisterProtoHook(cmd_reqt, "REQT", "Request client termination"); - CtdlRegisterSessionHook(cmd_gexp_async, EVT_ASYNC); - CtdlRegisterSessionHook(delete_instant_messages, EVT_STOP); + CtdlRegisterSessionHook(cmd_gexp_async, EVT_ASYNC, PRIO_ASYNC + 1); + CtdlRegisterSessionHook(delete_instant_messages, EVT_STOP, PRIO_STOP + 1); CtdlRegisterXmsgHook(send_instant_message, XMSG_PRI_LOCAL); - CtdlRegisterSessionHook(instmsg_timer, EVT_TIMER); - CtdlRegisterSessionHook(instmsg_shutdown, EVT_SHUTDOWN); + CtdlRegisterSessionHook(instmsg_timer, EVT_TIMER, PRIO_CLEANUP + 400); + CtdlRegisterSessionHook(instmsg_shutdown, EVT_SHUTDOWN, PRIO_SHUTDOWN + 10); } /* return our module name for the log */