From 9b41192b25579dc745bf2e96bc4696deca792d1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anton=20Luka=20=C5=A0ijanec?= Date: Tue, 28 Jun 2022 19:38:25 +0200 Subject: some changes I made on another laptop --- ircxmpp.c | 59 ++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 21 deletions(-) (limited to 'ircxmpp.c') diff --git a/ircxmpp.c b/ircxmpp.c index 2afaa13..e8d8e97 100644 --- a/ircxmpp.c +++ b/ircxmpp.c @@ -163,15 +163,21 @@ static void bridge_forward (const char * f, const char * m, struct ircxmpp * irc if (s == IRC) { irc_cmd_join(bridge->irc, ircxmpp->channel, ircxmpp->channel_password); irc_run_once(bridge); - if (m) { - char b[1024]; - strncpy(b, m, 1023); - b[1023] = '\0'; - char * c = b; - while (*++c != '\0') - if (!(isprint(*c) || * (unsigned char *) c > 0x7F /* UTF-8 */)) - *c = ' '; /* to prevent newline message smuggling */ - irc_cmd_msg(bridge->irc, ircxmpp->channel, m); + if (m && strlen(m) < 65535) { + char * msg = alloca(strlen(m)+1); + { + char * w = msg; + char * r = msg; + do // odstranimo crje + if (*r != '\r') + w++[0] = *r; + while (++r[0]); + w++[0] = '\0'; + } + char * send; + while ((send = strtok(msg, "\n"))) { + irc_cmd_msg(bridge->irc, ircxmpp->channel, send+1); + } } irc_run_once(bridge); } else if (m) { @@ -702,18 +708,29 @@ static void obdelaj_bridge (const void * nodep, VISIT which __attribute__((unuse free_bridge(bridge, "xmpp connection dropped"); return; } - while (bridge->conn && xmpp_conn_is_connected(bridge->conn) && bridge->messages_length - && xmpp_conn_get_bound_jid(bridge->conn)) { - char id[64]; - LOG(bridge->ircxmpp, IRCXMPP_DEBUG, "sending xmpp msg from %s", bridge->identifier); - sprintf(id, "ircxmpp-%x", rand()); - xmpp_stanza_t * stan = xmpp_message_new( - bridge->ircxmpp->ctx, "groupchat", bridge->ircxmpp->muc, id); - xmpp_message_set_body(stan, bridge->messages[bridge->messages_length-1]); - xmpp_stanza_set_from(stan, xmpp_conn_get_bound_jid(bridge->conn)); - xmpp_send(bridge->conn, stan); - xmpp_stanza_release(stan); - free(bridge->messages[--bridge->messages_length]); + const char * jid = NULL; + if (bridge->conn && xmpp_conn_is_connected(bridge->conn) // TODO: test this + && (jid = xmpp_conn_get_bound_jid(bridge->conn))) { + for (size_t i = 0; i < bridge->messages_length; i++) { + if (!bridge->conn || !xmpp_conn_is_connected(bridge->conn)) { + LOG(bridge->ircxmpp, IRCXMPP_WARN, "message for bridge %s dropped", + bridge->identifier); + free(bridge->messages[i]); + continue; + } + char id[64]; + LOG(bridge->ircxmpp, IRCXMPP_DEBUG, "sending xmpp msg from %s", + bridge->identifier); + sprintf(id, "ircxmpp-%x", rand()); + xmpp_stanza_t * stan = xmpp_message_new(bridge->ircxmpp->ctx, "groupchat", + bridge->ircxmpp->muc, id); + xmpp_message_set_body(stan, bridge->messages[bridge->messages_length-1]); + xmpp_stanza_set_from(stan, xmpp_conn_get_bound_jid(bridge->conn)); + xmpp_send(bridge->conn, stan); + xmpp_stanza_release(stan); + free(bridge->messages[i]); + } + bridge->messages_length = 0; } } void ircxmpp_run_once (struct ircxmpp * ircxmpp) { -- cgit v1.2.3