From 847a86de50a5a2afd319bfaef94b2dbef6f39934 Mon Sep 17 00:00:00 2001 From: Steffen Jaeckel Date: Tue, 14 Nov 2023 14:53:49 +0100 Subject: [PATCH] add `connection_get_jid()` Use a singleton `Jid` inside the connection instead of always re-creating a `Jid` from the same string. Signed-off-by: Steffen Jaeckel --- src/chatlog.c | 27 ++++++++-------- src/command/cmd_funcs.c | 9 ++---- src/database.c | 18 ++++------- src/event/client_events.c | 3 +- src/event/server_events.c | 3 +- src/omemo/omemo.c | 20 ++++-------- src/tools/editor.c | 2 +- src/ui/chatwin.c | 2 +- src/ui/vcardwin.c | 3 +- src/ui/window.c | 3 +- src/xmpp/connection.c | 53 ++++++++++++++++++++++---------- src/xmpp/message.c | 11 ++----- src/xmpp/muc.c | 3 +- src/xmpp/omemo.c | 21 ++++--------- src/xmpp/roster.c | 3 +- src/xmpp/xmpp.h | 3 +- tests/unittests/xmpp/stub_xmpp.c | 5 +++ 17 files changed, 88 insertions(+), 101 deletions(-) diff --git a/src/chatlog.c b/src/chatlog.c index 01aa4401..9956dadd 100644 --- a/src/chatlog.c +++ b/src/chatlog.c @@ -85,8 +85,7 @@ void chat_log_msg_out(const char* const barejid, const char* const msg, const char* const resource) { if (prefs_get_boolean(PREF_CHLOG)) { - auto_char char* mybarejid = connection_get_barejid(); - _chat_log_chat(mybarejid, barejid, msg, PROF_OUT_LOG, NULL, resource); + _chat_log_chat(connection_get_barejid(), barejid, msg, PROF_OUT_LOG, NULL, resource); } } @@ -94,7 +93,7 @@ void chat_log_otr_msg_out(const char* const barejid, const char* const msg, const char* const resource) { if (prefs_get_boolean(PREF_CHLOG)) { - auto_char char* mybarejid = connection_get_barejid(); + const char* mybarejid = connection_get_barejid(); auto_gchar gchar* pref_otr_log = prefs_get_string(PREF_OTR_LOG); if (strcmp(pref_otr_log, "on") == 0) { _chat_log_chat(mybarejid, barejid, msg, PROF_OUT_LOG, NULL, resource); @@ -108,7 +107,7 @@ void chat_log_pgp_msg_out(const char* const barejid, const char* const msg, const char* const resource) { if (prefs_get_boolean(PREF_CHLOG)) { - auto_char char* mybarejid = connection_get_barejid(); + const char* mybarejid = connection_get_barejid(); auto_gchar gchar* pref_pgp_log = prefs_get_string(PREF_PGP_LOG); if (strcmp(pref_pgp_log, "on") == 0) { _chat_log_chat(mybarejid, barejid, msg, PROF_OUT_LOG, NULL, resource); @@ -122,7 +121,7 @@ void chat_log_omemo_msg_out(const char* const barejid, const char* const msg, const char* const resource) { if (prefs_get_boolean(PREF_CHLOG)) { - auto_char char* mybarejid = connection_get_barejid(); + const char* mybarejid = connection_get_barejid(); auto_gchar gchar* pref_omemo_log = prefs_get_string(PREF_OMEMO_LOG); if (strcmp(pref_omemo_log, "on") == 0) { _chat_log_chat(mybarejid, barejid, msg, PROF_OUT_LOG, NULL, resource); @@ -136,7 +135,7 @@ void chat_log_otr_msg_in(ProfMessage* message) { if (prefs_get_boolean(PREF_CHLOG)) { - auto_char char* mybarejid = connection_get_barejid(); + const char* mybarejid = connection_get_barejid(); auto_gchar gchar* pref_otr_log = prefs_get_string(PREF_OTR_LOG); if (message->enc == PROF_MSG_ENC_NONE || (strcmp(pref_otr_log, "on") == 0)) { if (message->type == PROF_MSG_TYPE_MUCPM) { @@ -158,7 +157,7 @@ void chat_log_pgp_msg_in(ProfMessage* message) { if (prefs_get_boolean(PREF_CHLOG)) { - auto_char char* mybarejid = connection_get_barejid(); + const char* mybarejid = connection_get_barejid(); auto_gchar gchar* pref_pgp_log = prefs_get_string(PREF_PGP_LOG); if (strcmp(pref_pgp_log, "on") == 0) { if (message->type == PROF_MSG_TYPE_MUCPM) { @@ -180,7 +179,7 @@ void chat_log_omemo_msg_in(ProfMessage* message) { if (prefs_get_boolean(PREF_CHLOG)) { - auto_char char* mybarejid = connection_get_barejid(); + const char* mybarejid = connection_get_barejid(); auto_gchar gchar* pref_omemo_log = prefs_get_string(PREF_OMEMO_LOG); if (strcmp(pref_omemo_log, "on") == 0) { if (message->type == PROF_MSG_TYPE_MUCPM) { @@ -202,7 +201,7 @@ void chat_log_msg_in(ProfMessage* message) { if (prefs_get_boolean(PREF_CHLOG)) { - auto_char char* mybarejid = connection_get_barejid(); + const char* mybarejid = connection_get_barejid(); if (message->type == PROF_MSG_TYPE_MUCPM) { _chat_log_chat(mybarejid, message->from_jid->barejid, message->plain, PROF_IN_LOG, message->timestamp, message->from_jid->resourcepart); @@ -308,9 +307,8 @@ void groupchat_log_msg_out(const gchar* const room, const gchar* const msg) { if (prefs_get_boolean(PREF_GRLOG)) { - auto_char char* mybarejid = connection_get_barejid(); char* mynick = muc_nick(room); - _groupchat_log_chat(mybarejid, room, mynick, msg); + _groupchat_log_chat(connection_get_barejid(), room, mynick, msg); } } @@ -318,8 +316,7 @@ void groupchat_log_msg_in(const gchar* const room, const gchar* const nick, const gchar* const msg) { if (prefs_get_boolean(PREF_GRLOG)) { - auto_char char* mybarejid = connection_get_barejid(); - _groupchat_log_chat(mybarejid, room, nick, msg); + _groupchat_log_chat(connection_get_barejid(), room, nick, msg); } } @@ -327,7 +324,7 @@ void groupchat_log_omemo_msg_out(const gchar* const room, const gchar* const msg) { if (prefs_get_boolean(PREF_CHLOG)) { - auto_char char* mybarejid = connection_get_barejid(); + const char* mybarejid = connection_get_barejid(); auto_gchar gchar* pref_omemo_log = prefs_get_string(PREF_OMEMO_LOG); char* mynick = muc_nick(room); @@ -343,7 +340,7 @@ void groupchat_log_omemo_msg_in(const gchar* const room, const gchar* const nick, const gchar* const msg) { if (prefs_get_boolean(PREF_CHLOG)) { - auto_char char* mybarejid = connection_get_barejid(); + const char* mybarejid = connection_get_barejid(); auto_gchar gchar* pref_omemo_log = prefs_get_string(PREF_OMEMO_LOG); if (strcmp(pref_omemo_log, "on") == 0) { diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index 15b818a7..b13115db 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -3448,12 +3448,11 @@ cmd_caps(ProfWin* window, const char* const command, gchar** args) static void _send_software_version_iq_to_fulljid(char* request) { - auto_char char* mybarejid = connection_get_barejid(); auto_jid Jid* jid = jid_create(request); if (jid == NULL || jid->fulljid == NULL) { cons_show("You must provide a full jid to the /software command."); - } else if (g_strcmp0(jid->barejid, mybarejid) == 0) { + } else if (g_strcmp0(jid->barejid, connection_get_barejid()) == 0) { cons_show("Cannot request software version for yourself."); } else { iq_send_software_version(jid->fulljid); @@ -4842,8 +4841,7 @@ cmd_disco(ProfWin* window, const char* const command, gchar** args) if (args[1]) { jid = g_string_append(jid, args[1]); } else { - auto_jid Jid* jidp = jid_create(connection_get_fulljid()); - jid = g_string_append(jid, jidp->domainpart); + jid = g_string_append(jid, connection_get_jid()->domainpart); } if (g_strcmp0(args[0], "info") == 0) { @@ -5039,8 +5037,7 @@ cmd_lastactivity(ProfWin* window, const char* const command, gchar** args) if ((g_strcmp0(args[0], "get") == 0)) { if (args[1] == NULL) { - auto_jid Jid* jidp = jid_create(connection_get_fulljid()); - GString* jid = g_string_new(jidp->domainpart); + GString* jid = g_string_new(connection_get_jid()->domainpart); iq_last_activity_request(jid->str); diff --git a/src/database.c b/src/database.c index ce1d1d3d..a8e3c7c0 100644 --- a/src/database.c +++ b/src/database.c @@ -235,9 +235,7 @@ log_database_add_incoming(ProfMessage* message) if (message->to_jid) { _add_to_db(message, NULL, message->from_jid, message->to_jid); } else { - auto_jid Jid* myjid = jid_create(connection_get_fulljid()); - - _add_to_db(message, NULL, message->from_jid, myjid); + _add_to_db(message, NULL, message->from_jid, connection_get_jid()); } } @@ -253,9 +251,7 @@ _log_database_add_outgoing(char* type, const char* const id, const char* const b msg->timestamp = g_date_time_new_now_local(); // TODO: get from outside. best to have whole ProfMessage from outside msg->enc = enc; - auto_jid Jid* myjid = jid_create(connection_get_fulljid()); - - _add_to_db(msg, type, myjid, msg->from_jid); // TODO: myjid now in profmessage + _add_to_db(msg, type, connection_get_jid(), msg->from_jid); // TODO: myjid now in profmessage message_free(msg); } @@ -283,9 +279,8 @@ ProfMessage* log_database_get_limits_info(const gchar* const contact_barejid, gboolean is_last) { sqlite3_stmt* stmt = NULL; - const char* jid = connection_get_fulljid(); - auto_jid Jid* myjid = jid_create(jid); - if (!myjid) + const Jid* myjid = connection_get_jid(); + if (!myjid->str) return NULL; const char* order = is_last ? "DESC" : "ASC"; @@ -327,9 +322,8 @@ GSList* log_database_get_previous_chat(const gchar* const contact_barejid, const char* start_time, char* end_time, gboolean from_start, gboolean flip) { sqlite3_stmt* stmt = NULL; - const char* jid = connection_get_fulljid(); - auto_jid Jid* myjid = jid_create(jid); - if (!myjid) + const Jid* myjid = connection_get_jid(); + if (!myjid->str) return NULL; // Flip order when querying older pages diff --git a/src/event/client_events.c b/src/event/client_events.c index bccedc97..a37e7b5b 100644 --- a/src/event/client_events.c +++ b/src/event/client_events.c @@ -86,8 +86,7 @@ cl_ev_connect_account(ProfAccount* account) void cl_ev_disconnect(void) { - auto_char char* mybarejid = connection_get_barejid(); - cons_show("%s logged out successfully.", mybarejid); + cons_show("%s logged out successfully.", connection_get_barejid()); ui_close_all_wins(); ev_disconnect_cleanup(); diff --git a/src/event/server_events.c b/src/event/server_events.c index 1638cc7f..d7ea97cd 100644 --- a/src/event/server_events.c +++ b/src/event/server_events.c @@ -630,8 +630,7 @@ sv_ev_incoming_message(ProfMessage* message) char* looking_for_jid = message->from_jid->barejid; if (message->is_mam) { - auto_char char* mybarejid = connection_get_barejid(); - if (g_strcmp0(mybarejid, message->from_jid->barejid) == 0) { + if (g_strcmp0(connection_get_barejid(), message->from_jid->barejid) == 0) { if (message->to_jid) { looking_for_jid = message->to_jid->barejid; } diff --git a/src/omemo/omemo.c b/src/omemo/omemo.c index d908795b..d7880dcc 100644 --- a/src/omemo/omemo.c +++ b/src/omemo/omemo.c @@ -339,7 +339,7 @@ omemo_publish_crypto_materials(void) static void _acquire_sender_devices_list(void) { - auto_char char* barejid = connection_get_barejid(); + const char* barejid = connection_get_barejid(); g_hash_table_insert(omemo_ctx.device_list_handler, strdup(barejid), _handle_own_device_list); omemo_devicelist_request(barejid); @@ -375,8 +375,7 @@ omemo_start_session(const char* const barejid) log_debug("[OMEMO] missing device list for %s", barejid); // Own devices are handled by _handle_own_device_list // We won't add _handle_device_list_start_session for ourself - auto_char char* mybarejid = connection_get_barejid(); - if (g_strcmp0(mybarejid, barejid) != 0) { + if (g_strcmp0(connection_get_barejid(), barejid) != 0) { g_hash_table_insert(omemo_ctx.device_list_handler, strdup(barejid), _handle_device_list_start_session); } omemo_devicelist_request(barejid); @@ -680,7 +679,7 @@ omemo_on_message_send(ProfWin* win, const char* const message, gboolean request_ { char* id = NULL; int res; - auto_jid Jid* jid = jid_create(connection_get_fulljid()); + const Jid* jid = connection_get_jid(); GList* keys = NULL; unsigned char* key; @@ -754,15 +753,12 @@ omemo_on_message_send(ProfWin* win, const char* const message, gboolean request_ // Don't encrypt for this device (according to // ). // Yourself as recipients in case of MUC - char* mybarejid = connection_get_barejid(); - if (!g_strcmp0(mybarejid, recipients_iter->data)) { + if (!g_strcmp0(connection_get_barejid(), recipients_iter->data)) { if (GPOINTER_TO_INT(device_ids_iter->data) == omemo_ctx.device_id) { - free(mybarejid); log_debug("[OMEMO][SEND] Skipping %d (my device) ", GPOINTER_TO_INT(device_ids_iter->data)); continue; } } - free(mybarejid); log_debug("[OMEMO][SEND] recipients with device id %d for %s", GPOINTER_TO_INT(device_ids_iter->data), recipients_iter->data); res = session_cipher_create(&cipher, omemo_ctx.store, &address, omemo_ctx.signal); @@ -1806,14 +1802,10 @@ out: char* omemo_qrcode_str() { - char* mybarejid = connection_get_barejid(); - char* fingerprint = omemo_own_fingerprint(FALSE); + auto_char char* fingerprint = omemo_own_fingerprint(FALSE); uint32_t sid = omemo_device_id(); - char* qrstr = g_strdup_printf("xmpp:%s?omemo-sid-%d=%s", mybarejid, sid, fingerprint); - - free(mybarejid); - free(fingerprint); + char* qrstr = g_strdup_printf("xmpp:%s?omemo-sid-%d=%s", connection_get_barejid(), sid, fingerprint); return qrstr; } diff --git a/src/tools/editor.c b/src/tools/editor.c index 4cd70d9d..8f90da9b 100644 --- a/src/tools/editor.c +++ b/src/tools/editor.c @@ -56,7 +56,7 @@ get_message_from_editor(gchar* message, gchar** returned_message) auto_gchar gchar* filename = NULL; GError* glib_error = NULL; - auto_char char* jid = connection_get_barejid(); + const char* jid = connection_get_barejid(); if (jid) { filename = files_file_in_account_data_path(DIR_EDITOR, jid, "compose.md"); } else { diff --git a/src/ui/chatwin.c b/src/ui/chatwin.c index 4317cc78..cf0b675f 100644 --- a/src/ui/chatwin.c +++ b/src/ui/chatwin.c @@ -427,7 +427,7 @@ chatwin_outgoing_msg(ProfChatWin* chatwin, const char* const message, char* id, auto_char char* enc_char = get_enc_char(enc_mode, chatwin->outgoing_char); - auto_jid Jid* myjid = jid_create(connection_get_fulljid()); + const Jid* myjid = connection_get_jid(); auto_char char* display_message = plugins_pre_chat_message_display(myjid->barejid, myjid->resourcepart, strdup(message)); if (request_receipt && id) { diff --git a/src/ui/vcardwin.c b/src/ui/vcardwin.c index 0cef89fd..4ee8c96a 100644 --- a/src/ui/vcardwin.c +++ b/src/ui/vcardwin.c @@ -53,8 +53,7 @@ gchar* vcardwin_get_string(ProfVcardWin* vcardwin) { GString* string = g_string_new("vCard: "); - auto_char char* jid = connection_get_barejid(); - g_string_append(string, jid); + g_string_append(string, connection_get_barejid()); if (vcardwin->vcard && vcardwin->vcard->modified) { g_string_append(string, " (modified)"); diff --git a/src/ui/window.c b/src/ui/window.c index b0452091..2faa925e 100644 --- a/src/ui/window.c +++ b/src/ui/window.c @@ -373,9 +373,8 @@ win_get_title(ProfWin* window) assert(vcardwin->memcheck == PROFVCARDWIN_MEMCHECK); GString* title = g_string_new("vCard "); - auto_char char* jid = connection_get_barejid(); - g_string_append(title, jid); + g_string_append(title, connection_get_barejid()); if (vcardwin->vcard->modified) { g_string_append(title, " *"); diff --git a/src/xmpp/connection.c b/src/xmpp/connection.c index 71e7d21d..759fded8 100644 --- a/src/xmpp/connection.c +++ b/src/xmpp/connection.c @@ -68,6 +68,7 @@ typedef struct prof_conn_t char* presence_message; int priority; char* domain; + Jid* jid; GHashTable* available_resources; GHashTable* features_by_jid; GHashTable* requested_features; @@ -135,6 +136,7 @@ connection_init(void) conn.conn_last_event = XMPP_CONN_DISCONNECT; conn.presence_message = NULL; conn.domain = NULL; + conn.jid = NULL; conn.features_by_jid = NULL; conn.available_resources = g_hash_table_new_full(g_str_hash, g_str_equal, free, (GDestroyNotify)resource_destroy); conn.requested_features = g_hash_table_new_full(g_str_hash, g_str_equal, free, NULL); @@ -562,6 +564,9 @@ connection_disconnect(void) g_free(prof_identifier); prof_identifier = NULL; + + jid_destroy(conn.jid); + conn.jid = NULL; } void @@ -724,17 +729,34 @@ connection_get_fulljid(void) } } -char* +const Jid* +connection_get_jid(void) +{ + static const char* fulljid; + const char* cur_fulljid = connection_get_fulljid(); + if (!conn.jid || cur_fulljid != fulljid) { + fulljid = cur_fulljid; + if (conn.jid) + jid_destroy(conn.jid); + conn.jid = jid_create(fulljid); + if (!conn.jid) { + log_error("Could not create connection-wide JID object from \"%s\"", STR_MAYBE_NULL(fulljid)); + /* In case we failed to create the jid or we're not yet + * connected (or whatever else could fail) return the + * pointer to a zero-initialized static object, so + * de-referencing that pointer won't fail. + */ + static const Jid jid = { 0 }; + return &jid; + } + } + return conn.jid; +} + +const char* connection_get_barejid(void) { - const char* jid = connection_get_fulljid(); - if (!jid) - return NULL; - - auto_jid Jid* jidp = jid_create(jid); - char* result = strdup(jidp->barejid); - - return result; + return connection_get_jid()->barejid; } char* @@ -953,9 +975,8 @@ _connection_handler(xmpp_conn_t* const xmpp_conn, const xmpp_conn_event_t status log_debug("Connection handler: XMPP_CONN_CONNECT"); conn.conn_status = JABBER_CONNECTED; - Jid* my_jid = jid_create(xmpp_conn_get_jid(conn.xmpp_conn)); - conn.domain = strdup(my_jid->domainpart); - jid_destroy(my_jid); + connection_get_jid(); + conn.domain = strdup(conn.jid->domainpart); connection_clear_data(); conn.features_by_jid = g_hash_table_new_full(g_str_hash, g_str_equal, free, (GDestroyNotify)g_hash_table_destroy); @@ -979,10 +1000,10 @@ _connection_handler(xmpp_conn_t* const xmpp_conn, const xmpp_conn_event_t status log_debug("Connection handler: XMPP_CONN_RAW_CONNECT"); conn.conn_status = JABBER_RAW_CONNECTED; - Jid* my_raw_jid = jid_create(xmpp_conn_get_jid(conn.xmpp_conn)); - log_debug("jid: %s", xmpp_conn_get_jid(conn.xmpp_conn)); - conn.domain = strdup(my_raw_jid->domainpart); - jid_destroy(my_raw_jid); + connection_get_jid(); + conn.jid = jid_create(xmpp_conn_get_jid(conn.xmpp_conn)); + log_debug("jid: %s", conn.jid->str); + conn.domain = strdup(conn.jid->domainpart); connection_clear_data(); conn.features_by_jid = g_hash_table_new_full(g_str_hash, g_str_equal, free, (GDestroyNotify)g_hash_table_destroy); diff --git a/src/xmpp/message.c b/src/xmpp/message.c index 867a7d0c..3f8addbc 100644 --- a/src/xmpp/message.c +++ b/src/xmpp/message.c @@ -101,9 +101,7 @@ static GHashTable* pubsub_event_handlers; gchar* get_display_name(const ProfMessage* const message, int* flags) { - auto_char char* barejid = connection_get_barejid(); - - if (g_strcmp0(barejid, message->from_jid->barejid) == 0) { + if (g_strcmp0(connection_get_barejid(), message->from_jid->barejid) == 0) { return g_strdup("me"); } else { if (flags) @@ -261,11 +259,10 @@ _message_handler(xmpp_conn_t* const conn, xmpp_stanza_t* const stanza, void* con if (carbons) { // carbon must come from ourselves - auto_char char* mybarejid = connection_get_barejid(); const char* const stanza_from = xmpp_stanza_get_from(stanza); if (stanza_from) { - if (g_strcmp0(mybarejid, stanza_from) != 0) { + if (g_strcmp0(connection_get_barejid(), stanza_from) != 0) { log_warning("Invalid carbon received, from: %s", stanza_from); msg_stanza = NULL; } else { @@ -1464,10 +1461,8 @@ _handle_chat(xmpp_stanza_t* const stanza, gboolean is_mam, gboolean is_carbon, c if (message->plain || message->body || message->encrypted) { if (is_carbon) { - auto_char char* mybarejid = connection_get_barejid(); - // if we are the recipient, treat as standard incoming message - if (g_strcmp0(mybarejid, message->to_jid->barejid) == 0) { + if (g_strcmp0(connection_get_barejid(), message->to_jid->barejid) == 0) { sv_ev_incoming_carbon(message); // else treat as a sent message } else { diff --git a/src/xmpp/muc.c b/src/xmpp/muc.c index bbcd23aa..34ee6b65 100644 --- a/src/xmpp/muc.c +++ b/src/xmpp/muc.c @@ -882,8 +882,7 @@ muc_members_add(const char* const room, const char* const jid) if (g_hash_table_insert(chat_room->members, strdup(jid), NULL)) { #ifdef HAVE_OMEMO if (chat_room->anonymity_type == MUC_ANONYMITY_TYPE_NONANONYMOUS) { - auto_char char* our_barejid = connection_get_barejid(); - if (strcmp(jid, our_barejid) != 0) { + if (strcmp(jid, connection_get_barejid()) != 0) { omemo_start_session(jid); } } diff --git a/src/xmpp/omemo.c b/src/xmpp/omemo.c index cc15b9db..459b5419 100644 --- a/src/xmpp/omemo.c +++ b/src/xmpp/omemo.c @@ -87,9 +87,8 @@ omemo_devicelist_configure(void) { xmpp_ctx_t* const ctx = connection_get_ctx(); auto_char char* id = connection_create_stanza_id(); - auto_jid Jid* jid = jid_create(connection_get_fulljid()); - xmpp_stanza_t* iq = stanza_create_pubsub_configure_request(ctx, id, jid->barejid, STANZA_NS_OMEMO_DEVICELIST); + xmpp_stanza_t* iq = stanza_create_pubsub_configure_request(ctx, id, connection_get_jid()->barejid, STANZA_NS_OMEMO_DEVICELIST); iq_id_handler_add(id, _omemo_devicelist_configure_submit, NULL, NULL); @@ -196,9 +195,7 @@ omemo_start_device_session_handle_bundle(xmpp_stanza_t* const stanza, void* cons } if (!from_attr) { - Jid* jid = jid_create(connection_get_fulljid()); - from = strdup(jid->barejid); - jid_destroy(jid); + from = strdup(connection_get_jid()->barejid); } else { from = strdup(from_attr); } @@ -608,9 +605,8 @@ _omemo_devicelist_configure_submit(xmpp_stanza_t* const stanza, void* const user form_set_value(form, "pubsub#access_model", "open"); xmpp_ctx_t* const ctx = connection_get_ctx(); - auto_jid Jid* jid = jid_create(connection_get_fulljid()); auto_char char* id = connection_create_stanza_id(); - xmpp_stanza_t* iq = stanza_create_pubsub_configure_submit(ctx, id, jid->barejid, STANZA_NS_OMEMO_DEVICELIST, form); + xmpp_stanza_t* iq = stanza_create_pubsub_configure_submit(ctx, id, connection_get_jid()->barejid, STANZA_NS_OMEMO_DEVICELIST, form); iq_id_handler_add(id, _omemo_devicelist_configure_result, NULL, NULL); @@ -633,10 +629,7 @@ _omemo_devicelist_configure_result(xmpp_stanza_t* const stanza, void* const user log_debug("[OMEMO] node configured"); // Try to publish - char* barejid = connection_get_barejid(); - omemo_devicelist_request(barejid); - - free(barejid); + omemo_devicelist_request(connection_get_barejid()); return 0; } @@ -660,12 +653,11 @@ _omemo_bundle_publish_result(xmpp_stanza_t* const stanza, void* const userdata) log_debug("[OMEMO] cannot publish bundle with open access model, trying to configure node"); xmpp_ctx_t* const ctx = connection_get_ctx(); - auto_jid Jid* jid = jid_create(connection_get_fulljid()); auto_char char* id = connection_create_stanza_id(); auto_gchar gchar* node = g_strdup_printf("%s:%d", STANZA_NS_OMEMO_BUNDLES, omemo_device_id()); log_debug("[OMEMO] node: %s", node); - xmpp_stanza_t* iq = stanza_create_pubsub_configure_request(ctx, id, jid->barejid, node); + xmpp_stanza_t* iq = stanza_create_pubsub_configure_request(ctx, id, connection_get_jid()->barejid, node); iq_id_handler_add(id, _omemo_bundle_publish_configure, NULL, userdata); @@ -700,10 +692,9 @@ _omemo_bundle_publish_configure(xmpp_stanza_t* const stanza, void* const userdat form_set_value(form, "pubsub#access_model", "open"); xmpp_ctx_t* const ctx = connection_get_ctx(); - auto_jid Jid* jid = jid_create(connection_get_fulljid()); auto_char char* id = connection_create_stanza_id(); auto_gchar gchar* node = g_strdup_printf("%s:%d", STANZA_NS_OMEMO_BUNDLES, omemo_device_id()); - xmpp_stanza_t* iq = stanza_create_pubsub_configure_submit(ctx, id, jid->barejid, node, form); + xmpp_stanza_t* iq = stanza_create_pubsub_configure_submit(ctx, id, connection_get_jid()->barejid, node, form); iq_id_handler_add(id, _omemo_bundle_publish_configure_result, NULL, userdata); diff --git a/src/xmpp/roster.c b/src/xmpp/roster.c index 2ef36d78..9d2b3972 100644 --- a/src/xmpp/roster.c +++ b/src/xmpp/roster.c @@ -200,9 +200,8 @@ roster_set_handler(xmpp_stanza_t* const stanza) } // if from attribute exists and it is not current users barejid, ignore push - auto_char char* mybarejid = connection_get_barejid(); const char* from = xmpp_stanza_get_from(stanza); - if (from && (strcmp(from, mybarejid) != 0)) { + if (from && (strcmp(from, connection_get_barejid()) != 0)) { log_warning("Received alleged roster push from: %s", from); return; } diff --git a/src/xmpp/xmpp.h b/src/xmpp/xmpp.h index 494d5fc1..bbff1928 100644 --- a/src/xmpp/xmpp.h +++ b/src/xmpp/xmpp.h @@ -193,7 +193,8 @@ jabber_conn_status_t connection_get_status(void); char* connection_get_presence_msg(void); void connection_set_presence_msg(const char* const message); const char* connection_get_fulljid(void); -char* connection_get_barejid(void); +const Jid* connection_get_jid(void); +const char* connection_get_barejid(void); char* connection_get_user(void); char* connection_create_uuid(void); void connection_free_uuid(char* uuid); diff --git a/tests/unittests/xmpp/stub_xmpp.c b/tests/unittests/xmpp/stub_xmpp.c index ffa7565d..9d616b08 100644 --- a/tests/unittests/xmpp/stub_xmpp.c +++ b/tests/unittests/xmpp/stub_xmpp.c @@ -58,6 +58,11 @@ void connection_disconnect(void) { } +const Jid* +connection_get_jid(void) +{ + return mock_ptr_type(Jid*); +} const char* connection_get_fulljid(void) {