[MOD] Basic work to get XMPP avatars through PEP

Attaboy!
This commit is contained in:
LDA 2024-09-19 23:24:46 +02:00
commit e54332e376
13 changed files with 428 additions and 25 deletions

View file

@ -16,7 +16,7 @@
static const char *
GetXMPPInformation(ParseeData *data, HashMap *event, char **from, char **to);
static void
static char *
JoinMUC(ParseeData *data, HashMap *event, char *jid, char *muc, char *name)
{
char *sender = GrabString(event, 1, "sender");
@ -50,7 +50,7 @@ JoinMUC(ParseeData *data, HashMap *event, char *jid, char *muc, char *name)
ParseePushNickTable(muc, sender, nick);
Free(nick);
Free(rev);
return (rev);
}
static void
@ -98,13 +98,71 @@ ParseeMemberHandler(ParseeData *data, HashMap *event)
{
char *muc = ParseeGetMUCID(data, chat_id);
char *name = ASGetName(data->config, room_id, state_key);
char *avatar = ASGetAvatar(data->config, room_id, state_key);
char *jabber = JoinMUC(data, event, jid, muc, name);
JoinMUC(data, event, jid, muc, name);
Log(LOG_DEBUG, "MATRIX: Joining as '%s' (avatar=%s)", jabber, avatar);
Free(avatar);
Free(jabber);
Free(name);
Free(muc);
/* TODO: XEP-0084 magic to advertise a new avatar if possible. */
}
else
{
char *avatar = ASGetAvatar(data->config, room_id, state_key);
char *sha = NULL, *mime = NULL, *url = NULL;
char *full_jid = StrConcat(3,
jid, "@", data->config->component_host
);
XMLElement *elem, *pevent, *items, *item, *meta, *info;
Log(LOG_DEBUG, "MATRIX: Got local user '%s'(mxid=%s avatar=%s)", jid, state_key, avatar);
url = ParseeToUnauth(data, avatar);
elem = XMLCreateTag("message");
ASGetMIMESHA(data->config, avatar, &mime, &sha);
{
#define PUBSUB "http://jabber.org/protocol/pubsub"
#define AVATAR "urn:xmpp:avatar:metadata"
pevent = XMLCreateTag("event");
XMLAddAttr(pevent, "xmlns", PUBSUB "#event");
{
items = XMLCreateTag("items");
item = XMLCreateTag("item");
XMLAddAttr(items, "node", AVATAR);
XMLAddAttr(item, "id", sha);
{
meta = XMLCreateTag("metadata");
info = XMLCreateTag("info");
XMLAddAttr(meta, "xmlns", AVATAR);
XMLAddAttr(info, "id", sha);
XMLAddAttr(info, "url", url);
XMLAddAttr(info, "type", mime);
XMLAddChild(meta, info);
XMLAddChild(item, meta);
}
XMLAddChild(items, item);
XMLAddChild(pevent, items);
}
XMLAddChild(elem, pevent);
#undef PUBSUB
}
/* TODO: Broadcast PEP avatar change */
ParseeBroadcastStanza(data, full_jid, elem);
XMLFreeElement(elem);
Free(full_jid);
Free(avatar);
Free(mime);
Free(sha);
Free(url);
}
Free(jid);
Free(chat_id);
}
@ -263,7 +321,7 @@ GetXMPPInformation(ParseeData *data, HashMap *event, char **from, char **to)
}
matrix_name = ASGetName(data->config, room_id, matrix_sender);
JoinMUC(data, event, *from, muc_id, matrix_name);
Free(JoinMUC(data, event, *from, muc_id, matrix_name));
*to = muc_id;
Free(matrix_name);
@ -350,12 +408,8 @@ ParseeMessageHandler(ParseeData *data, HashMap *event)
goto end;
}
/* TODO: Check the name's validity.
* Is there a good way to check for that that isn't
* just "await on join and try again?" */
name = ASGetName(data->config, id, m_sender);
JoinMUC(data, event, encoded_from, muc_id, name);
Free(JoinMUC(data, event, encoded_from, muc_id, name));
to = muc_id;