From 063314b0816acb8443b5db42130ff5806b7ff673 Mon Sep 17 00:00:00 2001 From: LDA Date: Thu, 29 Aug 2024 23:47:31 +0200 Subject: [PATCH] [MOD] Cache XEP-0421 support --- src/Parsee/Data.c | 5 +++++ src/Routes/Root.c | 8 +++++++- src/XMPPThread/Bridged.c | 20 ++++++++++++++++++-- src/include/Parsee.h | 3 +++ 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/Parsee/Data.c b/src/Parsee/Data.c index 5a3257c..bcfd7e3 100644 --- a/src/Parsee/Data.c +++ b/src/Parsee/Data.c @@ -27,6 +27,9 @@ ParseeInitData(XMPPComponent *comp) data->jabber = comp; data->handler = CommandCreateRouter(); + data->oid_servers = HashMapCreate(); + pthread_mutex_init(&data->oidl, NULL); + if (data->config->db_size) { data->db = DbOpenLMDB(data->config->db_path, data->config->db_size); @@ -71,6 +74,8 @@ ParseeFreeData(ParseeData *data) return; } + HashMapFree(data->oid_servers); + pthread_mutex_destroy(&data->oidl); Free(data->id); XMPPEndCompStream(data->jabber); DbClose(data->db); diff --git a/src/Routes/Root.c b/src/Routes/Root.c index 56e462e..8a0f319 100644 --- a/src/Routes/Root.c +++ b/src/Routes/Root.c @@ -48,7 +48,13 @@ GetRandomQuote(void) "XMPP kinda sucks.", "Matrix kinda sucks.", - "Throw jabs!" + "Throw jabs!", + "'Won't you hold my <presence/> safe?' - Kanako", + + NAME ": the federated world's little little kobashi", + + "Go take a look at your stanzas!", + "Go take a look at your objects!" }; const size_t count = sizeof(quotes)/sizeof(*quotes); diff --git a/src/XMPPThread/Bridged.c b/src/XMPPThread/Bridged.c index 5ec2b27..b8c9a3a 100644 --- a/src/XMPPThread/Bridged.c +++ b/src/XMPPThread/Bridged.c @@ -123,7 +123,7 @@ ServerHasXEP421(ParseeData *data, char *from) { char *server = NULL, *parsee; XMLElement *disco; - bool ret; + bool ret = false; if (!data || !from) { return false; @@ -138,17 +138,33 @@ ServerHasXEP421(ParseeData *data, char *from) { server++; } - server = StrDuplicate(server); + server = StrDuplicate(server); if (strchr(server, '/')) { *(strchr(server, '/')) = '\0'; } + pthread_mutex_lock(&data->oidl); + ret = HashMapGet(data->oid_servers, server); + pthread_mutex_unlock(&data->oidl); + if (ret) + { + Log(LOG_DEBUG, "XEP-0421 is cached for '%s'", server); + Free(server); + return ret; + } + parsee = ParseeJID(data); disco = XMPPSendDisco(data->jabber, parsee, server); ret = XMPPDiscoAdvertises(disco, "urn:xmpp:occupant-id:0"); + if (ret) + { + pthread_mutex_lock(&data->oidl); + HashMapSet(data->oid_servers, server, server); + pthread_mutex_unlock(&data->oidl); + } XMLFreeElement(disco); Free(parsee); diff --git a/src/include/Parsee.h b/src/include/Parsee.h index 8182675..0c8eb31 100644 --- a/src/include/Parsee.h +++ b/src/include/Parsee.h @@ -63,6 +63,9 @@ typedef struct ParseeData { char *id; int verbosity; + + HashMap *oid_servers; + pthread_mutex_t oidl; } ParseeData; typedef struct Argument {