diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/command/cmd_defs.c | 5 | ||||
-rw-r--r-- | src/command/cmd_funcs.c | 18 | ||||
-rw-r--r-- | src/pgp/gpg.c | 23 | ||||
-rw-r--r-- | src/xmpp/message.c | 10 | ||||
-rw-r--r-- | src/xmpp/ox.c | 63 |
5 files changed, 83 insertions, 36 deletions
diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c index a9e45147..b816ddcc 100644 --- a/src/command/cmd_defs.c +++ b/src/command/cmd_defs.c @@ -1734,7 +1734,8 @@ static struct cmd_t command_defs[] = { CMD_DESC( "OpenPGP (OX) commands to manage keys, and perform OpenPGP encryption during chat sessions. " "Your OpenPGP key needs a user-id with your JID URI (xmpp:local@domain.tld). " - "A key can be generated with \"gpg --quick-gen-key xmpp:local@domain.tld future-default default 3y\".") + "A key can be generated with \"gpg --quick-gen-key xmpp:local@domain.tld future-default default 3y\". " + "See man profanity-ox-setup for details on how to set up OX the first time.") CMD_ARGS( { "keys", "List all keys known to the system." }, { "contacts", "Show contacts with assigned public keys." }, @@ -1745,7 +1746,7 @@ static struct cmd_t command_defs[] = { { "char <char>", "Set the character to be displayed next to PGP encrypted messages." }, { "announce <file>", "Announce a public key by pushing it on the XMPP Server" }, { "discover <jid>", "Discover public keys of a jid. The OpenPGP Key IDs will be displayed" }, - { "request <jid>", "Request public keys" }, + { "request <jid> <keyid>", "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." }) CMD_EXAMPLES( "/ox log off", diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index e76831fc..f1fa37f1 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -7650,7 +7650,7 @@ cmd_ox(ProfWin* window, const char* const command, gchar** args) } if (chatwin->is_ox) { - win_println(window, THEME_DEFAULT, "!", "You have already started OX encryption."); + win_println(window, THEME_DEFAULT, "!", "You have already started an OX encrypted session."); return TRUE; } @@ -7671,6 +7671,22 @@ cmd_ox(ProfWin* window, const char* const command, gchar** args) chatwin->is_ox = TRUE; win_println(window, THEME_DEFAULT, "!", "OX encryption enabled."); return TRUE; + } else if (g_strcmp0(args[0], "end") == 0) { + if (window->type != WIN_CHAT && args[1] == NULL) { + cons_show("You must be in a regular chat window to stop OX encryption."); + return TRUE; + } + + ProfChatWin* chatwin = (ProfChatWin*)window; + assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK); + + if (!chatwin->is_ox) { + win_println(window, THEME_DEFAULT, "!", "No OX session has been started."); + } else { + chatwin->is_ox = FALSE; + win_println(window, THEME_DEFAULT, "!", "OX encryption disabled."); + } + return TRUE; } else if (g_strcmp0(args[0], "announce") == 0) { if (args[1]) { gchar* filename = get_expanded_path(args[1]); diff --git a/src/pgp/gpg.c b/src/pgp/gpg.c index 99d37c64..7dc57d96 100644 --- a/src/pgp/gpg.c +++ b/src/pgp/gpg.c @@ -914,6 +914,7 @@ p_ox_gpg_signcrypt(const char* const sender_barejid, const char* const recipient // lookup own key recp[0] = _ox_key_lookup(sender_barejid, TRUE); if (error != 0) { + cons_show_error("Can't find OX key for %s", xmpp_jid_me); log_error("OX: Key not found for %s. Error: %s", xmpp_jid_me, gpgme_strerror(error)); return NULL; } @@ -927,13 +928,14 @@ p_ox_gpg_signcrypt(const char* const sender_barejid, const char* const recipient // lookup key of recipient recp[1] = _ox_key_lookup(recipient_barejid, FALSE); if (error != 0) { + cons_show_error("Can't find OX key for %s", xmpp_jid_recipient); log_error("OX: Key not found for %s. Error: %s", xmpp_jid_recipient, gpgme_strerror(error)); return NULL; } recp[2] = NULL; - log_debug("%s <%s>", recp[0]->uids->name, recp[0]->uids->email); - log_debug("%s <%s>", recp[1]->uids->name, recp[1]->uids->email); + log_debug("OX: %s <%s>", recp[0]->uids->name, recp[0]->uids->email); + log_debug("OX: %s <%s>", recp[1]->uids->name, recp[1]->uids->email); gpgme_encrypt_flags_t flags = 0; @@ -1110,9 +1112,22 @@ _ox_key_is_usable(gpgme_key_t key, const char* const barejid, gboolean secret) gboolean result = TRUE; if (key->revoked || key->expired || key->disabled) { + cons_show_error("%s's key is revoked, expired or disabled", barejid); + log_info("OX: %s's key is revoked, expired or disabled", barejid); result = FALSE; } + // This might be a nice features but AFAIK is not defined in the XEP. + // If we add this we need to expand our documentation on how to set the + // trust leven in gpg. I'll add an example to this commit body. + /* + if (key->owner_trust < GPGME_VALIDITY_MARGINAL) { + cons_show_error(" %s's key is has a trust level lower than marginal", barejid); + log_info("OX: Owner trust of %s's key is < GPGME_VALIDITY_MARGINAL", barejid); + result = FALSE; + } + */ + return result; } @@ -1180,11 +1195,13 @@ p_ox_gpg_decrypt(char* base64) return NULL; } } + size_t len; char* plain_str = gpgme_data_release_and_get_mem(plain, &len); char* result = malloc(len + 1); - strcpy(result, plain_str); + memcpy(result, plain_str, len); result[len] = '\0'; + gpgme_free(plain_str); return result; } diff --git a/src/xmpp/message.c b/src/xmpp/message.c index c18f9376..fb58285e 100644 --- a/src/xmpp/message.c +++ b/src/xmpp/message.c @@ -1616,11 +1616,13 @@ _openpgp_signcrypt(xmpp_ctx_t* ctx, const char* const to, const char* const text struct tm* tm = localtime(&now); char buf[255]; strftime(buf, sizeof(buf), "%FT%T%z", tm); - int randnr = rand() % 5; - char rpad_data[randnr]; - for (int i = 0; i < randnr - 1; i++) { - rpad_data[i] = 'c'; + // build rpad + int randnr = (rand() % 100) + 1; + char rpad_data[randnr]; + for (int i = 0; i < randnr; i++) { + int rchar = (rand() % 52) + 65; + rpad_data[i] = rchar; } rpad_data[randnr - 1] = '\0'; diff --git a/src/xmpp/ox.c b/src/xmpp/ox.c index 0fa5cece..fab3d675 100644 --- a/src/xmpp/ox.c +++ b/src/xmpp/ox.c @@ -42,6 +42,7 @@ #include "ui/ui.h" #include "xmpp/connection.h" #include "xmpp/stanza.h" +#include "xmpp/iq.h" #include "pgp/gpg.h" #ifdef HAVE_LIBGPGME @@ -49,19 +50,18 @@ #define KEYID_LENGTH 40 static void _ox_metadata_node__public_key(const char* const fingerprint); -static int _ox_metadata_result(xmpp_conn_t* const conn, xmpp_stanza_t* const stanza, void* const userdata); +static int _ox_metadata_result(xmpp_stanza_t* const stanza, void* const userdata); static void _ox_request_public_key(const char* const jid, const char* const fingerprint); -static int _ox_public_key_result(xmpp_conn_t* const conn, xmpp_stanza_t* const stanza, void* const userdata); +static int _ox_public_key_result(xmpp_stanza_t* const stanza, void* const userdata); -/*! - * \brief Current Date and Time. +/* Return Current Date and Time. * * XEP-0082: XMPP Date and Time Profiles * https://xmpp.org/extensions/xep-0082.html * - * \return YYYY-MM-DDThh:mm:ssZ - * + * According to ISO8601 + * YYYY-MM-DDThh:mm:ssZ */ static char* _gettimestamp(); @@ -106,7 +106,7 @@ ox_announce_public_key(const char* const filename) log_info("[OX] Announce OpenPGP Key for Fingerprint: %s", fp); xmpp_ctx_t* const ctx = connection_get_ctx(); - char* id = xmpp_uuid_gen(ctx); + char* id = connection_create_stanza_id(); xmpp_stanza_t* iq = xmpp_iq_new(ctx, STANZA_TYPE_SET, id); xmpp_stanza_set_from(iq, xmpp_conn_get_jid(connection_get_conn())); @@ -143,7 +143,15 @@ ox_announce_public_key(const char* const filename) xmpp_stanza_add_child(publish, item); xmpp_stanza_add_child(pubsub, publish); xmpp_stanza_add_child(iq, pubsub); - xmpp_send(connection_get_conn(), iq); + + if (connection_supports(XMPP_FEATURE_PUBSUB_PUBLISH_OPTIONS)) { + stanza_attach_publish_options(ctx, iq, "pubsub#access_model", "open"); + } else { + log_debug("[OX] Cannot publish public key: no PUBSUB feature announced"); + } + + iq_send_stanza(iq); + xmpp_stanza_release(iq); _ox_metadata_node__public_key(fp); @@ -174,7 +182,7 @@ ox_discover_public_key(const char* const jid) cons_show("Discovering Public Key for %s", jid); // iq xmpp_ctx_t* const ctx = connection_get_ctx(); - char* id = xmpp_uuid_gen(ctx); + char* id = connection_create_stanza_id(); xmpp_stanza_t* iq = xmpp_iq_new(ctx, STANZA_TYPE_GET, id); xmpp_stanza_set_from(iq, xmpp_conn_get_jid(connection_get_conn())); xmpp_stanza_set_to(iq, jid); @@ -190,8 +198,9 @@ ox_discover_public_key(const char* const jid) xmpp_stanza_add_child(pubsub, items); xmpp_stanza_add_child(iq, pubsub); - xmpp_id_handler_add(connection_get_conn(), _ox_metadata_result, id, strdup(jid)); - xmpp_send(connection_get_conn(), iq); + iq_id_handler_add(xmpp_stanza_get_id(iq), _ox_metadata_result, NULL, NULL); + iq_send_stanza(iq); + xmpp_stanza_release(iq); } @@ -236,7 +245,7 @@ _ox_metadata_node__public_key(const char* const fingerprint) assert(strlen(fingerprint) == KEYID_LENGTH); // iq xmpp_ctx_t* const ctx = connection_get_ctx(); - char* id = xmpp_uuid_gen(ctx); + char* id = connection_create_stanza_id(); xmpp_stanza_t* iq = xmpp_iq_new(ctx, STANZA_TYPE_SET, id); xmpp_stanza_set_from(iq, xmpp_conn_get_jid(connection_get_conn())); // pubsub @@ -258,18 +267,22 @@ _ox_metadata_node__public_key(const char* const fingerprint) xmpp_stanza_t* pubkeymetadata = xmpp_stanza_new(ctx); xmpp_stanza_set_name(pubkeymetadata, STANZA_NAME_PUBKEY_METADATA); xmpp_stanza_set_attribute(pubkeymetadata, STANZA_ATTR_V4_FINGERPRINT, fingerprint); - xmpp_stanza_set_attribute(pubkeymetadata, STANZA_ATTR_DATE, _gettimestamp()); + char* timestamp = _gettimestamp(); + xmpp_stanza_set_attribute(pubkeymetadata, STANZA_ATTR_DATE, timestamp); + free(timestamp); xmpp_stanza_add_child(publickeyslist, pubkeymetadata); xmpp_stanza_add_child(item, publickeyslist); xmpp_stanza_add_child(publish, item); xmpp_stanza_add_child(pubsub, publish); xmpp_stanza_add_child(iq, pubsub); - xmpp_send(connection_get_conn(), iq); + + iq_send_stanza(iq); + xmpp_stanza_release(iq); } static int -_ox_metadata_result(xmpp_conn_t* const conn, xmpp_stanza_t* const stanza, void* const userdata) +_ox_metadata_result(xmpp_stanza_t* const stanza, void* const userdata) { log_debug("[OX] Processing result %s's metadata.", (char*)userdata); @@ -349,7 +362,7 @@ _ox_request_public_key(const char* const jid, const char* const fingerprint) log_info("[OX] Request %s's public key %s.", jid, fingerprint); // iq xmpp_ctx_t* const ctx = connection_get_ctx(); - char* id = xmpp_uuid_gen(ctx); + char* id = connection_create_stanza_id(); xmpp_stanza_t* iq = xmpp_iq_new(ctx, STANZA_TYPE_GET, id); xmpp_stanza_set_from(iq, xmpp_conn_get_jid(connection_get_conn())); xmpp_stanza_set_to(iq, jid); @@ -370,9 +383,10 @@ _ox_request_public_key(const char* const jid, const char* const fingerprint) xmpp_stanza_add_child(pubsub, items); xmpp_stanza_add_child(iq, pubsub); - xmpp_id_handler_add(connection_get_conn(), _ox_public_key_result, id, NULL); + iq_id_handler_add(xmpp_stanza_get_id(iq), _ox_public_key_result, NULL, NULL); - xmpp_send(connection_get_conn(), iq); + iq_send_stanza(iq); + xmpp_stanza_release(iq); } /*! @@ -400,7 +414,7 @@ _ox_request_public_key(const char* const jid, const char* const fingerprint) */ int -_ox_public_key_result(xmpp_conn_t* const conn, xmpp_stanza_t* const stanza, void* const userdata) +_ox_public_key_result(xmpp_stanza_t* const stanza, void* const userdata) { log_debug("[OX] Processing result public key"); @@ -463,13 +477,10 @@ _ox_public_key_result(xmpp_conn_t* const conn, xmpp_stanza_t* const stanza, void char* _gettimestamp() { - time_t now = time(NULL); - struct tm* tm = localtime(&now); - char buf[255]; - strftime(buf, sizeof(buf), "%FT%T", tm); - GString* d = g_string_new(buf); - g_string_append(d, "Z"); - return strdup(d->str); + GDateTime* dt = g_date_time_new_now_local(); + gchar* datestr = g_date_time_format(dt, "%FT%TZ"); + g_date_time_unref(dt); + return datestr; } #endif // HAVE_LIBGPGME |