diff --git a/src/event/server_events.c b/src/event/server_events.c index cf25773d..76351605 100644 --- a/src/event/server_events.c +++ b/src/event/server_events.c @@ -587,6 +587,8 @@ _sv_ev_incoming_omemo(ProfChatWin* chatwin, gboolean new_win, ProfMessage* messa chat_log_omemo_msg_in(message); } chatwin->pgp_recv = FALSE; + + wins_omemo_trust_changed(chatwin->barejid); #endif } diff --git a/src/omemo/omemo.c b/src/omemo/omemo.c index 5cad23b1..74fc923c 100644 --- a/src/omemo/omemo.c +++ b/src/omemo/omemo.c @@ -143,6 +143,8 @@ omemo_init(void) pthread_mutex_init(&omemo_static_data.lock, &omemo_static_data.attr); omemo_static_data.fingerprint_ac = g_hash_table_new_full(g_str_hash, g_str_equal, free, (GDestroyNotify)autocomplete_free); + + wins_omemo_trust_changed(NULL); } static gboolean @@ -270,6 +272,8 @@ omemo_on_connect(ProfAccount* account) } _omemo_finalize_identity_load(account); + + wins_omemo_trust_changed(NULL); } void @@ -294,6 +298,8 @@ omemo_on_disconnect(void) signal_protocol_store_context_destroy(omemo_ctx.store); signal_context_destroy(omemo_ctx.signal); memset(&omemo_ctx, 0, sizeof(omemo_ctx)); + + wins_omemo_trust_changed(NULL); } void @@ -560,6 +566,8 @@ omemo_set_device_list(const char* const from, GList* device_list) } } } + + wins_omemo_trust_changed(jid->barejid); } GKeyFile* @@ -1224,6 +1232,8 @@ omemo_trust(const char* const jid, const char* const fingerprint_formatted) signal_buffer_free(buffer); omemo_bundle_request(jid, device_id, omemo_start_device_session_handle_bundle, free, strdup(jid)); + + wins_omemo_trust_changed(jid); } void @@ -1279,6 +1289,8 @@ omemo_untrust(const char* const jid, const char* const fingerprint_formatted) auto_gchar gchar* device_id_str = g_strdup_printf("%d", device_id); g_key_file_remove_key(omemo_ctx.trust.keyfile, jid, device_id_str, NULL); omemo_trust_keyfile_save(); + + wins_omemo_trust_changed(jid); } static void @@ -1652,6 +1664,8 @@ _cache_device_identity(const char* const jid, uint32_t device_id, ec_public_key* autocomplete_add(ac, formatted_fingerprint); free(formatted_fingerprint); free(fingerprint); + + wins_omemo_trust_changed(jid); } static void diff --git a/src/ui/titlebar.c b/src/ui/titlebar.c index bed87b4a..783ad5ec 100644 --- a/src/ui/titlebar.c +++ b/src/ui/titlebar.c @@ -451,6 +451,32 @@ _show_muc_privacy(ProfMucWin* mucwin) wprintw(win, "]"); wattroff(win, bracket_attrs); +#ifdef HAVE_OMEMO + if (mucwin->omemo_trusted) { + wprintw(win, " "); + wattron(win, bracket_attrs); + wprintw(win, "["); + wattroff(win, bracket_attrs); + wattron(win, trusted_attrs); + wprintw(win, "trusted"); + wattroff(win, trusted_attrs); + wattron(win, bracket_attrs); + wprintw(win, "]"); + wattroff(win, bracket_attrs); + } else { + wprintw(win, " "); + wattron(win, bracket_attrs); + wprintw(win, "["); + wattroff(win, bracket_attrs); + wattron(win, untrusted_attrs); + wprintw(win, "untrusted"); + wattroff(win, untrusted_attrs); + wattron(win, bracket_attrs); + wprintw(win, "]"); + wattroff(win, bracket_attrs); + } +#endif + return; } @@ -580,6 +606,32 @@ _show_privacy(ProfChatWin* chatwin) wprintw(win, "]"); wattroff(win, bracket_attrs); +#ifdef HAVE_OMEMO + if (chatwin->omemo_trusted) { + wprintw(win, " "); + wattron(win, bracket_attrs); + wprintw(win, "["); + wattroff(win, bracket_attrs); + wattron(win, trusted_attrs); + wprintw(win, "trusted"); + wattroff(win, trusted_attrs); + wattron(win, bracket_attrs); + wprintw(win, "]"); + wattroff(win, bracket_attrs); + } else { + wprintw(win, " "); + wattron(win, bracket_attrs); + wprintw(win, "["); + wattroff(win, bracket_attrs); + wattron(win, untrusted_attrs); + wprintw(win, "untrusted"); + wattroff(win, untrusted_attrs); + wattron(win, bracket_attrs); + wprintw(win, "]"); + wattroff(win, bracket_attrs); + } +#endif + return; } diff --git a/src/ui/win_types.h b/src/ui/win_types.h index 360732eb..38387f80 100644 --- a/src/ui/win_types.h +++ b/src/ui/win_types.h @@ -178,6 +178,7 @@ typedef struct prof_chat_win_t gboolean pgp_send; gboolean pgp_recv; gboolean is_omemo; + gboolean omemo_trusted; gboolean is_ox; // XEP-0373: OpenPGP for XMPP char* resource_override; gboolean history_shown; @@ -203,6 +204,7 @@ typedef struct prof_muc_win_t gboolean showjid; gboolean showoffline; gboolean is_omemo; + gboolean omemo_trusted; unsigned long memcheck; char* enctext; char* message_char; diff --git a/src/ui/window.c b/src/ui/window.c index 33fcac33..9b310b5f 100644 --- a/src/ui/window.c +++ b/src/ui/window.c @@ -37,6 +37,9 @@ #include "config.h" #include "database.h" #include "ui/window_list.h" +#ifdef HAVE_OMEMO +#include "omemo/omemo.h" +#endif #include #include @@ -170,6 +173,9 @@ win_create_chat(const char* const barejid) new_win->pgp_recv = FALSE; new_win->pgp_send = FALSE; new_win->is_omemo = FALSE; +#ifdef HAVE_OMEMO + new_win->omemo_trusted = omemo_is_jid_trusted(barejid); +#endif new_win->is_ox = FALSE; new_win->history_shown = FALSE; new_win->unread = 0; @@ -236,6 +242,9 @@ win_create_muc(const char* const roomjid) new_win->enctext = NULL; new_win->message_char = NULL; new_win->is_omemo = FALSE; +#ifdef HAVE_OMEMO + new_win->omemo_trusted = omemo_is_jid_trusted(roomjid); +#endif new_win->last_message = NULL; new_win->last_msg_id = NULL; new_win->has_attention = FALSE; diff --git a/src/ui/window_list.c b/src/ui/window_list.c index 889344b6..3f0f7e54 100644 --- a/src/ui/window_list.c +++ b/src/ui/window_list.c @@ -1017,6 +1017,31 @@ _wins_get_next_available_num(GList* used) } } +void +wins_omemo_trust_changed(const char* const jid) +{ + GList* curr = values; + while (curr) { + ProfWin* window = curr->data; + if (window->type == WIN_CHAT) { + ProfChatWin* chatwin = (ProfChatWin*)window; + if (jid == NULL || strcmp(chatwin->barejid, jid) == 0) { +#ifdef HAVE_OMEMO + chatwin->omemo_trusted = omemo_is_jid_trusted(chatwin->barejid); +#endif + } + } else if (window->type == WIN_MUC) { + ProfMucWin* mucwin = (ProfMucWin*)window; + if (jid == NULL || strcmp(mucwin->roomjid, jid) == 0) { +#ifdef HAVE_OMEMO + mucwin->omemo_trusted = omemo_is_jid_trusted(mucwin->roomjid); +#endif + } + } + curr = g_list_next(curr); + } +} + gboolean wins_tidy(void) { diff --git a/src/ui/window_list.h b/src/ui/window_list.h index d9d11c58..ea5fce04 100644 --- a/src/ui/window_list.h +++ b/src/ui/window_list.h @@ -88,6 +88,7 @@ GSList* wins_get_chat_recipients(void); GSList* wins_get_prune_wins(void); void wins_lost_connection(void); void wins_reestablished_connection(void); +void wins_omemo_trust_changed(const char* const jid); gboolean wins_tidy(void); GSList* wins_create_summary(gboolean unread); GSList* wins_create_summary_attention();