1
0
mirror of https://github.com/profanity-im/profanity.git synced 2024-09-01 19:24:15 -04:00

Merge pull request #1941 from profanity-im/some-fixes

Some fixes
This commit is contained in:
Michael Vetter 2023-12-12 16:39:11 +01:00 committed by GitHub
commit b18b6cbd29
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 77 additions and 17 deletions

View File

@ -932,21 +932,23 @@ void
plugins_shutdown(void) plugins_shutdown(void)
{ {
GList* values = g_hash_table_get_values(plugins); GList* values = g_hash_table_get_values(plugins);
GList* curr = values; GList *curr = values, *next;
while (curr) { while (curr) {
next = g_list_next(curr);
#ifdef HAVE_PYTHON #ifdef HAVE_PYTHON
if (((ProfPlugin*)curr->data)->lang == LANG_PYTHON) { if (curr && ((ProfPlugin*)curr->data)->lang == LANG_PYTHON) {
python_plugin_destroy(curr->data); python_plugin_destroy(curr->data);
curr = NULL;
} }
#endif #endif
#ifdef HAVE_C #ifdef HAVE_C
if (((ProfPlugin*)curr->data)->lang == LANG_C) { if (curr && ((ProfPlugin*)curr->data)->lang == LANG_C) {
c_plugin_destroy(curr->data); c_plugin_destroy(curr->data);
curr = NULL;
} }
#endif #endif
curr = next;
curr = g_list_next(curr);
} }
g_list_free(values); g_list_free(values);
#ifdef HAVE_PYTHON #ifdef HAVE_PYTHON

View File

@ -256,9 +256,9 @@ _shutdown(void)
accounts_close(); accounts_close();
tlscerts_close(); tlscerts_close();
log_stderr_close(); log_stderr_close();
log_close();
plugins_shutdown(); plugins_shutdown();
cmd_uninit(); cmd_uninit();
ui_close(); ui_close();
prefs_close(); prefs_close();
log_close();
} }

View File

@ -712,6 +712,8 @@ ui_close_win(int index)
} }
} }
// remove the IQ handlers
iq_handlers_remove_win(window);
wins_close_by_num(index); wins_close_by_num(index);
title_bar_console(); title_bar_console();
status_bar_current(1); status_bar_current(1);

View File

