refactor: improve key transport message handling and deduplicate errors

Centralize heartbeat detection and have a function for error to string
mapping. So we don't need the same code in multiple handlers.

Signed-off-by: Michael Vetter <jubalh@iodoru.org>
This commit is contained in:
Michael Vetter
2026-03-22 17:36:41 +01:00
parent e4bfda2f8a
commit a824b26008
4 changed files with 26 additions and 61 deletions

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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.");
}
}

View File

@@ -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);