From 678bff9169c81ed20c38698e132d7c8c6118763b Mon Sep 17 00:00:00 2001 From: Paul Fariello Date: Mon, 25 Mar 2019 19:07:36 +0140 Subject: [PATCH] Add fingerprint autocompletion --- src/command/cmd_ac.c | 26 ++++++++++++++++++++++++++ src/omemo/omemo.c | 22 +++++++++++++++++++++- src/omemo/omemo.h | 2 ++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/command/cmd_ac.c b/src/command/cmd_ac.c index 9584543e..c700e51b 100644 --- a/src/command/cmd_ac.c +++ b/src/command/cmd_ac.c @@ -57,6 +57,10 @@ #include "pgp/gpg.h" #endif +#ifdef HAVE_OMEMO +#include "omemo/omemo.h" +#endif + static char* _sub_autocomplete(ProfWin *window, const char *const input, gboolean previous); static char* _notify_autocomplete(ProfWin *window, const char *const input, gboolean previous); static char* _theme_autocomplete(ProfWin *window, const char *const input, gboolean previous); @@ -999,6 +1003,9 @@ cmd_ac_reset(ProfWin *window) presence_reset_sub_request_search(); #ifdef HAVE_LIBGPGME p_gpg_autocomplete_key_reset(); +#endif +#ifdef HAVE_OMEMO + omemo_fingerprint_autocomplete_reset(); #endif autocomplete_reset(help_ac); autocomplete_reset(help_commands_ac); @@ -2158,6 +2165,25 @@ _omemo_autocomplete(ProfWin *window, const char *const input, gboolean previous) return found; } +#ifdef HAVE_OMEMO + if (window->type == WIN_CHAT) { + found = autocomplete_param_with_func(input, "/omemo trust", omemo_fingerprint_autocomplete, previous); + if (found) { + return found; + } + } else { + found = autocomplete_param_with_func(input, "/omemo trust", roster_contact_autocomplete, previous); + if (found) { + return found; + } + + found = autocomplete_param_no_with_func(input, "/omemo trust", 4, omemo_fingerprint_autocomplete, previous); + if (found) { + return found; + } + } +#endif + found = autocomplete_param_with_ac(input, "/omemo log", omemo_log_ac, TRUE, previous); if (found) { return found; diff --git a/src/omemo/omemo.c b/src/omemo/omemo.c index 01eb6b67..1f48224e 100644 --- a/src/omemo/omemo.c +++ b/src/omemo/omemo.c @@ -63,6 +63,7 @@ struct omemo_context_t { GString *sessions_filename; GKeyFile *sessions_keyfile; GHashTable *known_devices; + Autocomplete fingerprint_ac; }; static omemo_context omemo_ctx; @@ -163,6 +164,8 @@ omemo_init(void) omemo_ctx.device_list = g_hash_table_new_full(g_str_hash, g_str_equal, free, (GDestroyNotify)g_list_free); omemo_ctx.device_list_handler = g_hash_table_new_full(g_str_hash, g_str_equal, free, NULL); omemo_ctx.known_devices = g_hash_table_new_full(g_str_hash, g_str_equal, free, (GDestroyNotify)g_hash_table_free); + + omemo_ctx.fingerprint_ac = autocomplete_new(); } void @@ -1114,6 +1117,18 @@ omemo_key_free(omemo_key_t *key) free(key); } +char* +omemo_fingerprint_autocomplete(const char *const search_str, gboolean previous) +{ + return autocomplete_complete(omemo_ctx.fingerprint_ac, search_str, FALSE, previous); +} + +void +omemo_fingerprint_autocomplete_reset(void) +{ + autocomplete_reset(omemo_ctx.fingerprint_ac); +} + static void load_identity(void) { @@ -1203,7 +1218,12 @@ cache_device_identity(const char *const jid, uint32_t device_id, ec_public_key * char *fingerprint = omemo_fingerprint(identity, FALSE); log_info("OMEMO: cache identity for %s:%d: %s", jid, device_id, fingerprint); - g_hash_table_insert(known_identities, fingerprint, GINT_TO_POINTER(device_id)); + g_hash_table_insert(known_identities, strdup(fingerprint), GINT_TO_POINTER(device_id)); + + char *formatted_fingerprint = omemo_format_fingerprint(fingerprint); + autocomplete_add(omemo_ctx.fingerprint_ac, formatted_fingerprint); + free(formatted_fingerprint); + free(fingerprint); } static void diff --git a/src/omemo/omemo.h b/src/omemo/omemo.h index ec48e183..bbd59b77 100644 --- a/src/omemo/omemo.h +++ b/src/omemo/omemo.h @@ -38,6 +38,8 @@ void omemo_trust(const char *const jid, const char *const fingerprint); void omemo_untrust(const char *const jid, const char *const fingerprint); GList *omemo_known_device_identities(const char *const jid); gboolean omemo_is_trusted_identity(const char *const jid, const char *const fingerprint); +char *omemo_fingerprint_autocomplete(const char *const search_str, gboolean previous); +void omemo_fingerprint_autocomplete_reset(void); void omemo_start_session(const char *const barejid); void omemo_start_muc_sessions(const char *const roomjid);