@ -190,7 +190,6 @@ _conn_apply_settings(const char* const jid, const char* const passwd, const char
_compute_identifier(jidp->barejid); _compute_identifier(jidp->barejid);
xmpp_ctx_set_verbosity(conn.xmpp_ctx, 0);
xmpp_conn_set_jid(conn.xmpp_conn, jid); xmpp_conn_set_jid(conn.xmpp_conn, jid);
if (passwd) if (passwd)
xmpp_conn_set_pass(conn.xmpp_conn, passwd); xmpp_conn_set_pass(conn.xmpp_conn, passwd);
@ -561,7 +560,7 @@ connection_disconnect(void)
} }
} }
free(prof_identifier); g_free(prof_identifier);
prof_identifier = NULL; prof_identifier = NULL;
} }
@ -998,22 +997,25 @@ _connection_handler(xmpp_conn_t* const xmpp_conn, const xmpp_conn_event_t status
log_debug("Connection handler: XMPP_CONN_DISCONNECT"); log_debug("Connection handler: XMPP_CONN_DISCONNECT");
// lost connection for unknown reason // lost connection for unknown reason
if (conn.conn_status == JABBER_CONNECTED) { if (conn.conn_status == JABBER_CONNECTED || conn.conn_status == JABBER_DISCONNECTING) {
if (prefs_get_boolean(PREF_STROPHE_SM_ENABLED)) { if (prefs_get_boolean(PREF_STROPHE_SM_ENABLED)) {
int send_queue_len = xmpp_conn_send_queue_len(conn.xmpp_conn); int send_queue_len = xmpp_conn_send_queue_len(conn.xmpp_conn);
log_debug("Connection handler: Lost connection for unknown reason"); log_debug("Connection handler: Lost connection for unknown reason, %d messages in send queue", send_queue_len);
conn.sm_state = xmpp_conn_get_sm_state(conn.xmpp_conn); conn.sm_state = xmpp_conn_get_sm_state(conn.xmpp_conn);
if (send_queue_len > 0 && prefs_get_boolean(PREF_STROPHE_SM_RESEND)) { if (send_queue_len > 0 && prefs_get_boolean(PREF_STROPHE_SM_RESEND)) {
conn.queued_messages = calloc(send_queue_len + 1, sizeof(*conn.queued_messages)); conn.queued_messages = calloc(send_queue_len + 1, sizeof(*conn.queued_messages));
for (int n = 0; n < send_queue_len && conn.queued_messages[n]; ++n) { for (int n = 0; n < send_queue_len && conn.queued_messages[n]; ++n) {
conn.queued_messages[n] = xmpp_conn_send_queue_drop_element(conn.xmpp_conn, XMPP_QUEUE_OLDEST); conn.queued_messages[n] = xmpp_conn_send_queue_drop_element(conn.xmpp_conn, XMPP_QUEUE_OLDEST);
} }
} else if (send_queue_len > 0) {
log_debug("Connection handler: dropping those messages since SM RESEND is disabled");
} }
} }
session_lost_connection(); if (conn.conn_status == JABBER_CONNECTED)
session_lost_connection();
// login attempt failed // login attempt failed
} else if (conn.conn_status != JABBER_DISCONNECTING) { } else {
gchar* host; gchar* host;
int port; int port;
if (stream_error && stream_error->stanza && _get_other_host(stream_error->stanza, &host, &port)) { if (stream_error && stream_error->stanza && _get_other_host(stream_error->stanza, &host, &port)) {
@ -1126,7 +1128,7 @@ static void
_compute_identifier(const char* barejid) _compute_identifier(const char* barejid)
{ {
// in case of reconnect (lost connection) // in case of reconnect (lost connection)
free(prof_identifier); g_free(prof_identifier);
prof_identifier = g_compute_hmac_for_string(G_CHECKSUM_SHA256, prof_identifier = g_compute_hmac_for_string(G_CHECKSUM_SHA256,
(guchar*)profanity_instance_id, strlen(profanity_instance_id), (guchar*)profanity_instance_id, strlen(profanity_instance_id),

View File

@ -259,6 +259,7 @@ iq_handlers_init(void)
int millis = prefs_get_autoping() * 1000; int millis = prefs_get_autoping() * 1000;
xmpp_timed_handler_add(conn, _autoping_timed_send, millis, ctx); xmpp_timed_handler_add(conn, _autoping_timed_send, millis, ctx);
} }
received_disco_items = FALSE;
iq_rooms_cache_clear(); iq_rooms_cache_clear();
iq_handlers_clear(); iq_handlers_clear();
@ -267,8 +268,56 @@ iq_handlers_init(void)
rooms_cache = g_hash_table_new_full(g_str_hash, g_str_equal, free, (GDestroyNotify)xmpp_stanza_release); rooms_cache = g_hash_table_new_full(g_str_hash, g_str_equal, free, (GDestroyNotify)xmpp_stanza_release);
} }
struct iq_win_finder
{
gsize max, cur;
char** to_be_removed;
};
static void
_win_find(char* key,
ProfIqHandler* handler,
struct iq_win_finder* finder)
{
if (handler->func == _mam_rsm_id_handler) {
if (finder->cur >= finder->max) {
finder->max *= 2;
finder->to_be_removed = g_realloc_n(finder->to_be_removed, finder->max, sizeof(char*));
}
finder->to_be_removed[finder->cur++] = g_strdup(key);
}
}
void void
iq_handlers_clear() iq_handlers_remove_win(ProfWin* window)
{
log_debug("Remove window %p of type %d", window, window ? window->type : -1);
if (!window)
return;
GSList *cur = late_delivery_windows, *next;
while (cur) {
LateDeliveryUserdata* del_data = cur->data;
next = g_slist_next(cur);
if (del_data->win == (void*)window)
late_delivery_windows = g_slist_delete_link(late_delivery_windows,
cur);
cur = next;
}
struct iq_win_finder st = { 0 };
st.max = g_hash_table_size(id_handlers);
if (st.max == 0)
return;
st.to_be_removed = g_new(char*, st.max);
g_hash_table_foreach(id_handlers, (GHFunc)_win_find, &st);
for (gsize n = 0; n < st.cur; ++n) {
g_hash_table_remove(id_handlers, st.to_be_removed[n]);
g_free(st.to_be_removed[n]);
}
g_free(st.to_be_removed);
}
void
iq_handlers_clear(void)
{ {
if (id_handlers) { if (id_handlers) {
g_hash_table_remove_all(id_handlers); g_hash_table_remove_all(id_handlers);
@ -2696,6 +2745,10 @@ _mam_rsm_id_handler(xmpp_stanza_t* const stanza, void* const userdata)
gboolean is_complete = g_strcmp0(xmpp_stanza_get_attribute(fin, "complete"), "true") == 0; gboolean is_complete = g_strcmp0(xmpp_stanza_get_attribute(fin, "complete"), "true") == 0;
MamRsmUserdata* data = (MamRsmUserdata*)userdata; MamRsmUserdata* data = (MamRsmUserdata*)userdata;
ProfWin* window = (ProfWin*)data->win; ProfWin* window = (ProfWin*)data->win;
if (wins_get_num(window) == -1) {
log_error("Window %p should not get any events anymore", window);
return 0;
}
buffer_remove_entry(window->layout->buffer, 0); buffer_remove_entry(window->layout->buffer, 0);

View File

@ -1261,7 +1261,7 @@ _handle_muc_private_message(xmpp_stanza_t* const stanza)
ProfMessage* message = message_init(); ProfMessage* message = message_init();
message->type = PROF_MSG_TYPE_MUCPM; message->type = PROF_MSG_TYPE_MUCPM;
const gchar* from = xmpp_stanza_get_from(stanza); const char* from = xmpp_stanza_get_from(stanza);
if (!from) { if (!from) {
goto out; goto out;
} }
@ -1360,7 +1360,7 @@ _handle_chat(xmpp_stanza_t* const stanza, gboolean is_mam, gboolean is_carbon, c
return; return;
} }
const gchar* from = xmpp_stanza_get_from(stanza); const char* from = xmpp_stanza_get_from(stanza);
if (!from) { if (!from) {
return; return;
} }

View File

@ -240,7 +240,8 @@ void iq_enable_carbons(void);
void iq_disable_carbons(void); void iq_disable_carbons(void);
void iq_send_software_version(const char* const fulljid); void iq_send_software_version(const char* const fulljid);
void iq_rooms_cache_clear(void); void iq_rooms_cache_clear(void);
void iq_handlers_clear(); void iq_handlers_remove_win(ProfWin* window);
void iq_handlers_clear(void);
void iq_room_list_request(gchar* conferencejid, gchar* filter); void iq_room_list_request(gchar* conferencejid, gchar* filter);
void iq_disco_info_request(gchar* jid); void iq_disco_info_request(gchar* jid);
void iq_disco_items_request(gchar* jid); void iq_disco_items_request(gchar* jid);