From 7ee5c055f4a8c57146cff6d00a808104ba9fb6c7 Mon Sep 17 00:00:00 2001 From: LDA Date: Wed, 18 Sep 2024 15:39:52 +0200 Subject: [PATCH] [MOD] Actually start noting down presence requests --- build.conf | 1 + src/Signal.c | 4 ++ src/XMPPThread/PEP.c | 1 + src/XMPPThread/PresenceSub.c | 62 +++++++++++++++++++++++++++++++ src/XMPPThread/Stanzas/Presence.c | 10 ++++- src/XMPPThread/internal.h | 4 ++ 6 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 src/XMPPThread/PresenceSub.c diff --git a/build.conf b/build.conf index b3ce98b..ebc5276 100644 --- a/build.conf +++ b/build.conf @@ -6,3 +6,4 @@ SOURCE=src INCLUDES=src/include OBJECT=build CC=cc +CFLAGS=-O3 diff --git a/src/Signal.c b/src/Signal.c index f0f4ee7..89e48e2 100644 --- a/src/Signal.c +++ b/src/Signal.c @@ -22,6 +22,10 @@ SignalHandler(int signal) HttpServerStop(server); return; } + if (signal == SIGPIPE) + { + Log(LOG_DEBUG, "Caught a SIGPIPE..."); + } } bool diff --git a/src/XMPPThread/PEP.c b/src/XMPPThread/PEP.c index c459292..a8868ec 100644 --- a/src/XMPPThread/PEP.c +++ b/src/XMPPThread/PEP.c @@ -58,6 +58,7 @@ IsPubsubRequest(XMLElement *stanza) return false; } + Log(LOG_INFO, "WOAH"); return XMLookForUnique(pubsub, "subscribe"); } diff --git a/src/XMPPThread/PresenceSub.c b/src/XMPPThread/PresenceSub.c new file mode 100644 index 0000000..da070c4 --- /dev/null +++ b/src/XMPPThread/PresenceSub.c @@ -0,0 +1,62 @@ +#include "XMPPThread/internal.h" + +static char * +SubscriptionHash(ParseeData *data, char *from, char *to) +{ + uint8_t *sum; + char *hash; + size_t len; + + len = strlen(from) + 1 + strlen(to); + sum = Malloc(len); + memset(sum, 0x00, len); + memcpy(sum[0], from, strlen(from)): + memcpy(sum[strlen(from) + 1], to, strlen(to)); + + hash = ParseeHMAC(data->id, sum, len); + Free(sum); + + return hash; +} + +void +AddPresenceSubscriber(ParseeData *data, char *from, char *to) +{ + Db *database; + DbRef *ref; + char *hash; + if (!data || !from || !to) + { + return; + } + + database = data->db; + hash = SubscriptionHash(data, from, to); + ref = DbCreate(database, 2, "subscriptions", hash); + + HashMapSet(DbRef(ref), "from", JsonValueString(from)); + HashMapSet(DbRef(ref), "to", JsonValueString(to)); + /* I don't think we need more information right now */ + + DbClose(database, ref); + Free(hash); +} + +bool +IsSubscribed(ParseeData *data, char *user, char *to) +{ + Db *database; + char *hash; + bool ret; + if (!data || !from || !to) + { + return; + } + + database = data->db; + hash = SubscriptionHash(data, from, to); + ret = DbExists(database, 2, "subscriptions", hash); + Free(hash); + + return ret; +} diff --git a/src/XMPPThread/Stanzas/Presence.c b/src/XMPPThread/Stanzas/Presence.c index ed52364..8323f6a 100644 --- a/src/XMPPThread/Stanzas/Presence.c +++ b/src/XMPPThread/Stanzas/Presence.c @@ -65,6 +65,15 @@ PresenceStanza(ParseeData *args, XMLElement *stanza, XMPPThread *thr) XMLElement *status = XMLookForUnique(stanza, "status"); char *oid = HashMapGet(stanza->attrs, "from"); + char *dst = HashMapGet(stanza->attrs, "to"); + char *type = HashMapGet(stanza->attrs, "type"); + + if (StrEquals(type, "subscribe")) + { + Log(LOG_WARNING, "!PRESENCE SUBSCRIPTION REQUEST! (%s:%s)", oid, dst); + AddPresenceSubscriber(args, oid, dst); /* TODO: Send presence updates + * whenever possible. */ + } if (PEPManagerHandle(thr->info->pep_manager, stanza)) { @@ -97,7 +106,6 @@ PresenceStanza(ParseeData *args, XMLElement *stanza, XMPPThread *thr) char *jid = item ? HashMapGet(item->attrs, "jid") : NULL; char *trim = ParseeTrimJID(jid); char *from = NULL; - char *type = HashMapGet(stanza->attrs, "type"); char *room = ParseeGetBridgedRoom(args, stanza); char *decode_from, *real_matrix; char *matrix_user_pl = ParseeEncodeJID(args->config, trim, false); diff --git a/src/XMPPThread/internal.h b/src/XMPPThread/internal.h index 4c39b40..3a158b5 100644 --- a/src/XMPPThread/internal.h +++ b/src/XMPPThread/internal.h @@ -97,3 +97,7 @@ void PEPAvatarEvent(PEPManager *m, XMLElement *stanza, XMLElement *item); void PEPVCardEvent(PEPManager *m, XMLElement *stanza, XMLElement *item); char * ScrambleOID(ParseeData *data, char *opaque_oid); + +/* Presence management */ +void AddPresenceSubscriber(ParseeData *data, char *from, char *to); +bool IsSubscribed(ParseeData *data, char *user, char *to);