From 1eaa2c15291cde4eb8b7656db46aa096b50d9af9 Mon Sep 17 00:00:00 2001 From: Michael Vetter Date: Wed, 4 May 2022 14:26:26 +0200 Subject: [PATCH 1/5] ox: prefix function _openpgp_signcrypt with ox_ To make the destinction clearer and easier to search. --- src/xmpp/message.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/xmpp/message.c b/src/xmpp/message.c index fb58285e..70b40e25 100644 --- a/src/xmpp/message.c +++ b/src/xmpp/message.c @@ -91,7 +91,7 @@ static gboolean _handle_jingle_message(xmpp_stanza_t* const stanza); static gboolean _should_ignore_based_on_silence(xmpp_stanza_t* const stanza); #ifdef HAVE_LIBGPGME -static xmpp_stanza_t* _openpgp_signcrypt(xmpp_ctx_t* ctx, const char* const to, const char* const text); +static xmpp_stanza_t* _ox_openpgp_signcrypt(xmpp_ctx_t* ctx, const char* const to, const char* const text); #endif // HAVE_LIBGPGME static GHashTable* pubsub_event_handlers; @@ -540,7 +540,7 @@ message_send_chat_ox(const char* const barejid, const char* const msg, gboolean xmpp_stanza_set_name(openpgp, STANZA_NAME_OPENPGP); xmpp_stanza_set_ns(openpgp, STANZA_NS_OPENPGP_0); - xmpp_stanza_t* signcrypt = _openpgp_signcrypt(ctx, barejid, msg); + xmpp_stanza_t* signcrypt = _ox_openpgp_signcrypt(ctx, barejid, msg); char* c; size_t s; xmpp_stanza_to_text(signcrypt, &c, &s); @@ -1610,7 +1610,7 @@ message_is_sent_by_us(const ProfMessage* const message, bool checkOID) #ifdef HAVE_LIBGPGME static xmpp_stanza_t* -_openpgp_signcrypt(xmpp_ctx_t* ctx, const char* const to, const char* const text) +_ox_openpgp_signcrypt(xmpp_ctx_t* ctx, const char* const to, const char* const text) { time_t now = time(NULL); struct tm* tm = localtime(&now); From 66eeccf4089de61d2cb029f057d1d58bdbb6ab73 Mon Sep 17 00:00:00 2001 From: Michael Vetter Date: Wed, 4 May 2022 16:01:03 +0200 Subject: [PATCH 2/5] ox: only process proper messages We only want to have the decrypted message or the alternative body in message->plain. Also let's print error messages if it makes sense and log other issues. Partly addresses the commit in the comit mesage of: 2dc0cc489c872941e18a622c091f74bf5b0b043f --- src/xmpp/message.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/xmpp/message.c b/src/xmpp/message.c index 70b40e25..115bf3da 100644 --- a/src/xmpp/message.c +++ b/src/xmpp/message.c @@ -1467,14 +1467,13 @@ _handle_ox_chat(xmpp_stanza_t* const stanza, ProfMessage* message, gboolean is_m #ifdef HAVE_LIBGPGME xmpp_stanza_t* ox = xmpp_stanza_get_child_by_name_and_ns(stanza, "openpgp", STANZA_NS_OPENPGP_0); if (ox) { - message->plain = p_ox_gpg_decrypt(xmpp_stanza_get_text(ox)); - if (message->plain) { - xmpp_stanza_t* x = xmpp_stanza_new_from_string(connection_get_ctx(), message->plain); - if (x) { - xmpp_stanza_t* p = xmpp_stanza_get_child_by_name(x, "payload"); + gchar* decrypted = p_ox_gpg_decrypt(xmpp_stanza_get_text(ox)); + if (decrypted) { + xmpp_stanza_t* decrypted_stanza = xmpp_stanza_new_from_string(connection_get_ctx(), decrypted); + if (decrypted_stanza) { + xmpp_stanza_t* p = xmpp_stanza_get_child_by_name(decrypted_stanza, "payload"); if (!p) { log_warning("OX Stanza - no Payload"); - message->plain = "OX error: No payload found"; return; } xmpp_stanza_t* b = xmpp_stanza_get_child_by_name(p, "body"); @@ -1484,18 +1483,18 @@ _handle_ox_chat(xmpp_stanza_t* const stanza, ProfMessage* message, gboolean is_m } message->plain = xmpp_stanza_get_text(b); message->encrypted = xmpp_stanza_get_text(ox); - if (message->plain == NULL) { - message->plain = xmpp_stanza_get_text(stanza); - } } else { - message->plain = "Unable to decrypt OX message (XEP-0373: OpenPGP for XMPP)"; + cons_show("Unable to decrypt OX message (XEP-0373: OpenPGP for XMPP)"); log_warning("OX Stanza text to stanza failed"); } } else { - message->plain = "Unable to decrypt OX message (XEP-0373: OpenPGP for XMPP)"; + // get alternative text from message body + xmpp_stanza_t* b = xmpp_stanza_get_child_by_name(stanza, "body"); + if (b) { + message->plain = xmpp_stanza_get_text(b); + } } } else { - message->plain = "OX stanza without openpgp name"; log_warning("OX Stanza without openpgp stanza"); } #endif // HAVE_LIBGPGME From d011d6707c59b39dec9e83611592ee9c4b0b5a4d Mon Sep 17 00:00:00 2001 From: Michael Vetter Date: Thu, 5 May 2022 23:41:45 +0200 Subject: [PATCH 3/5] ox: Add /ox log command --- src/command/cmd_ac.c | 6 ++++++ src/command/cmd_defs.c | 3 ++- src/command/cmd_funcs.c | 25 +++++++++++++++++++++++++ src/command/cmd_funcs.h | 1 + src/config/preferences.c | 6 ++++++ src/config/preferences.h | 1 + 6 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/command/cmd_ac.c b/src/command/cmd_ac.c index 1a29c9cc..508c6f21 100644 --- a/src/command/cmd_ac.c +++ b/src/command/cmd_ac.c @@ -893,6 +893,11 @@ cmd_ac_init(void) autocomplete_add(ox_ac, "announce"); autocomplete_add(ox_ac, "discover"); autocomplete_add(ox_ac, "request"); + + ox_log_ac = autocomplete_new(); + autocomplete_add(ox_log_ac, "on"); + autocomplete_add(ox_log_ac, "off"); + autocomplete_add(ox_log_ac, "redact"); #endif tls_ac = autocomplete_new(); @@ -1443,6 +1448,7 @@ cmd_ac_reset(ProfWin* window) autocomplete_reset(pgp_log_ac); autocomplete_reset(pgp_sendfile_ac); autocomplete_reset(ox_ac); + autocomplete_reset(ox_log_ac); #endif autocomplete_reset(tls_ac); autocomplete_reset(titlebar_ac); diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c index b816ddcc..f2cc1513 100644 --- a/src/command/cmd_defs.c +++ b/src/command/cmd_defs.c @@ -1715,7 +1715,8 @@ static struct cmd_t command_defs[] = { #ifdef HAVE_LIBGPGME { "/ox", parse_args, 1, 3, NULL, - CMD_NOSUBFUNCS + CMD_SUBFUNCS( + { "log", cmd_ox_log }) CMD_MAINFUNC(cmd_ox) CMD_TAGS( CMD_TAG_CHAT, diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index f1fa37f1..9d6441b1 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -7725,6 +7725,31 @@ cmd_ox(ProfWin* window, const char* const command, gchar** args) } return TRUE; } + +gboolean +cmd_ox_log(ProfWin* window, const char* const command, gchar** args) +{ + char* choice = args[1]; + if (g_strcmp0(choice, "on") == 0) { + prefs_set_string(PREF_OX_LOG, "on"); + cons_show("OX messages will be logged as plaintext."); + if (!prefs_get_boolean(PREF_CHLOG)) { + cons_show("Chat logging is currently disabled, use '/logging chat on' to enable."); + } + } else if (g_strcmp0(choice, "off") == 0) { + prefs_set_string(PREF_OX_LOG, "off"); + cons_show("OX message logging disabled."); + } else if (g_strcmp0(choice, "redact") == 0) { + prefs_set_string(PREF_OX_LOG, "redact"); + cons_show("OX messages will be logged as '[redacted]'."); + if (!prefs_get_boolean(PREF_CHLOG)) { + cons_show("Chat logging is currently disabled, use '/logging chat on' to enable."); + } + } else { + cons_bad_cmd_usage(command); + } + return TRUE; +} #endif // HAVE_LIBGPGME gboolean diff --git a/src/command/cmd_funcs.h b/src/command/cmd_funcs.h index 41074720..d0a6a543 100644 --- a/src/command/cmd_funcs.h +++ b/src/command/cmd_funcs.h @@ -110,6 +110,7 @@ gboolean cmd_notify(ProfWin* window, const char* const command, gchar** args); gboolean cmd_pgp(ProfWin* window, const char* const command, gchar** args); #ifdef HAVE_LIBGPGME gboolean cmd_ox(ProfWin* window, const char* const command, gchar** args); +gboolean cmd_ox_log(ProfWin* window, const char* const command, gchar** args); #endif // HAVE_LIBGPGME gboolean cmd_outtype(ProfWin* window, const char* const command, gchar** args); gboolean cmd_prefs(ProfWin* window, const char* const command, gchar** args); diff --git a/src/config/preferences.c b/src/config/preferences.c index 62b75051..47be88fd 100644 --- a/src/config/preferences.c +++ b/src/config/preferences.c @@ -1882,6 +1882,8 @@ _get_group(preference_t pref) case PREF_OMEMO_POLICY: case PREF_OMEMO_TRUST_MODE: return PREF_GROUP_OMEMO; + case PREF_OX_LOG: + return PREF_GROUP_OX; default: return NULL; } @@ -2153,6 +2155,8 @@ _get_key(preference_t pref) return "stamp.outgoing"; case PREF_INCOMING_STAMP: return "stamp.incoming"; + case PREF_OX_LOG: + return "log"; default: return NULL; } @@ -2297,6 +2301,8 @@ _get_default_string(preference_t pref) return NULL; case PREF_URL_SAVE_CMD: return NULL; // Default to built-in method. + case PREF_OX_LOG: + return "redact"; default: return NULL; } diff --git a/src/config/preferences.h b/src/config/preferences.h index 46f2669a..5fef498d 100644 --- a/src/config/preferences.h +++ b/src/config/preferences.h @@ -179,6 +179,7 @@ typedef enum { PREF_OUTGOING_STAMP, PREF_INCOMING_STAMP, PREF_NOTIFY_ROOM_OFFLINE, + PREF_OX_LOG, } preference_t; typedef struct prof_alias_t From b16bdca726970a721301c88b588dd7263a8655e3 Mon Sep 17 00:00:00 2001 From: Michael Vetter Date: Thu, 5 May 2022 23:48:43 +0200 Subject: [PATCH 4/5] ox: show ox preferences --- src/command/cmd_ac.c | 1 + src/command/cmd_funcs.c | 4 ++++ src/ui/console.c | 25 +++++++++++++++++++++++++ src/ui/ui.h | 1 + tests/unittests/ui/stub_ui.c | 4 ++++ 5 files changed, 35 insertions(+) diff --git a/src/command/cmd_ac.c b/src/command/cmd_ac.c index 508c6f21..99072d8d 100644 --- a/src/command/cmd_ac.c +++ b/src/command/cmd_ac.c @@ -317,6 +317,7 @@ cmd_ac_init(void) #endif #ifdef HAVE_LIBGPGME autocomplete_add(prefs_ac, "pgp"); + autocomplete_add(prefs_ac, "ox"); #endif #ifdef HAVE_OMEMO autocomplete_add(prefs_ac, "omemo"); diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index 9d6441b1..f5f2bc90 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -1743,6 +1743,10 @@ cmd_prefs(ProfWin* window, const char* const command, gchar** args) cons_show(""); cons_show_omemo_prefs(); cons_show(""); + } else if (strcmp(args[0], "ox") == 0) { + cons_show(""); + cons_show_ox_prefs(); + cons_show(""); } else { cons_bad_cmd_usage(command); } diff --git a/src/ui/console.c b/src/ui/console.c index 08ccba17..fbbddba8 100644 --- a/src/ui/console.c +++ b/src/ui/console.c @@ -2314,6 +2314,29 @@ cons_show_omemo_prefs(void) cons_alert(NULL); } +void +cons_show_ox_prefs(void) +{ + cons_show("OX preferences:"); + cons_show(""); + + char* log_value = prefs_get_string(PREF_OX_LOG); + if (strcmp(log_value, "on") == 0) { + cons_show("OX logging (/ox log) : ON"); + } else if (strcmp(log_value, "off") == 0) { + cons_show("OX logging (/ox log) : OFF"); + } else { + cons_show("OX logging (/ox log) : Redacted"); + } + g_free(log_value); + + char* ch = prefs_get_ox_char(); + cons_show("OX char (/ox char) : %s", ch); + free(ch); + + cons_alert(NULL); +} + void cons_show_themes(GSList* themes) { @@ -2390,6 +2413,8 @@ cons_prefs(void) cons_show(""); cons_show_omemo_prefs(); cons_show(""); + cons_show_ox_prefs(); + cons_show(""); cons_alert(NULL); } diff --git a/src/ui/ui.h b/src/ui/ui.h index 6805b362..7deb2ca2 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -252,6 +252,7 @@ void cons_show_connection_prefs(void); void cons_show_otr_prefs(void); void cons_show_pgp_prefs(void); void cons_show_omemo_prefs(void); +void cons_show_ox_prefs(void); void cons_show_account(ProfAccount* account); void cons_debug(const char* const msg, ...); void cons_show_error(const char* const cmd, ...); diff --git a/tests/unittests/ui/stub_ui.c b/tests/unittests/ui/stub_ui.c index cbe61bdf..768e654b 100644 --- a/tests/unittests/ui/stub_ui.c +++ b/tests/unittests/ui/stub_ui.c @@ -790,6 +790,10 @@ void cons_show_omemo_prefs(void) { } +void +cons_show_ox_prefs(void) +{ +} void cons_show_account(ProfAccount* account) From 2e76e4f0c7cc574c5d07a9ddb709eee82848a641 Mon Sep 17 00:00:00 2001 From: Michael Vetter Date: Thu, 5 May 2022 23:50:03 +0200 Subject: [PATCH 5/5] ox: remove /ox sendfile because its actually not implemented --- src/command/cmd_ac.c | 8 -------- src/command/cmd_defs.c | 4 +--- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/src/command/cmd_ac.c b/src/command/cmd_ac.c index 99072d8d..89c2c931 100644 --- a/src/command/cmd_ac.c +++ b/src/command/cmd_ac.c @@ -234,7 +234,6 @@ static Autocomplete pgp_log_ac; static Autocomplete pgp_sendfile_ac; static Autocomplete ox_ac; static Autocomplete ox_log_ac; -static Autocomplete ox_sendfile_ac; #endif static Autocomplete tls_ac; static Autocomplete titlebar_ac; @@ -890,7 +889,6 @@ cmd_ac_init(void) autocomplete_add(ox_ac, "end"); autocomplete_add(ox_ac, "log"); autocomplete_add(ox_ac, "char"); - autocomplete_add(ox_ac, "sendfile"); autocomplete_add(ox_ac, "announce"); autocomplete_add(ox_ac, "discover"); autocomplete_add(ox_ac, "request"); @@ -1613,7 +1611,6 @@ cmd_ac_uninit(void) autocomplete_free(pgp_sendfile_ac); autocomplete_free(ox_ac); autocomplete_free(ox_log_ac); - autocomplete_free(ox_sendfile_ac); #endif autocomplete_free(tls_ac); autocomplete_free(titlebar_ac); @@ -2624,11 +2621,6 @@ _ox_autocomplete(ProfWin* window, const char* const input, gboolean previous) return found; } - found = autocomplete_param_with_ac(input, "/ox sendfile", ox_sendfile_ac, TRUE, previous); - if (found) { - return found; - } - if (strncmp(input, "/ox announce ", 13) == 0) { return cmd_ac_complete_filepath(input, "/ox announce", previous); } diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c index f2cc1513..8c8af70f 100644 --- a/src/command/cmd_defs.c +++ b/src/command/cmd_defs.c @@ -1728,7 +1728,6 @@ static struct cmd_t command_defs[] = { "/ox end", "/ox log on|off|redact", "/ox char ", - "/ox sendfile on|off", "/ox announce ", "/ox discover ", "/ox request ") @@ -1747,8 +1746,7 @@ static struct cmd_t command_defs[] = { { "char ", "Set the character to be displayed next to PGP encrypted messages." }, { "announce ", "Announce a public key by pushing it on the XMPP Server" }, { "discover ", "Discover public keys of a jid. The OpenPGP Key IDs will be displayed" }, - { "request ", "Request public key. See /ox discover to to get available key IDs." }, - { "sendfile on|off", "Allow /sendfile to send unencrypted files while otherwise using PGP." }) + { "request ", "Request public key. See /ox discover to to get available key IDs." }) CMD_EXAMPLES( "/ox log off", "/ox start odin@valhalla.edda",