void sv_ev_lost_connection(void) { cons_show_error("Lost connection."); #ifdef HAVE_LIBOTR GSList *recipients = wins_get_chat_recipients(); GSList *curr = recipients; while (curr) { char *barejid = curr->data; ProfChatWin *chatwin = wins_get_chat(barejid); if (chatwin && otr_is_secure(barejid)) { chatwin_otr_unsecured(chatwin); otr_end_session(barejid); } curr = g_slist_next(curr); } if (recipients) { g_slist_free(recipients); } #endif muc_invites_clear(); chat_sessions_clear(); ui_disconnected(); roster_destroy(); #ifdef HAVE_LIBGPGME p_gpg_on_disconnect(); #endif }
void sv_ev_outgoing_carbon(char *barejid, char *message, char *pgp_message) { ProfChatWin *chatwin = wins_get_chat(barejid); if (!chatwin) { chatwin = chatwin_new(barejid); } chat_state_active(chatwin->state); #ifdef HAVE_LIBGPGME if (pgp_message) { char *decrypted = p_gpg_decrypt(pgp_message); if (decrypted) { chatwin_outgoing_carbon(chatwin, decrypted, PROF_MSG_PGP); } else { chatwin_outgoing_carbon(chatwin, message, PROF_MSG_PLAIN); } } else { chatwin_outgoing_carbon(chatwin, message, PROF_MSG_PLAIN); } #else chatwin_outgoing_carbon(chatwin, message, PROF_MSG_PLAIN); #endif }
int api_chat_show(const char *const barejid, const char *message) { if (message == NULL) { log_warning("%s", "api_chat_show failed, message is NULL"); return 0; } if (barejid == NULL) { log_warning("%s", "api_chat_show failed, barejid is NULL"); return 0; } ProfChatWin *chatwin = wins_get_chat(barejid); if (chatwin == NULL) { log_warning("%s", "api_chat_show failed, could not find chat window for %s", barejid); return 0; } char *parsed = str_replace(message, "\r\n", "\n"); win_println((ProfWin*)chatwin, THEME_TEXT, '-', "%s", parsed); free(parsed); return 1; }
int api_chat_set_outgoing_char(const char *const barejid, const char *const ch) { if (ch == NULL) { log_warning("%s", "api_chat_set_outgoing_char failed, ch is NULL"); return 0; } if (strlen(ch) != 1) { log_warning("%s", "api_chat_set_outgoing_char failed, ch must be a string of length 1"); return 0; } if (barejid == NULL) { log_warning("%s", "api_chat_set_outgoing_char failed, barejid is NULL"); return 0; } ProfChatWin *chatwin = wins_get_chat(barejid); if (chatwin == NULL) { log_warning("%s", "api_chat_set_outgoing_char failed, could not find chat window for %s", barejid); return 0; } chatwin_set_outgoing_char(chatwin, ch); return 1; }
void api_encryption_reset(const char *const barejid) { if (barejid == NULL) { log_warning("%s", "api_encryption_reset failed, barejid is NULL"); return; } ProfChatWin *chatwin = wins_get_chat(barejid); if (chatwin == NULL) { log_warning("%s", "api_encryption_reset failed, could not find chat window for %s", barejid); return; } #ifdef HAVE_LIBGPGME if (chatwin->pgp_send) { chatwin->pgp_send = FALSE; win_println((ProfWin*)chatwin, THEME_DEFAULT, '!', "PGP encryption disabled."); } #endif #ifdef HAVE_LIBOTR if (chatwin->is_otr) { chatwin_otr_unsecured(chatwin); otr_end_session(chatwin->barejid); } #endif }
void otr_smp_secret(const char *const recipient, const char *secret) { ConnContext *context = otrlib_context_find(user_state, recipient, jid); if (context == NULL) { return; } if (context->msgstate != OTRL_MSGSTATE_ENCRYPTED) { return; } // if recipient initiated SMP, send response, else initialise ProfChatWin *chatwin = wins_get_chat(recipient); if (g_hash_table_contains(smp_initiators, recipient)) { otrl_message_respond_smp(user_state, &ops, NULL, context, (const unsigned char*)secret, strlen(secret)); if (chatwin) { chatwin_otr_smp_event(chatwin, PROF_OTR_SMP_AUTH, NULL); } g_hash_table_remove(smp_initiators, context->username); } else { otrl_message_initiate_smp(user_state, &ops, NULL, context, (const unsigned char*)secret, strlen(secret)); if (chatwin) { chatwin_otr_smp_event(chatwin, PROF_OTR_SMP_AUTH_WAIT, NULL); } } }
void sv_ev_incoming_message(char *barejid, char *resource, char *message, char *pgp_message, GDateTime *timestamp) { gboolean new_win = FALSE; ProfChatWin *chatwin = wins_get_chat(barejid); if (!chatwin) { ProfWin *window = wins_new_chat(barejid); chatwin = (ProfChatWin*)window; new_win = TRUE; } // OTR suported, PGP supported #ifdef HAVE_LIBOTR #ifdef HAVE_LIBGPGME if (pgp_message) { if (chatwin->is_otr) { win_println((ProfWin*)chatwin, 0, "PGP encrypted message received whilst in OTR session."); } else { // PROF_ENC_NONE, PROF_ENC_PGP _sv_ev_incoming_pgp(chatwin, new_win, barejid, resource, message, pgp_message, timestamp); } } else { _sv_ev_incoming_otr(chatwin, new_win, barejid, resource, message, timestamp); } rosterwin_roster(); return; #endif #endif // OTR supported, PGP unsupported #ifdef HAVE_LIBOTR #ifndef HAVE_LIBGPGME _sv_ev_incoming_otr(chatwin, new_win, barejid, resource, message, timestamp); rosterwin_roster(); return; #endif #endif // OTR unsupported, PGP supported #ifndef HAVE_LIBOTR #ifdef HAVE_LIBGPGME if (pgp_message) { _sv_ev_incoming_pgp(chatwin, new_win, barejid, resource, message, pgp_message, timestamp); } else { _sv_ev_incoming_plain(chatwin, new_win, barejid, resource, message, timestamp); } rosterwin_roster(); return; #endif #endif // OTR unsupported, PGP unsupported #ifndef HAVE_LIBOTR #ifndef HAVE_LIBGPGME _sv_ev_incoming_plain(chatwin, new_win, barejid, resource, message, timestamp); rosterwin_roster(); return; #endif #endif }
void ui_contact_offline(char *barejid, char *resource, char *status) { char *show_console = prefs_get_string(PREF_STATUSES_CONSOLE); char *show_chat_win = prefs_get_string(PREF_STATUSES_CHAT); Jid *jid = jid_create_from_bare_and_resource(barejid, resource); PContact contact = roster_get_contact(barejid); if (p_contact_subscription(contact)) { if (strcmp(p_contact_subscription(contact), "none") != 0) { // show in console if "all" if (g_strcmp0(show_console, "all") == 0) { cons_show_contact_offline(contact, resource, status); // show in console of "online" } else if (g_strcmp0(show_console, "online") == 0) { cons_show_contact_offline(contact, resource, status); } // show in chat win if "all" if (g_strcmp0(show_chat_win, "all") == 0) { ProfChatWin *chatwin = wins_get_chat(barejid); if (chatwin) { chatwin_contact_offline(chatwin, resource, status); } // show in chat win if "online" and presence online } else if (g_strcmp0(show_chat_win, "online") == 0) { ProfChatWin *chatwin = wins_get_chat(barejid); if (chatwin) { chatwin_contact_offline(chatwin, resource, status); } } } } ProfChatWin *chatwin = wins_get_chat(barejid); if (chatwin && chatwin->resource_override && (g_strcmp0(resource, chatwin->resource_override) == 0)) { FREE_SET_NULL(chatwin->resource_override); } prefs_free_string(show_console); prefs_free_string(show_chat_win); jid_destroy(jid); }
void sv_ev_message_receipt(const char *const barejid, const char *const id) { ProfChatWin *chatwin = wins_get_chat(barejid); if (!chatwin) return; chatwin_receipt_received(chatwin, id); }
static void cb_gone_secure(void *opdata, ConnContext *context) { ProfChatWin *chatwin = wins_get_chat(context->username); if (!chatwin) { chatwin = (ProfChatWin*) wins_new_chat(context->username); } chatwin_otr_secured(chatwin, otr_is_trusted(context->username)); }
void ui_handle_otr_error(const char *const barejid, const char *const message) { ProfChatWin *chatwin = wins_get_chat(barejid); if (chatwin) { win_println((ProfWin*)chatwin, THEME_ERROR, '!', "%s", message); } else { cons_show_error("%s - %s", barejid, message); } }
void ui_contact_online(char *barejid, Resource *resource, GDateTime *last_activity) { char *show_console = prefs_get_string(PREF_STATUSES_CONSOLE); char *show_chat_win = prefs_get_string(PREF_STATUSES_CHAT); PContact contact = roster_get_contact(barejid); // show nothing if (g_strcmp0(p_contact_subscription(contact), "none") == 0) { free(show_console); free(show_chat_win); return; } // show in console if "all" if (g_strcmp0(show_console, "all") == 0) { cons_show_contact_online(contact, resource, last_activity); // show in console of "online" and presence online } else if (g_strcmp0(show_console, "online") == 0 && resource->presence == RESOURCE_ONLINE) { cons_show_contact_online(contact, resource, last_activity); } // show in chat win if "all" if (g_strcmp0(show_chat_win, "all") == 0) { ProfChatWin *chatwin = wins_get_chat(barejid); if (chatwin) { chatwin_contact_online(chatwin, resource, last_activity); } // show in char win if "online" and presence online } else if (g_strcmp0(show_chat_win, "online") == 0 && resource->presence == RESOURCE_ONLINE) { ProfChatWin *chatwin = wins_get_chat(barejid); if (chatwin) { chatwin_contact_online(chatwin, resource, last_activity); } } free(show_console); free(show_chat_win); }
void sv_ev_incoming_carbon(char *barejid, char *resource, char *message) { gboolean new_win = FALSE; ProfChatWin *chatwin = wins_get_chat(barejid); if (!chatwin) { ProfWin *window = wins_new_chat(barejid); chatwin = (ProfChatWin*)window; new_win = TRUE; } ui_incoming_msg(chatwin, resource, message, NULL, new_win); chat_log_msg_in(barejid, message); }
void sv_ev_delayed_message(char *barejid, char *message, GDateTime *timestamp) { gboolean new_win = FALSE; ProfChatWin *chatwin = wins_get_chat(barejid); if (!chatwin) { ProfWin *window = wins_new_chat(barejid); chatwin = (ProfChatWin*)window; new_win = TRUE; } ui_incoming_msg(chatwin, NULL, message, timestamp, new_win); chat_log_msg_in_delayed(barejid, message, timestamp); }
void ui_show_software_version(const char *const jid, const char *const presence, const char *const name, const char *const version, const char *const os) { Jid *jidp = jid_create(jid); ProfWin *window = NULL; ProfWin *chatwin = (ProfWin*)wins_get_chat(jidp->barejid); ProfWin *mucwin = (ProfWin*)wins_get_muc(jidp->barejid); ProfWin *privwin = (ProfWin*)wins_get_private(jidp->fulljid); ProfWin *console = wins_get_console(); jid_destroy(jidp); if (chatwin) { if (wins_is_current(chatwin)) { window = chatwin; } else { window = console; } } else if (privwin) { if (wins_is_current(privwin)) { window = privwin; } else { window = console; } } else if (mucwin) { if (wins_is_current(mucwin)) { window = mucwin; } else { window = console; } } else { window = console; } if (name || version || os) { win_println(window, THEME_DEFAULT, '-', ""); theme_item_t presence_colour = theme_main_presence_attrs(presence); win_print(window, presence_colour, '-', "%s", jid); win_appendln(window, THEME_DEFAULT, ":"); } if (name) { win_println(window, THEME_DEFAULT, '-', "Name : %s", name); } if (version) { win_println(window, THEME_DEFAULT, '-', "Version : %s", version); } if (os) { win_println(window, THEME_DEFAULT, '-', "OS : %s", os); } }
char* otr_decrypt_message(const char *const from, const char *const message, gboolean *decrypted) { char *newmessage = NULL; OtrlTLV *tlvs = NULL; int result = otrlib_decrypt_message(user_state, &ops, jid, from, message, &newmessage, &tlvs); // internal libotr message if (result == 1) { ConnContext *context = otrlib_context_find(user_state, from, jid); // common tlv handling OtrlTLV *tlv = otrl_tlv_find(tlvs, OTRL_TLV_DISCONNECTED); if (tlv) { if (context) { otrl_context_force_plaintext(context); ProfChatWin *chatwin = wins_get_chat(from); if (chatwin) { chatwin_otr_unsecured(chatwin); } } } // library version specific tlv handling otrlib_handle_tlvs(user_state, &ops, context, tlvs, smp_initiators); _otr_tlv_free(tlvs); return NULL; // message was processed, return to user } else if (newmessage) { _otr_tlv_free(tlvs); if (g_str_has_prefix(message, "?OTR:")) { *decrypted = TRUE; } return newmessage; // normal non OTR message } else { _otr_tlv_free(tlvs); *decrypted = FALSE; return strdup(message); } }
int api_chat_unset_outgoing_char(const char *const barejid) { if (barejid == NULL) { log_warning("%s", "api_chat_unset_outgoing_char failed, barejid is NULL"); return 0; } ProfChatWin *chatwin = wins_get_chat(barejid); if (chatwin == NULL) { log_warning("%s", "api_chat_unset_outgoing_char failed, could not find chat window for %s", barejid); return 0; } chatwin_unset_outgoing_char(chatwin); return 1; }
void otr_smp_question(const char *const recipient, const char *question, const char *answer) { ConnContext *context = otrlib_context_find(user_state, recipient, jid); if (context == NULL) { return; } if (context->msgstate != OTRL_MSGSTATE_ENCRYPTED) { return; } otrl_message_initiate_smp_q(user_state, &ops, NULL, context, question, (const unsigned char*)answer, strlen(answer)); ProfChatWin *chatwin = wins_get_chat(recipient); if (chatwin) { chatwin_otr_smp_event(chatwin, PROF_OTR_SMP_AUTH_WAIT, NULL); } }
void ui_contact_typing(const char *const barejid, const char *const resource) { ProfChatWin *chatwin = wins_get_chat(barejid); ProfWin *window = (ProfWin*) chatwin; ChatSession *session = chat_session_get(barejid); if (prefs_get_boolean(PREF_INTYPE)) { // no chat window for user if (chatwin == NULL) { cons_show_typing(barejid); // have chat window but not currently in it } else if (!wins_is_current(window)) { cons_show_typing(barejid); // in chat window with user, no session or session with resource } else if (!session || (session && g_strcmp0(session->resource, resource) == 0)) { title_bar_set_typing(TRUE); int num = wins_get_num(window); status_bar_active(num); } } if (prefs_get_boolean(PREF_NOTIFY_TYPING)) { gboolean is_current = FALSE; if (window) { is_current = wins_is_current(window); } if ( !is_current || (is_current && prefs_get_boolean(PREF_NOTIFY_TYPING_CURRENT)) ) { PContact contact = roster_get_contact(barejid); char const *display_usr = NULL; if (p_contact_name(contact)) { display_usr = p_contact_name(contact); } else { display_usr = barejid; } notify_typing(display_usr); } } }
void sv_ev_contact_offline(char *barejid, char *resource, char *status) { gboolean updated = roster_contact_offline(barejid, resource, status); if (resource && updated) { ui_contact_offline(barejid, resource, status); } #ifdef PROF_HAVE_LIBOTR ProfChatWin *chatwin = wins_get_chat(barejid); if (chatwin && otr_is_secure(barejid)) { chatwin_otr_unsecured(chatwin); otr_end_session(chatwin->barejid); } #endif rosterwin_roster(); chat_session_remove(barejid); }
void prof_handle_idle(void) { jabber_conn_status_t status = jabber_get_connection_status(); if (status == JABBER_CONNECTED) { GSList *recipients = ui_get_chat_recipients(); GSList *curr = recipients; while (curr) { char *barejid = curr->data; ProfChatWin *chatwin = wins_get_chat(barejid); chat_state_handle_idle(chatwin->barejid, chatwin->state); curr = g_slist_next(curr); } if (recipients) { g_slist_free(recipients); } } }
void ui_print_system_msg_from_recipient(const char *const barejid, const char *message) { if (barejid == NULL || message == NULL) return; ProfWin *window = (ProfWin*)wins_get_chat(barejid); if (window == NULL) { int num = 0; window = wins_new_chat(barejid); if (window) { num = wins_get_num(window); status_bar_active(num); } else { num = 0; window = wins_get_console(); status_bar_active(1); } } win_println(window, THEME_DEFAULT, '-', "*%s %s", barejid, message); }
void sv_ev_gone(const char *const barejid, const char *const resource) { if (barejid && resource) { gboolean show_message = TRUE; ProfChatWin *chatwin = wins_get_chat(barejid); if (chatwin) { ChatSession *session = chat_session_get(barejid); if (session && g_strcmp0(session->resource, resource) != 0) { show_message = FALSE; } if (show_message) { chatwin_recipient_gone(chatwin); } } } if (wins_chat_exists(barejid)) { chat_session_recipient_gone(barejid, resource); } }
void sv_ev_incoming_carbon(char *barejid, char *resource, char *message, char *pgp_message) { gboolean new_win = FALSE; ProfChatWin *chatwin = wins_get_chat(barejid); if (!chatwin) { ProfWin *window = wins_new_chat(barejid); chatwin = (ProfChatWin*)window; new_win = TRUE; } #ifdef HAVE_LIBGPGME if (pgp_message) { _sv_ev_incoming_pgp(chatwin, new_win, barejid, resource, message, pgp_message, NULL); } else { _sv_ev_incoming_plain(chatwin, new_win, barejid, resource, message, NULL); } #else _sv_ev_incoming_plain(chatwin, new_win, barejid, resource, message, NULL); #endif rosterwin_roster(); }
int api_chat_show_themed(const char *const barejid, const char *const group, const char *const key, const char *const def, const char *const ch, const char *const message) { if (message == NULL) { log_warning("%s", "api_chat_show_themed failed, message is NULL"); return 0; } if (barejid == NULL) { log_warning("%s", "api_chat_show_themed failed, barejid is NULL"); return 0; } char show_ch = '-'; if (ch) { if (strlen(ch) != 1) { log_warning("%s", "api_chat_show_themed failed, ch must be a string of length 1"); return 0; } else { show_ch = ch[0]; } } ProfChatWin *chatwin = wins_get_chat(barejid); if (chatwin == NULL) { log_warning("%s", "api_chat_show_themed failed, could not find chat window for %s", barejid); return 0; } char *parsed = str_replace(message, "\r\n", "\n"); theme_item_t themeitem = plugin_themes_get(group, key, def); win_println((ProfWin*)chatwin, themeitem, show_ch, "%s", parsed); free(parsed); return 1; }
int api_chat_set_titlebar_enctext(const char *const barejid, const char *const enctext) { if (enctext == NULL) { log_warning("%s", "api_chat_set_titlebar_enctext failed, enctext is NULL"); return 0; } if (barejid == NULL) { log_warning("%s", "api_chat_set_titlebar_enctext failed, barejid is NULL"); return 0; } ProfChatWin *chatwin = wins_get_chat(barejid); if (chatwin == NULL) { log_warning("%s", "api_chat_set_titlebar_enctext failed, could not find chat window for %s", barejid); return 0; } chatwin_set_enctext(chatwin, enctext); return 1; }
void ui_handle_recipient_error(const char *const recipient, const char *const err_msg) { // always show in console cons_show_error("Error from %s: %s", recipient, err_msg); ProfChatWin *chatwin = wins_get_chat(recipient); if (chatwin) { win_println((ProfWin*)chatwin, THEME_ERROR, '!', "Error from %s: %s", recipient, err_msg); return; } ProfMucWin *mucwin = wins_get_muc(recipient); if (mucwin) { win_println((ProfWin*)mucwin, THEME_ERROR, '!', "Error from %s: %s", recipient, err_msg); return; } ProfPrivateWin *privatewin = wins_get_private(recipient); if (privatewin) { win_println((ProfWin*)privatewin, THEME_ERROR, '!', "Error from %s: %s", recipient, err_msg); return; } }
void sv_ev_incoming_message(char *barejid, char *resource, char *message, char *enc_message) { gboolean new_win = FALSE; ProfChatWin *chatwin = wins_get_chat(barejid); if (!chatwin) { ProfWin *window = wins_new_chat(barejid); chatwin = (ProfChatWin*)window; new_win = TRUE; } // OTR suported, PGP supported #ifdef HAVE_LIBOTR #ifdef HAVE_LIBGPGME prof_enc_t enc_mode = chatwin->enc_mode; if (enc_message) { if (enc_mode == PROF_ENC_OTR) { win_println((ProfWin*)chatwin, "PGP encrypted message received whilst in OTR session."); } else { // PROF_ENC_NONE, PROF_ENC_PGP char *decrypted = p_gpg_decrypt(barejid, enc_message); if (decrypted) { if (enc_mode == PROF_ENC_NONE) { win_println((ProfWin*)chatwin, "PGP encryption enabled."); } ui_incoming_msg(chatwin, resource, decrypted, NULL, new_win); chat_log_pgp_msg_in(barejid, decrypted); chatwin->enc_mode = PROF_ENC_PGP; } else { ui_incoming_msg(chatwin, resource, message, NULL, new_win); chat_log_msg_in(barejid, message); chatwin->enc_mode = PROF_ENC_NONE; } } } else { if (enc_mode == PROF_ENC_PGP) { win_println((ProfWin*)chatwin, "PGP encryption disabled."); ui_incoming_msg(chatwin, resource, message, NULL, new_win); chat_log_msg_in(barejid, message); chatwin->enc_mode = PROF_ENC_NONE; } else { gboolean decrypted = FALSE; char *otr_res = otr_on_message_recv(barejid, resource, message, &decrypted); if (otr_res) { ui_incoming_msg(chatwin, resource, otr_res, NULL, new_win); chat_log_otr_msg_in(barejid, otr_res, decrypted); otr_free_message(otr_res); } } } return; #endif #endif // OTR supported, PGP unsupported #ifdef HAVE_LIBOTR #ifndef HAVE_LIBGPGME gboolean decrypted = FALSE; char *otr_res = otr_on_message_recv(barejid, resource, message, &decrypted); if (otr_res) { ui_incoming_msg(chatwin, resource, otr_res, NULL, new_win); chat_log_otr_msg_in(barejid, otr_res, decrypted); otr_free_message(otr_res); } return; #endif #endif // OTR unsupported, PGP supported #ifndef HAVE_LIBOTR #ifdef HAVE_LIBGPGME if (enc_message) { char *decrypted = p_gpg_decrypt(barejid, enc_message); if (decrypted) { ui_incoming_msg(chatwin, resource, decrypted, NULL, new_win); chat_log_pgp_msg_in(barejid, decrypted); chatwin->enc_mode = PROF_ENC_PGP; } else { ui_incoming_msg(chatwin, resource, message, NULL, new_win); chat_log_msg_in(barejid, message); chatwin->enc_mode = PROF_ENC_NONE; } } else { ui_incoming_msg(chatwin, resource, message, NULL, new_win); chat_log_msg_in(barejid, message); chatwin->enc_mode = PROF_ENC_NONE; } return; #endif #endif // OTR unsupported, PGP unsupported #ifndef HAVE_LIBOTR #ifndef HAVE_LIBGPGME ui_incoming_msg(chatwin, resource, message, NULL, new_win); chat_log_msg_in(barejid, message); chatwin->enc_mode = PROF_ENC_NONE; return; #endif #endif }
void otrlib_handle_tlvs(OtrlUserState user_state, OtrlMessageAppOps *ops, ConnContext *context, OtrlTLV *tlvs, GHashTable *smp_initiators) { NextExpectedSMP nextMsg = context->smstate->nextExpected; OtrlTLV *tlv = otrl_tlv_find(tlvs, OTRL_TLV_SMP1); if (tlv) { if (nextMsg != OTRL_SMP_EXPECT1) { otrl_message_abort_smp(user_state, ops, NULL, context); } else { ProfChatWin *chatwin = wins_get_chat(context->username); if (chatwin) { chatwin_otr_smp_event(chatwin, PROF_OTR_SMP_INIT, NULL); } g_hash_table_insert(smp_initiators, strdup(context->username), strdup(context->username)); } } tlv = otrl_tlv_find(tlvs, OTRL_TLV_SMP1Q); if (tlv) { if (nextMsg != OTRL_SMP_EXPECT1) { otrl_message_abort_smp(user_state, ops, NULL, context); } else { ProfChatWin *chatwin = wins_get_chat(context->username); if (chatwin) { char *question = (char *)tlv->data; char *eoq = memchr(question, '\0', tlv->len); if (eoq) { chatwin_otr_smp_event(chatwin, PROF_OTR_SMP_INIT_Q, question); } } } } tlv = otrl_tlv_find(tlvs, OTRL_TLV_SMP2); if (tlv) { if (nextMsg != OTRL_SMP_EXPECT2) { otrl_message_abort_smp(user_state, ops, NULL, context); } else { context->smstate->nextExpected = OTRL_SMP_EXPECT4; } } tlv = otrl_tlv_find(tlvs, OTRL_TLV_SMP3); if (tlv) { if (nextMsg != OTRL_SMP_EXPECT3) { otrl_message_abort_smp(user_state, ops, NULL, context); } else { context->smstate->nextExpected = OTRL_SMP_EXPECT1; ProfChatWin *chatwin = wins_get_chat(context->username); if (chatwin) { if (context->smstate->received_question == 0) { if (context->active_fingerprint->trust && (context->active_fingerprint->trust[0] != '\0')) { chatwin_otr_smp_event(chatwin, PROF_OTR_SMP_SUCCESS, NULL); chatwin_otr_trust(chatwin); } else { chatwin_otr_smp_event(chatwin, PROF_OTR_SMP_SENDER_FAIL, NULL); chatwin_otr_untrust(chatwin); } } else { if (context->smstate->sm_prog_state == OTRL_SMP_PROG_SUCCEEDED) { chatwin_otr_smp_event(chatwin, PROF_OTR_SMP_SUCCESS_Q, NULL); } else { chatwin_otr_smp_event(chatwin, PROF_OTR_SMP_FAIL_Q, NULL); } } } } } tlv = otrl_tlv_find(tlvs, OTRL_TLV_SMP4); if (tlv) { if (nextMsg != OTRL_SMP_EXPECT4) { otrl_message_abort_smp(user_state, ops, NULL, context); } else { context->smstate->nextExpected = OTRL_SMP_EXPECT1; ProfChatWin *chatwin = wins_get_chat(context->username); if (chatwin) { if (context->active_fingerprint->trust && (context->active_fingerprint->trust[0] != '\0')) { chatwin_otr_smp_event(chatwin, PROF_OTR_SMP_SUCCESS, NULL); chatwin_otr_trust(chatwin); } else { chatwin_otr_smp_event(chatwin, PROF_OTR_SMP_RECEIVER_FAIL, NULL); chatwin_otr_untrust(chatwin); } } } } tlv = otrl_tlv_find(tlvs, OTRL_TLV_SMP_ABORT); if (tlv) { context->smstate->nextExpected = OTRL_SMP_EXPECT1; ProfChatWin *chatwin = wins_get_chat(context->username); if (chatwin) { chatwin_otr_smp_event(chatwin, PROF_OTR_SMP_ABORT, NULL); chatwin_otr_untrust(chatwin); } otr_untrust(context->username); } }