about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorPaul Fariello <paul@fariello.eu>2019-03-13 19:43:07 +0140
committerPaul Fariello <paul@fariello.eu>2019-04-10 17:12:31 +0200
commit2622c2d21a1f120cb39800b8c96b6e5ce916589b (patch)
treee2befec30997a130f8cc354fb813c0aecaca3ebc
parent36ce21fc6d8104ef2145afbe3056747e49032ca4 (diff)
downloadprofani-tty-2622c2d21a1f120cb39800b8c96b6e5ce916589b.tar.gz
Add OMEMO untrust command
-rw-r--r--src/command/cmd_ac.c1
-rw-r--r--src/command/cmd_defs.c4
-rw-r--r--src/command/cmd_funcs.c52
-rw-r--r--src/command/cmd_funcs.h1
-rw-r--r--src/omemo/omemo.c22
-rw-r--r--src/omemo/omemo.h1
6 files changed, 80 insertions, 1 deletions
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);