From 59d5ad6780cfabba0cac41357d642b74f1ccec40 Mon Sep 17 00:00:00 2001 From: LDA Date: Sun, 30 Jun 2024 17:15:03 +0200 Subject: [PATCH] [FIX/ADD] Fix deadlock and DMs. --- src/AS.c | 35 +++++++++++++++++++++++++++++++++++ src/MatrixEventHandler.c | 21 +++++++++++++-------- src/Parsee/User.c | 22 ++-------------------- src/Routes/UserAck.c | 2 -- src/XMPP/Stanza.c | 4 ++-- src/XMPPThread.c | 4 ++-- src/include/AS.h | 3 +++ 7 files changed, 57 insertions(+), 34 deletions(-) diff --git a/src/AS.c b/src/AS.c index 0ac5bd6..47f704d 100644 --- a/src/AS.c +++ b/src/AS.c @@ -118,6 +118,41 @@ ASPing(const ParseeConfig *conf) JsonFree(json); } void +ASInvite(const ParseeConfig *conf, char *id, char *invited) +{ + HttpClientContext *ctx = NULL; + HashMap *json = NULL; + char *path, *bridge; + if (!conf || !id || !invited) + { + return; + } + + bridge = StrConcat(4, + "@", conf->sender_localpart, + ":", conf->homeserver_host + ); + path = StrConcat(5, + "/_matrix/client/v3/rooms/", id, "/invite", + "?user_id=", bridge + ); + Free(bridge); + + ctx = ParseeCreateRequest( + conf, + HTTP_POST, path + ); + Free(path); + json = HashMapCreate(); + HashMapSet(json, "user_id", JsonValueString(invited)); + HashMapSet(json, "reason", JsonValueString("Pass over.")); + ASAuthenticateRequest(conf, ctx); + ParseeSetRequestJSON(ctx, json); + + HttpClientContextFree(ctx); + JsonFree(json); +} +void ASBan(const ParseeConfig *conf, char *id, char *banned) { HttpClientContext *ctx = NULL; diff --git a/src/MatrixEventHandler.c b/src/MatrixEventHandler.c index 94ac8fa..9b8346c 100644 --- a/src/MatrixEventHandler.c +++ b/src/MatrixEventHandler.c @@ -26,19 +26,22 @@ ParseeMemberHandler(ParseeData *data, HashMap *event) DbRef *ref; HashMap *json; char *jid; + bool direct = GrabBoolean(event, 2, "content", "is_direct"); bool bot = !strncmp(sender + 1, local, strlen(local)); ASJoin(conf, room_id, state_key); jid = ParseeDecodeLocalJID(conf, state_key); - ref = DbCreate(data->db, 3, "rooms", room_id, "data"); - json = DbJson(ref); - HashMapSet(json, "is_direct", JsonValueBoolean(!bot)); - HashMapSet(json, "xmpp_user", JsonValueString(jid)); - DbUnlock(data->db, ref); + if (direct && !bot) + { + ref = DbCreate(data->db, 3, "rooms", room_id, "data"); + json = DbJson(ref); + HashMapSet(json, "is_direct", JsonValueBoolean(direct && !bot)); + HashMapSet(json, "xmpp_user", JsonValueString(jid)); + DbUnlock(data->db, ref); + ParseePushDMRoom(data, sender, jid, room_id); + } - ParseePushDMRoom(data, sender, jid, room_id); - /* Pretend everything is a dm, ignoring is_direct */ if (jid) { Free(jid); @@ -170,7 +173,9 @@ ParseeMessageHandler(ParseeData *data, HashMap *event) char *user = GrabString(json, 1, "xmpp_user"); char *local = ParseeEncodeMXID(sender); - XMPPSendPlain(jabber, local, user, body, NULL, NULL, NULL, ev_id, NULL, NULL); + Log(LOG_INFO," Sending to %s as %s", user, local); + + XMPPSendPlain(jabber, local, user, body, "chat", NULL, NULL, ev_id, NULL, NULL); DbUnlock(data->db, ref); Free(chat_id); diff --git a/src/Parsee/User.c b/src/Parsee/User.c index c299417..fb57d15 100644 --- a/src/Parsee/User.c +++ b/src/Parsee/User.c @@ -427,27 +427,9 @@ ParseePushMUC(ParseeData *data, char *room_id, char *jid) } j = DbJson(ref); { - HashMap *table; - table = JsonValueAsObject(HashMapGet(j, "mucs")); - if (!table) - { - table = HashMapCreate(); - } - HashMapSet(table, jid, JsonValueString(chatid)); - HashMapSet(j, "mucs", JsonValueObject(table)); - - - table = JsonValueAsObject(HashMapGet(j, "rooms")); - if (!table) - { - table = HashMapCreate(); - } - HashMapSet(table, room_id, JsonValueString(chatid)); - HashMapSet(j, "rooms", JsonValueObject(table)); - - DbJsonSet(ref, (j = JsonDuplicate(j))); - JsonFree(j); + JsonSet(j, JsonValueString(chatid), 2, "mucs", jid); + JsonSet(j, JsonValueString(chatid), 2, "rooms", room_id); } DbUnlock(data->db, ref); diff --git a/src/Routes/UserAck.c b/src/Routes/UserAck.c index 8208fbf..23ccc52 100644 --- a/src/Routes/UserAck.c +++ b/src/Routes/UserAck.c @@ -51,7 +51,6 @@ RouteHead(RouteRoomAck, arr, argp) char *room = ArrayGet(arr, 0), *muc = NULL, *id = NULL; char *creator = NULL, *muc_name = NULL, *chatid = NULL; - Log(LOG_INFO, "Ack"); response = ASVerifyRequest(args); if (response) @@ -111,7 +110,6 @@ RouteHead(RouteRoomAck, arr, argp) /* Creates a mapping */ chatid = ParseePushMUC(args->data, id, muc); - Log(LOG_INFO, "Chat ID=%s", chatid); response = HashMapCreate(); end: diff --git a/src/XMPP/Stanza.c b/src/XMPP/Stanza.c index e3a73d3..3958f63 100644 --- a/src/XMPP/Stanza.c +++ b/src/XMPP/Stanza.c @@ -196,7 +196,7 @@ XMPPKillThread(XMPPComponent *jabber, char *killer) return; } - pthread_mutex_lock(&jabber->write_lock); + //pthread_mutex_lock(&jabber->write_lock); from = StrConcat(3, killer, "@", jabber->host); message = XMLCreateTag("message"); @@ -211,7 +211,7 @@ XMPPKillThread(XMPPComponent *jabber, char *killer) XMLFreeElement(message); Free(from); - pthread_mutex_unlock(&jabber->write_lock); + //pthread_mutex_unlock(&jabber->write_lock); } bool XMPPIsKiller(XMLElement *stanza) diff --git a/src/XMPPThread.c b/src/XMPPThread.c index a542a23..7901583 100644 --- a/src/XMPPThread.c +++ b/src/XMPPThread.c @@ -18,7 +18,6 @@ AdvertiseSimple("urn:xmpp:reactions:0") \ AdvertiseSimple("urn:xmpp:styling:0") \ AdvertiseSimple("urn:xmpp:reply:0") \ - AdvertiseSimple("urn:xmpp:sid:0") \ AdvertiseSimple("jabber:x:oob") \ AdvertiseSimple("urn:parsee:x-parsee:0") \ AdvertiseSimple("urn:parsee:jealousy:0") @@ -98,6 +97,7 @@ MessageStanza(ParseeData *args, XMLElement *stanza) ASRegisterUser(args->config, encoded); ASSetName(args->config, encoded, res); + ASInvite(args->config, mroom_id, encoded); ASJoin(args->config, mroom_id, encoded); /* Check if it is a media link */ @@ -288,6 +288,7 @@ PresenceStanza(ParseeData *args, XMLElement *stanza) char *jid = item ? HashMapGet(item->attrs, "jid") : NULL; char *oid = HashMapGet(stanza->attrs, "from"); + if (jid) { ParseePushJIDTable(oid, jid); @@ -330,7 +331,6 @@ ParseeXMPPThread(void *argp) from = HashMapGet(stanza->attrs, "from"); if (!strncmp(from, killer, strlen(killer))) { - Log(LOG_INFO, "Killer detected."); XMLFreeElement(stanza); break; } diff --git a/src/include/AS.h b/src/include/AS.h index a33ce86..d910a32 100644 --- a/src/include/AS.h +++ b/src/include/AS.h @@ -29,6 +29,9 @@ extern void ASJoin(const ParseeConfig *, char *, char *); /* Bans from a room a specific user */ extern void ASBan(const ParseeConfig *, char *, char *); +/* Invites from a room a specific user */ +extern void ASInvite(const ParseeConfig *, char *, char *); + /* Finds an event from a room ID and event ID */ extern HashMap * ASFind(const ParseeConfig *, char *, char *);