예제 #1
0
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
}
예제 #2
0
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
}
예제 #3
0
파일: api.c 프로젝트: anossov/profanity
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;
}
예제 #4
0
파일: api.c 프로젝트: anossov/profanity
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;
}
예제 #5
0
파일: api.c 프로젝트: anossov/profanity
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
}
예제 #6
0
파일: otr.c 프로젝트: BlueMonday/profanity
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);
        }
    }
}
예제 #7
0
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
}
예제 #8
0
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);
}
예제 #9
0
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);
}
예제 #10
0
파일: otr.c 프로젝트: BlueMonday/profanity
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));
}
예제 #11
0
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);
    }
}
예제 #12
0
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);
}
예제 #13
0
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);
}
예제 #14
0
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);
}
예제 #15
0
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);
    }
}
예제 #16
0
파일: otr.c 프로젝트: BlueMonday/profanity
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);
    }
}
예제 #17
0
파일: api.c 프로젝트: anossov/profanity
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;
}
예제 #18
0
파일: otr.c 프로젝트: BlueMonday/profanity
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);
    }
}
예제 #19
0
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);
        }
    }
}
예제 #20
0
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);
}
예제 #21
0
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);
        }
    }
}
예제 #22
0
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);
}
예제 #23
0
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);
    }
}
예제 #24
0
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();
}
예제 #25
0
파일: api.c 프로젝트: anossov/profanity
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;
}
예제 #26
0
파일: api.c 프로젝트: anossov/profanity
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;
}
예제 #27
0
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;
    }
}
예제 #28
0
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
}
예제 #29
0
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);
    }
}