diff --git a/src/command/command.c b/src/command/command.c index 9b26f89d..a390ae1b 100644 --- a/src/command/command.c +++ b/src/command/command.c @@ -1793,12 +1793,7 @@ cmd_execute_default(const char * inp) } else { ProfWin *current = wins_get_current(); ProfChatWin *chatwin = (ProfChatWin*)current; - GString *send_recipient = g_string_new(chatwin->barejid); - if (current && chatwin->resource) { - g_string_append(send_recipient, "/"); - g_string_append(send_recipient, chatwin->resource); - } - + assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK); #ifdef HAVE_LIBOTR prof_otrpolicy_t policy = otr_get_policy(chatwin->barejid); if (policy == PROF_OTRPOLICY_ALWAYS && !otr_is_secure(chatwin->barejid)) { @@ -1808,7 +1803,18 @@ cmd_execute_default(const char * inp) if (otr_is_secure(chatwin->barejid)) { char *encrypted = otr_encrypt_message(chatwin->barejid, inp); if (encrypted != NULL) { - message_send_chat(chatwin->barejid, encrypted); + gboolean send_state = FALSE; + if (prefs_get_boolean(PREF_STATES)) { + if (!chat_session_exists(chatwin->barejid)) { + chat_session_start(chatwin->barejid, TRUE); + } + if (chat_session_get_recipient_supports(chatwin->barejid)) { + chat_session_set_active(chatwin->barejid); + send_state = TRUE; + } + } + + message_send_chat(chatwin->barejid, chatwin->barejid, encrypted, send_state); otr_free_message(encrypted); if (prefs_get_boolean(PREF_CHLOG)) { const char *jid = jabber_get_fulljid(); @@ -1828,7 +1834,17 @@ cmd_execute_default(const char * inp) cons_show_error("Failed to send message."); } } else { - message_send_chat(send_recipient->str, inp); + gboolean send_state = FALSE; + if (prefs_get_boolean(PREF_STATES)) { + if (!chat_session_exists(chatwin->barejid)) { + chat_session_start(chatwin->barejid, TRUE); + } + if (chat_session_get_recipient_supports(chatwin->barejid)) { + chat_session_set_active(chatwin->barejid); + send_state = TRUE; + } + } + message_send_chat(chatwin->barejid, chatwin->resource, inp, send_state); if (prefs_get_boolean(PREF_CHLOG)) { const char *jid = jabber_get_fulljid(); Jid *jidp = jid_create(jid); @@ -1839,7 +1855,17 @@ cmd_execute_default(const char * inp) ui_outgoing_chat_msg("me", chatwin->barejid, inp); } #else - message_send_chat(send_recipient->str, inp); + gboolean send_state = FALSE; + if (prefs_get_boolean(PREF_STATES)) { + if (!chat_session_exists(chatwin->barejid)) { + chat_session_start(chatwin->barejid, TRUE); + } + if (chat_session_get_recipient_supports(chatwin->barejid)) { + chat_session_set_active(chatwin->barejid); + send_state = TRUE; + } + } + message_send_chat(chatwin->barejid, chatwin->resource, inp, send_state); if (prefs_get_boolean(PREF_CHLOG)) { const char *jid = jabber_get_fulljid(); Jid *jidp = jid_create(jid); @@ -1849,7 +1875,6 @@ cmd_execute_default(const char * inp) ui_outgoing_chat_msg("me", chatwin->barejid, inp); #endif - g_string_free(send_recipient, TRUE); } break; diff --git a/src/command/commands.c b/src/command/commands.c index bf859369..a4c36a62 100644 --- a/src/command/commands.c +++ b/src/command/commands.c @@ -1146,40 +1146,50 @@ cmd_msg(gchar **args, struct cmd_help_t help) return TRUE; } else { - char *usr_jid = roster_barejid_from_name(usr); - if (usr_jid == NULL) { - usr_jid = usr; + // get barejid + char *barejid = roster_barejid_from_name(usr); + if (barejid == NULL) { + barejid = usr; } - GString *send_jid = g_string_new(usr_jid); - ProfWin *current = wins_get_current(); - // if msg to current recipient, attach resource if set + // if msg to current recipient, and resource specified, set resource + char *resource = NULL; + ProfWin *current = wins_get_current(); if (current->type == WIN_CHAT) { ProfChatWin *chatwin = (ProfChatWin*)current; assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK); - if ((g_strcmp0(chatwin->barejid, usr_jid) == 0) && (chatwin->resource)) { - g_string_append(send_jid, "/"); - g_string_append(send_jid, chatwin->resource); + if ((g_strcmp0(chatwin->barejid, barejid) == 0) && (chatwin->resource)) { + resource = chatwin->resource; } } if (msg != NULL) { #ifdef HAVE_LIBOTR - if (otr_is_secure(usr_jid)) { - char *encrypted = otr_encrypt_message(usr_jid, msg); + if (otr_is_secure(barejid)) { + char *encrypted = otr_encrypt_message(barejid, msg); if (encrypted != NULL) { - message_send_chat(usr_jid, encrypted); + gboolean send_state = FALSE; + if (prefs_get_boolean(PREF_STATES)) { + if (!chat_session_exists(barejid)) { + chat_session_start(barejid, TRUE); + } + if (chat_session_get_recipient_supports(barejid)) { + chat_session_set_active(barejid); + send_state = TRUE; + } + } + message_send_chat(barejid, resource, encrypted, send_state); otr_free_message(encrypted); - ui_outgoing_chat_msg("me", usr_jid, msg); + ui_outgoing_chat_msg("me", barejid, msg); if (((win_type == WIN_CHAT) || (win_type == WIN_CONSOLE)) && prefs_get_boolean(PREF_CHLOG)) { const char *jid = jabber_get_fulljid(); Jid *jidp = jid_create(jid); char *pref_otr_log = prefs_get_string(PREF_OTR_LOG); if (strcmp(pref_otr_log, "on") == 0) { - chat_log_chat(jidp->barejid, usr_jid, msg, PROF_OUT_LOG, NULL); + chat_log_chat(jidp->barejid, barejid, msg, PROF_OUT_LOG, NULL); } else if (strcmp(pref_otr_log, "redact") == 0) { - chat_log_chat(jidp->barejid, usr_jid, "[redacted]", PROF_OUT_LOG, NULL); + chat_log_chat(jidp->barejid, barejid, "[redacted]", PROF_OUT_LOG, NULL); } prefs_free_string(pref_otr_log); jid_destroy(jidp); @@ -1188,7 +1198,7 @@ cmd_msg(gchar **args, struct cmd_help_t help) cons_show_error("Failed to encrypt and send message,"); } } else { - prof_otrpolicy_t policy = otr_get_policy(usr_jid); + prof_otrpolicy_t policy = otr_get_policy(barejid); if (policy == PROF_OTRPOLICY_ALWAYS) { cons_show_error("Failed to send message. Please check OTR policy"); @@ -1197,59 +1207,81 @@ cmd_msg(gchar **args, struct cmd_help_t help) GString *otr_message = g_string_new(msg); g_string_append(otr_message, OTRL_MESSAGE_TAG_BASE); g_string_append(otr_message, OTRL_MESSAGE_TAG_V2); - message_send_chat(usr_jid, otr_message->str); + + gboolean send_state = FALSE; + if (prefs_get_boolean(PREF_STATES)) { + if (!chat_session_exists(barejid)) { + chat_session_start(barejid, TRUE); + } + if (chat_session_get_recipient_supports(barejid)) { + chat_session_set_active(barejid); + send_state = TRUE; + } + } + message_send_chat(barejid, resource, otr_message->str, send_state); + g_string_free(otr_message, TRUE); } else { - message_send_chat(send_jid->str, msg); + gboolean send_state = FALSE; + if (prefs_get_boolean(PREF_STATES)) { + if (!chat_session_exists(barejid)) { + chat_session_start(barejid, TRUE); + } + if (chat_session_get_recipient_supports(barejid)) { + chat_session_set_active(barejid); + send_state = TRUE; + } + } + message_send_chat(barejid, resource, msg, send_state); } - ui_outgoing_chat_msg("me", usr_jid, msg); + ui_outgoing_chat_msg("me", barejid, msg); if (((win_type == WIN_CHAT) || (win_type == WIN_CONSOLE)) && prefs_get_boolean(PREF_CHLOG)) { const char *jid = jabber_get_fulljid(); Jid *jidp = jid_create(jid); - chat_log_chat(jidp->barejid, usr_jid, msg, PROF_OUT_LOG, NULL); + chat_log_chat(jidp->barejid, barejid, msg, PROF_OUT_LOG, NULL); jid_destroy(jidp); } } return TRUE; #else - message_send_chat(send_jid->str, msg); - ui_outgoing_chat_msg("me", usr_jid, msg); + gboolean send_state = FALSE; + if (prefs_get_boolean(PREF_STATES)) { + if (!chat_session_exists(barejid)) { + chat_session_start(barejid, TRUE); + } + if (chat_session_get_recipient_supports(barejid)) { + chat_session_set_active(barejid); + send_state = TRUE; + } + } + message_send_chat(barejid, resource, msg, send_state); + ui_outgoing_chat_msg("me", barejid, msg); if (((win_type == WIN_CHAT) || (win_type == WIN_CONSOLE)) && prefs_get_boolean(PREF_CHLOG)) { const char *jid = jabber_get_fulljid(); Jid *jidp = jid_create(jid); - chat_log_chat(jidp->barejid, usr_jid, msg, PROF_OUT_LOG, NULL); + chat_log_chat(jidp->barejid, barejid, msg, PROF_OUT_LOG, NULL); jid_destroy(jidp); } return TRUE; #endif } else { // msg == NULL - const char * jid = NULL; - - if (roster_barejid_from_name(usr_jid) != NULL) { - jid = roster_barejid_from_name(usr_jid); - } else { - jid = usr_jid; - } - if (prefs_get_boolean(PREF_STATES)) { - if (!chat_session_exists(jid)) { - chat_session_start(jid, TRUE); + if (!chat_session_exists(barejid)) { + chat_session_start(barejid, TRUE); } } - ui_new_chat_win(usr_jid); + ui_new_chat_win(barejid); #ifdef HAVE_LIBOTR - if (otr_is_secure(jid)) { - ui_gone_secure(jid, otr_is_trusted(jid)); + if (otr_is_secure(barejid)) { + ui_gone_secure(barejid, otr_is_trusted(barejid)); } #endif return TRUE; } - - g_string_free(send_jid, TRUE); } } @@ -2965,17 +2997,21 @@ cmd_tiny(gchar **args, struct cmd_help_t help) if (tiny != NULL) { if (win_type == WIN_CHAT) { ProfChatWin *chatwin = wins_get_current_chat(); - GString *send_recipient = g_string_new(chatwin->barejid); - if (chatwin->resource) { - g_string_append(send_recipient, "/"); - g_string_append(send_recipient, chatwin->resource); - } - #ifdef HAVE_LIBOTR if (otr_is_secure(chatwin->barejid)) { char *encrypted = otr_encrypt_message(chatwin->barejid, tiny); if (encrypted != NULL) { - message_send_chat(chatwin->barejid, encrypted); + gboolean send_state = FALSE; + if (prefs_get_boolean(PREF_STATES)) { + if (!chat_session_exists(chatwin->barejid)) { + chat_session_start(chatwin->barejid, TRUE); + } + if (chat_session_get_recipient_supports(chatwin->barejid)) { + chat_session_set_active(chatwin->barejid); + send_state = TRUE; + } + } + message_send_chat(chatwin->barejid, chatwin->resource, encrypted, send_state); otr_free_message(encrypted); if (prefs_get_boolean(PREF_CHLOG)) { const char *jid = jabber_get_fulljid(); @@ -2995,7 +3031,17 @@ cmd_tiny(gchar **args, struct cmd_help_t help) cons_show_error("Failed to send message."); } } else { - message_send_chat(send_recipient->str, tiny); + gboolean send_state = FALSE; + if (prefs_get_boolean(PREF_STATES)) { + if (!chat_session_exists(chatwin->barejid)) { + chat_session_start(chatwin->barejid, TRUE); + } + if (chat_session_get_recipient_supports(chatwin->barejid)) { + chat_session_set_active(chatwin->barejid); + send_state = TRUE; + } + } + message_send_chat(chatwin->barejid, chatwin->resource, tiny, send_state); if (prefs_get_boolean(PREF_CHLOG)) { const char *jid = jabber_get_fulljid(); Jid *jidp = jid_create(jid); @@ -3006,7 +3052,17 @@ cmd_tiny(gchar **args, struct cmd_help_t help) ui_outgoing_chat_msg("me", chatwin->barejid, tiny); } #else - message_send_chat(send_recipient->str, tiny); + gboolean send_state = FALSE; + if (prefs_get_boolean(PREF_STATES)) { + if (!chat_session_exists(chatwin->barejid)) { + chat_session_start(chatwin->barejid, TRUE); + } + if (chat_session_get_recipient_supports(chatwin->barejid)) { + chat_session_set_active(chatwin->barejid); + send_state = TRUE; + } + } + message_send_chat(chatwin->barejid, chatwin->resource, tiny); if (prefs_get_boolean(PREF_CHLOG)) { const char *jid = jabber_get_fulljid(); Jid *jidp = jid_create(jid); @@ -3016,8 +3072,6 @@ cmd_tiny(gchar **args, struct cmd_help_t help) ui_outgoing_chat_msg("me", chatwin->barejid, tiny); #endif - g_string_free(send_recipient, TRUE); - } else if (win_type == WIN_PRIVATE) { ProfPrivateWin *privatewin = wins_get_current_private(); message_send_private(tiny, privatewin->fulljid); @@ -3931,7 +3985,17 @@ cmd_otr(gchar **args, struct cmd_help_t help) ui_current_print_formatted_line('!', 0, "You have not generated or loaded a private key, use '/otr gen'"); } else if (!otr_is_secure(barejid)) { char *otr_query_message = otr_start_query(); - message_send_chat(barejid, otr_query_message); + gboolean send_state = FALSE; + if (prefs_get_boolean(PREF_STATES)) { + if (!chat_session_exists(barejid)) { + chat_session_start(barejid, TRUE); + } + if (chat_session_get_recipient_supports(barejid)) { + chat_session_set_active(barejid); + send_state = TRUE; + } + } + message_send_chat(barejid, NULL, otr_query_message, send_state); } else { ui_gone_secure(barejid, otr_is_trusted(barejid)); } @@ -3949,7 +4013,17 @@ cmd_otr(gchar **args, struct cmd_help_t help) } else { ProfChatWin *chatwin = ui_get_current_chat(); char *otr_query_message = otr_start_query(); - message_send_chat(chatwin->barejid, otr_query_message); + gboolean send_state = FALSE; + if (prefs_get_boolean(PREF_STATES)) { + if (!chat_session_exists(chatwin->barejid)) { + chat_session_start(chatwin->barejid, TRUE); + } + if (chat_session_get_recipient_supports(chatwin->barejid)) { + chat_session_set_active(chatwin->barejid); + send_state = TRUE; + } + } + message_send_chat(chatwin->barejid, NULL, otr_query_message, send_state); } } } diff --git a/src/otr/otr.c b/src/otr/otr.c index b6625d1b..3c0fe990 100644 --- a/src/otr/otr.c +++ b/src/otr/otr.c @@ -45,6 +45,7 @@ #include "contact.h" #include "ui/ui.h" #include "config/preferences.h" +#include "chat_session.h" #define PRESENCE_ONLINE 1 #define PRESENCE_OFFLINE 0 @@ -109,7 +110,17 @@ static void cb_inject_message(void *opdata, const char *accountname, const char *protocol, const char *recipient, const char *message) { - message_send_chat(recipient, message); + gboolean send_state = FALSE; + if (prefs_get_boolean(PREF_STATES)) { + if (!chat_session_exists(recipient)) { + chat_session_start(recipient, TRUE); + } + if (chat_session_get_recipient_supports(recipient)) { + chat_session_set_active(recipient); + send_state = TRUE; + } + } + message_send_chat(recipient, NULL, message, send_state); } static void diff --git a/src/server_events.c b/src/server_events.c index c730d0fa..e7360f0d 100644 --- a/src/server_events.c +++ b/src/server_events.c @@ -320,7 +320,17 @@ handle_incoming_message(char *barejid, char *message) memmove(whitespace_base, whitespace_base+tag_length, tag_length); char *otr_query_message = otr_start_query(); cons_show("OTR Whitespace pattern detected. Attempting to start OTR session..."); - message_send_chat(barejid, otr_query_message); + gboolean send_state = FALSE; + if (prefs_get_boolean(PREF_STATES)) { + if (!chat_session_exists(barejid)) { + chat_session_start(barejid, TRUE); + } + if (chat_session_get_recipient_supports(barejid)) { + chat_session_set_active(barejid); + send_state = TRUE; + } + } + message_send_chat(barejid, NULL, otr_query_message, send_state); } } } @@ -334,7 +344,17 @@ handle_incoming_message(char *barejid, char *message) if (policy == PROF_OTRPOLICY_ALWAYS && !was_decrypted && !whitespace_base) { char *otr_query_message = otr_start_query(); cons_show("Attempting to start OTR session..."); - message_send_chat(barejid, otr_query_message); + gboolean send_state = FALSE; + if (prefs_get_boolean(PREF_STATES)) { + if (!chat_session_exists(barejid)) { + chat_session_start(barejid, TRUE); + } + if (chat_session_get_recipient_supports(barejid)) { + chat_session_set_active(barejid); + send_state = TRUE; + } + } + message_send_chat(barejid, NULL, otr_query_message, send_state); } ui_incoming_msg(barejid, newmessage, NULL); diff --git a/src/xmpp/message.c b/src/xmpp/message.c index 17119bb8..d2748a13 100644 --- a/src/xmpp/message.c +++ b/src/xmpp/message.c @@ -80,36 +80,27 @@ message_add_handlers(void) } void -message_send_chat(const char * const barejid, const char * const msg) +message_send_chat(const char * const barejid, const char * const resource, const char * const msg, gboolean send_state) { - const char * jid = NULL; - - if (roster_barejid_from_name(barejid) != NULL) { - jid = roster_barejid_from_name(barejid); - } else { - jid = barejid; - } - - if (prefs_get_boolean(PREF_STATES)) { - if (!chat_session_exists(jid)) { - chat_session_start(jid, TRUE); - } - } - xmpp_stanza_t *message; xmpp_conn_t * const conn = connection_get_conn(); xmpp_ctx_t * const ctx = connection_get_ctx(); - if (prefs_get_boolean(PREF_STATES) && chat_session_get_recipient_supports(jid)) { - chat_session_set_active(jid); - message = stanza_create_message(ctx, jid, STANZA_TYPE_CHAT, - msg, STANZA_NAME_ACTIVE); + + GString *jid = g_string_new(barejid); + if (resource) { + g_string_append(jid, "/"); + g_string_append(jid, resource); + } + + if (send_state) { + message = stanza_create_message(ctx, jid->str, STANZA_TYPE_CHAT, msg, STANZA_NAME_ACTIVE); } else { - message = stanza_create_message(ctx, jid, STANZA_TYPE_CHAT, - msg, NULL); + message = stanza_create_message(ctx, jid->str, STANZA_TYPE_CHAT, msg, NULL); } xmpp_send(conn, message); xmpp_stanza_release(message); + g_string_free(jid, TRUE); } void diff --git a/src/xmpp/xmpp.h b/src/xmpp/xmpp.h index f96a9100..2499d008 100644 --- a/src/xmpp/xmpp.h +++ b/src/xmpp/xmpp.h @@ -145,7 +145,8 @@ char* jabber_get_account_name(void); GList * jabber_get_available_resources(void); // message functions -void message_send_chat(const char * const barejid, const char * const msg); +void message_send_chat(const char * const barejid, const char * const resource, const char * const msg, + gboolean send_state); void message_send_private(const char * const fulljid, const char * const msg); void message_send_groupchat(const char * const roomjid, const char * const msg); void message_send_groupchat_subject(const char * const roomjid, const char * const subject); diff --git a/tests/test_cmd_otr.c b/tests/test_cmd_otr.c index 7d0adc1a..3cd9dd59 100644 --- a/tests/test_cmd_otr.c +++ b/tests/test_cmd_otr.c @@ -552,7 +552,9 @@ cmd_otr_start_sends_otr_query_message_to_current_recipeint(void **state) will_return(otr_start_query, query_message); expect_string(message_send_chat, barejid, chatwin->barejid); + expect_value(message_send_chat, resource, NULL); expect_string(message_send_chat, msg, query_message); + expect_any(message_send_chat, send_state); gboolean result = cmd_otr(args, *help); assert_true(result); diff --git a/tests/xmpp/stub_xmpp.c b/tests/xmpp/stub_xmpp.c index 6a095053..580a6c61 100644 --- a/tests/xmpp/stub_xmpp.c +++ b/tests/xmpp/stub_xmpp.c @@ -58,10 +58,13 @@ GList * jabber_get_available_resources(void) } // message functions -void message_send_chat(const char * const barejid, const char * const msg) +void message_send_chat(const char * const barejid, const char * const resource, const char * const msg, + gboolean send_state) { check_expected(barejid); + check_expected(resource); check_expected(msg); + check_expected(send_state); } void message_send_private(const char * const fulljid, const char * const msg) {}