diff --git a/src/omemo/omemo.c b/src/omemo/omemo.c index 9dac4d76..e3a652b1 100644 --- a/src/omemo/omemo.c +++ b/src/omemo/omemo.c @@ -1147,6 +1147,7 @@ omemo_on_message_recv(const char* const from_jid, uint32_t sid, if (payload == NULL) { signal_buffer_free(plaintext_key); + *error = OMEMO_ERR_KEY_TRANSPORT; return NULL; } diff --git a/src/xmpp/message.c b/src/xmpp/message.c index 09f90ba9..76179efc 100644 --- a/src/xmpp/message.c +++ b/src/xmpp/message.c @@ -1089,25 +1089,7 @@ _handle_groupchat(xmpp_stanza_t* const stanza) if (message->omemo_err != OMEMO_ERR_NONE) { message->enc = PROF_MSG_ENC_OMEMO; if (message->plain == NULL) { - switch (message->omemo_err) { - case OMEMO_ERR_NO_KEY: - message->plain = g_strdup("OMEMO message received but no key for this device found."); - break; - case OMEMO_ERR_NOT_TRUSTED: - message->plain = g_strdup("OMEMO message received but sender identity is untrusted."); - break; - case OMEMO_ERR_NO_SESSION: - message->plain = g_strdup("OMEMO message received but no session found. Try '/omemo start'."); - break; - case OMEMO_ERR_DECRYPT_FAILED: - message->plain = g_strdup("OMEMO message received but decryption failed."); - break; - case OMEMO_ERR_KEY_TRANSPORT: - break; - default: - message->plain = g_strdup("OMEMO message received but could not be decrypted."); - break; - } + message->plain = omemo_error_to_string(message->omemo_err); } } else if (message->plain != NULL) { message->enc = PROF_MSG_ENC_OMEMO; @@ -1272,25 +1254,7 @@ _handle_muc_private_message(xmpp_stanza_t* const stanza) if (message->omemo_err != OMEMO_ERR_NONE) { message->enc = PROF_MSG_ENC_OMEMO; if (message->plain == NULL) { - switch (message->omemo_err) { - case OMEMO_ERR_NO_KEY: - message->plain = g_strdup("OMEMO message received but no key for this device found."); - break; - case OMEMO_ERR_NOT_TRUSTED: - message->plain = g_strdup("OMEMO message received but sender identity is untrusted."); - break; - case OMEMO_ERR_NO_SESSION: - message->plain = g_strdup("OMEMO message received but no session found. Try '/omemo start'."); - break; - case OMEMO_ERR_DECRYPT_FAILED: - message->plain = g_strdup("OMEMO message received but decryption failed."); - break; - case OMEMO_ERR_KEY_TRANSPORT: - break; - default: - message->plain = g_strdup("OMEMO message received but could not be decrypted."); - break; - } + message->plain = omemo_error_to_string(message->omemo_err); } } else if (message->plain != NULL) { message->enc = PROF_MSG_ENC_OMEMO; @@ -1462,25 +1426,7 @@ _handle_chat(xmpp_stanza_t* const stanza, gboolean is_mam, gboolean is_carbon, c if (message->omemo_err != OMEMO_ERR_NONE) { message->enc = PROF_MSG_ENC_OMEMO; if (message->plain == NULL) { - switch (message->omemo_err) { - case OMEMO_ERR_NO_KEY: - message->plain = g_strdup("OMEMO message received but no key for this device found."); - break; - case OMEMO_ERR_NOT_TRUSTED: - message->plain = g_strdup("OMEMO message received but sender identity is untrusted."); - break; - case OMEMO_ERR_NO_SESSION: - message->plain = g_strdup("OMEMO message received but no session found. Try '/omemo start'."); - break; - case OMEMO_ERR_DECRYPT_FAILED: - message->plain = g_strdup("OMEMO message received but decryption failed."); - break; - case OMEMO_ERR_KEY_TRANSPORT: - break; - default: - message->plain = g_strdup("OMEMO message received but could not be decrypted."); - break; - } + message->plain = omemo_error_to_string(message->omemo_err); } } else if (message->plain != NULL) { message->enc = PROF_MSG_ENC_OMEMO; diff --git a/src/xmpp/omemo.c b/src/xmpp/omemo.c index 9238f493..cef09dde 100644 --- a/src/xmpp/omemo.c +++ b/src/xmpp/omemo.c @@ -421,10 +421,6 @@ omemo_receive_message(xmpp_stanza_t* const stanza, gboolean* trusted, omemo_erro keys, payload_raw, payload_len, g_strcmp0(type, STANZA_TYPE_GROUPCHAT) == 0, trusted, error); - if (plaintext == NULL && *error == OMEMO_ERR_NONE && payload == NULL) { - *error = OMEMO_ERR_KEY_TRANSPORT; - } - if (keys) { g_list_free_full(keys, (GDestroyNotify)omemo_key_free); } @@ -707,3 +703,24 @@ _omemo_bundle_publish_configure_result(xmpp_stanza_t* const stanza, void* const return 0; } + +char* +omemo_error_to_string(omemo_error_t error) +{ + switch (error) { + case OMEMO_ERR_NO_KEY: + return g_strdup("OMEMO message received but no key for this device found."); + case OMEMO_ERR_NOT_TRUSTED: + return g_strdup("OMEMO message received but sender identity is untrusted."); + case OMEMO_ERR_NO_SESSION: + return g_strdup("OMEMO message received but no session found. Try '/omemo start'."); + case OMEMO_ERR_DECRYPT_FAILED: + return g_strdup("OMEMO message received but decryption failed."); + case OMEMO_ERR_KEY_TRANSPORT: + return NULL; + case OMEMO_ERR_NONE: + return NULL; + default: + return g_strdup("OMEMO message received but could not be decrypted."); + } +} diff --git a/src/xmpp/omemo.h b/src/xmpp/omemo.h index ff6d648b..772bd186 100644 --- a/src/xmpp/omemo.h +++ b/src/xmpp/omemo.h @@ -20,3 +20,4 @@ void omemo_bundle_request(const char* const jid, uint32_t device_id, ProfIqCallb int omemo_start_device_session_handle_bundle(xmpp_stanza_t* const stanza, void* const userdata); char* omemo_receive_message(xmpp_stanza_t* const stanza, gboolean* trusted, omemo_error_t* error) __attribute__((nonnull(2, 3))); +char* omemo_error_to_string(omemo_error_t error);