From 9ea8f35c491efd0fc1f355e9accc2bfd88752d8e Mon Sep 17 00:00:00 2001 From: LDA Date: Tue, 1 Oct 2024 06:59:13 +0200 Subject: [PATCH] [ADD/WIP] Try dealing in VCards --- src/MatrixEventHandler.c | 14 ++++++++++++ src/XMPPThread/Stanzas/IQ.c | 38 ++++++++++++++++++++++++++++++++ src/XMPPThread/Stanzas/Message.c | 4 +++- 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/MatrixEventHandler.c b/src/MatrixEventHandler.c index fdb7b7b..163baca 100644 --- a/src/MatrixEventHandler.c +++ b/src/MatrixEventHandler.c @@ -165,6 +165,20 @@ ParseeMemberHandler(ParseeData *data, HashMap *event) ParseeBroadcastStanza(data, full_jid, elem); XMLFreeElement(elem); + elem = XMLCreateTag("presence"); + { + XMLElement *x = XMLCreateTag("x"); + XMLElement *photo; + + XMLAddAttr(x, "xmlns", "vcard-temp:x:update"); + photo = XMLCreateTag("photo"); + XMLAddChild(photo, XMLCreateText(sha)); + XMLAddChild(x, photo); + XMLAddChild(elem, x); + } + ParseeBroadcastStanza(data, full_jid, elem); + XMLFreeElement(elem); + Free(full_jid); Free(avatar); Free(mime); diff --git a/src/XMPPThread/Stanzas/IQ.c b/src/XMPPThread/Stanzas/IQ.c index c6e929f..6ff097c 100644 --- a/src/XMPPThread/Stanzas/IQ.c +++ b/src/XMPPThread/Stanzas/IQ.c @@ -46,6 +46,42 @@ TrimBase64(char *b64) return ret; } +XMLElement * +GenerateAvatarData(ParseeData *data, char *mxid) +{ + char *mxc, *mime = NULL, *out = NULL, *b64 = NULL; + XMLElement *elem = NULL, *type, *binval; + size_t len = 0; + if (!data || !mxid) + { + return NULL; + } + + mxc = ASGetAvatar(data->config, NULL, mxid); + + if (!ASGrab(data->config, mxc, &mime, &out, &len)) + { + goto end; + } + b64 = Base64Encode(out, len); + + elem = XMLCreateTag("PHOTO"); + type = XMLCreateTag("TYPE"); + binval = XMLCreateTag("BINVAL"); + + XMLAddChild(type, XMLCreateText(mime)); + XMLAddChild(binval, XMLCreateText(b64)); + + XMLAddChild(elem, type); + XMLAddChild(elem, binval); + +end: + Free(mime); + Free(out); + Free(b64); + return elem; +} + #define DISCO "http://jabber.org/protocol/disco#info" static XMLElement * IQGenerateQuery(void) @@ -425,6 +461,7 @@ IQGet(ParseeData *args, XMLElement *stanza, XMPPThread *thr) XMLAddChild(vCard, nick); XMLAddChild(vCard, url); XMLAddChild(vCard, fn); + XMLAddChild(vCard, GenerateAvatarData(args, to_matrix)); Free(mto_link); } @@ -435,6 +472,7 @@ IQGet(ParseeData *args, XMLElement *stanza, XMPPThread *thr) XMLEncode(jabber->stream, iqVCard); StreamFlush(jabber->stream); pthread_mutex_unlock(&jabber->write_lock); + XMLFreeElement(iqVCard); Free(to_matrix); Free(name); } diff --git a/src/XMPPThread/Stanzas/Message.c b/src/XMPPThread/Stanzas/Message.c index 7cb82b3..6181616 100644 --- a/src/XMPPThread/Stanzas/Message.c +++ b/src/XMPPThread/Stanzas/Message.c @@ -349,7 +349,9 @@ end_error: * SENT TO NON-PARSEE PUPPETS, AS A "FIX" TO THE MULTITHREADED * ISSUE. * - * I HATE THIS. I NEED TO FIND A BETTER WAY. */ + * I HATE THIS. I NEED TO FIND A BETTER WAY. + * + * Actually, is it even _that_ bad? */ if (!chat && strncmp(HashMapGet(stanza->attrs, "to"), "parsee@", 7)) { goto end;