From 2622c2d21a1f120cb39800b8c96b6e5ce916589b Mon Sep 17 00:00:00 2001 From: Paul Fariello Date: Wed, 13 Mar 2019 19:43:07 +0140 Subject: Add OMEMO untrust command --- src/command/cmd_ac.c | 1 + src/command/cmd_defs.c | 4 +++- src/command/cmd_funcs.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ src/command/cmd_funcs.h | 1 + src/omemo/omemo.c | 22 +++++++++++++++++++++ src/omemo/omemo.h | 1 + 6 files changed, 80 insertions(+), 1 deletion(-) diff --git a/src/command/cmd_ac.c b/src/command/cmd_ac.c index ce66d507..588c8b4f 100644 --- a/src/command/cmd_ac.c +++ b/src/command/cmd_ac.c @@ -580,6 +580,7 @@ cmd_ac_init(void) autocomplete_add(omemo_ac, "gen"); autocomplete_add(omemo_ac, "start"); autocomplete_add(omemo_ac, "trust"); + autocomplete_add(omemo_ac, "untrust"); autocomplete_add(omemo_ac, "fingerprint"); connect_property_ac = autocomplete_new(); diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c index 200a46d3..70e4595e 100644 --- a/src/command/cmd_defs.c +++ b/src/command/cmd_defs.c @@ -2336,6 +2336,7 @@ static struct cmd_t command_defs[] = { "gen", cmd_omemo_gen }, { "start", cmd_omemo_start }, { "trust", cmd_omemo_trust }, + { "untrust", cmd_omemo_untrust }, { "fingerprint", cmd_omemo_fingerprint }) CMD_NOMAINFUNC CMD_TAGS( @@ -2355,7 +2356,8 @@ static struct cmd_t command_defs[] = CMD_EXAMPLES( "/omemo gen", "/omemo start buddy@buddychat.org", - "/omemo trust c4f9c875-144d7a3b-0c4a05b6-ca3be51a-a037f329-0bd3ae62-07f99719-55559d2a") + "/omemo trust c4f9c875-144d7a3b-0c4a05b6-ca3be51a-a037f329-0bd3ae62-07f99719-55559d2a", + "/omemo untrust c4f9c875-144d7a3b-0c4a05b6-ca3be51a-a037f329-0bd3ae62-07f99719-55559d2a") }, }; diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index ba55243c..572c0b96 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -8065,3 +8065,55 @@ cmd_omemo_trust(ProfWin *window, const char *const command, gchar **args) return TRUE; #endif } + +gboolean +cmd_omemo_untrust(ProfWin *window, const char *const command, gchar **args) +{ +#ifdef HAVE_OMEMO + if (connection_get_status() != JABBER_CONNECTED) { + cons_show("You must be connected with an account to load OMEMO information."); + return TRUE; + } + + if (!args[1]) { + cons_bad_cmd_usage(command); + return TRUE; + } + + if (!omemo_loaded()) { + win_println(window, THEME_DEFAULT, '!', "You have not generated or loaded a cryptographic materials, use '/omemo gen'"); + return TRUE; + } + + char *fingerprint; + char *barejid; + + /* Contact not provided */ + if (!args[2]) { + fingerprint = args[1]; + + if (window->type != WIN_CHAT) { + win_println(window, THEME_DEFAULT, '-', "You must be in a regular chat window to trust a device without providing the contact."); + return TRUE; + } + + ProfChatWin *chatwin = (ProfChatWin*)window; + assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK); + barejid = chatwin->barejid; + } else { + fingerprint = args[2]; + char *contact = args[1]; + barejid = roster_barejid_from_name(contact); + if (barejid == NULL) { + barejid = contact; + } + } + + omemo_untrust(barejid, fingerprint); + + return TRUE; +#else + cons_show("This version of Profanity has not been built with OMEMO support enabled"); + return TRUE; +#endif +} diff --git a/src/command/cmd_funcs.h b/src/command/cmd_funcs.h index 8a11881b..efa8cd83 100644 --- a/src/command/cmd_funcs.h +++ b/src/command/cmd_funcs.h @@ -218,5 +218,6 @@ gboolean cmd_omemo_gen(ProfWin *window, const char *const command, gchar **args) gboolean cmd_omemo_start(ProfWin *window, const char *const command, gchar **args); gboolean cmd_omemo_fingerprint(ProfWin *window, const char *const command, gchar **args); gboolean cmd_omemo_trust(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_omemo_untrust(ProfWin *window, const char *const command, gchar **args); #endif diff --git a/src/omemo/omemo.c b/src/omemo/omemo.c index b45e1834..fceb0363 100644 --- a/src/omemo/omemo.c +++ b/src/omemo/omemo.c @@ -857,6 +857,28 @@ omemo_trust(const char *const jid, const char *const fingerprint_formatted) omemo_bundle_request(jid, device_id, omemo_start_device_session_handle_bundle, free, strdup(jid)); } +void +omemo_untrust(const char *const jid, const char *const fingerprint_formatted) +{ + size_t len; + unsigned char *fingerprint = omemo_fingerprint_decode(fingerprint_formatted, &len); + + GHashTableIter iter; + gpointer key, value; + + g_hash_table_iter_init(&iter, omemo_ctx.identity_key_store.trusted); + while (g_hash_table_iter_next(&iter, &key, &value)) { + signal_buffer *buffer = value; + unsigned char *original = signal_buffer_data(buffer); + /* Skip DJB_TYPE byte */ + original++; + if ((signal_buffer_len(buffer) - 1) == len && memcmp(original, fingerprint, len) == 0) { + g_hash_table_remove(omemo_ctx.identity_key_store.trusted, key); + } + } + free(fingerprint); +} + static void lock(void *user_data) { diff --git a/src/omemo/omemo.h b/src/omemo/omemo.h index 5be0e0cd..7f9b7992 100644 --- a/src/omemo/omemo.h +++ b/src/omemo/omemo.h @@ -33,6 +33,7 @@ void omemo_sessions_keyfile_save(void); char *omemo_format_fingerprint(const char *const fingerprint); char *omemo_own_fingerprint(gboolean formatted); void omemo_trust(const char *const jid, const char *const fingerprint); +void omemo_untrust(const char *const jid, const char *const fingerprint); void omemo_start_session(const char *const barejid); void omemo_start_device_session(const char *const jid, uint32_t device_id, GList *prekeys, uint32_t signed_prekey_id, const unsigned char *const signed_prekey, size_t signed_prekey_len, const unsigned char *const signature, size_t signature_len, const unsigned char *const identity_key, size_t identity_key_len); -- cgit 1.4.1-2-gfad0