[ADD/WIP] Temporary vCard avatard

Gajim still reacts weirdly.... also it leaks memory related to avatars,
so that sucks...
This commit is contained in:
LDA 2024-10-02 21:13:28 +02:00
commit d585134ce1
8 changed files with 43 additions and 27 deletions

View file

@ -27,7 +27,7 @@ of Parsee. May occasionally deadlock.
Fixes some media metadata things, replaces the build system, Fixes some media metadata things, replaces the build system,
and speeds up Parsee a tad bit. and speeds up Parsee a tad bit.
#### New things #### New things
- Start dealing with some basic PEP-based avatars. - Start dealing with some basic PEP and vCard-based avatars.
- Allows MbedTLS through a specific Cytoplasm patch. - Allows MbedTLS through a specific Cytoplasm patch.
- Kicking/Banning Parsee from XMPP effectively unlinks it. - Kicking/Banning Parsee from XMPP effectively unlinks it.
- Start adding documentation to Parsee - Start adding documentation to Parsee

View file

@ -63,7 +63,7 @@ CommandHead(CmdPlumb, cmd, argp)
if (chat_id) if (chat_id)
{ {
char *rev = StrConcat(2, muc, "/parsee"); char *rev = StrConcat(2, muc, "/parsee");
XMPPJoinMUC(args->data->jabber, "parsee", rev, false); XMPPJoinMUC(args->data->jabber, "parsee", rev, NULL, false);
Free(rev); Free(rev);
} }

View file

@ -18,7 +18,7 @@ static const char *
GetXMPPInformation(ParseeData *data, HashMap *event, char **from, char **to); GetXMPPInformation(ParseeData *data, HashMap *event, char **from, char **to);
static char * static char *
JoinMUC(ParseeData *data, HashMap *event, char *jid, char *muc, char *name) JoinMUC(ParseeData *data, HashMap *event, char *jid, char *muc, char *name, char *hash)
{ {
char *sender = GrabString(event, 1, "sender"); char *sender = GrabString(event, 1, "sender");
@ -33,7 +33,8 @@ JoinMUC(ParseeData *data, HashMap *event, char *jid, char *muc, char *name)
UnistrFree(uninick); UnistrFree(uninick);
UnistrFree(filtered); UnistrFree(filtered);
while (!XMPPJoinMUC(data->jabber, jid, rev, true) && nonce < 32) /* TODO: vCards! */
while (!XMPPJoinMUC(data->jabber, jid, rev, hash, true) && nonce < 32)
{ {
char *nonce_str = StrInt(nonce); char *nonce_str = StrInt(nonce);
char *input = StrConcat(3, sender, name, nonce_str); char *input = StrConcat(3, sender, name, nonce_str);
@ -101,18 +102,24 @@ ParseeMemberHandler(ParseeData *data, HashMap *event)
else if (StrEquals(membership, "join") && !ParseeIsPuppet(conf, state_key)) else if (StrEquals(membership, "join") && !ParseeIsPuppet(conf, state_key))
{ {
char *jid = ParseeEncodeMXID(state_key); char *jid = ParseeEncodeMXID(state_key);
char *sha = NULL, *mime = NULL;
char *avatar = ASGetAvatar(data->config, room_id, state_key);
char *url = ParseeToUnauth(data, avatar);
chat_id = ParseeGetFromRoomID(data, room_id); chat_id = ParseeGetFromRoomID(data, room_id);
ASGetMIMESHA(data->config, avatar, &mime, &sha);
Free(avatar);
avatar = NULL;
if (chat_id) if (chat_id)
{ {
char *muc = ParseeGetMUCID(data, chat_id); char *muc = ParseeGetMUCID(data, chat_id);
char *name = ASGetName(data->config, room_id, state_key); 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, sha);
char *jabber = JoinMUC(data, event, jid, muc, name); avatar = ASGetAvatar(data->config, room_id, state_key);
Log(LOG_DEBUG, "MATRIX: Joining as '%s' (avatar=%s)", jabber, avatar); Log(LOG_DEBUG, "MATRIX: Joining as '%s' (avatar=%s)", jabber, avatar);
Free(avatar);
Free(jabber); Free(jabber);
Free(avatar);
Free(name); Free(name);
Free(muc); Free(muc);
@ -120,18 +127,14 @@ ParseeMemberHandler(ParseeData *data, HashMap *event)
} }
else else
{ {
char *avatar = ASGetAvatar(data->config, room_id, state_key);
char *sha = NULL, *mime = NULL, *url = NULL;
char *full_jid = StrConcat(3, char *full_jid = StrConcat(3,
jid, "@", data->config->component_host jid, "@", data->config->component_host
); );
XMLElement *elem, *pevent, *items, *item, *meta, *info; XMLElement *elem, *pevent, *items, *item, *meta, *info;
Log(LOG_DEBUG, "MATRIX: Got local user '%s'(mxid=%s avatar=%s)", jid, state_key, avatar); Log(LOG_DEBUG, "MATRIX: Got local user '%s'(mxid=%s)", jid, state_key);
url = ParseeToUnauth(data, avatar);
elem = XMLCreateTag("message"); elem = XMLCreateTag("message");
ASGetMIMESHA(data->config, avatar, &mime, &sha);
{ {
#define PUBSUB "http://jabber.org/protocol/pubsub" #define PUBSUB "http://jabber.org/protocol/pubsub"
#define AVATAR "urn:xmpp:avatar:metadata" #define AVATAR "urn:xmpp:avatar:metadata"
@ -180,13 +183,12 @@ ParseeMemberHandler(ParseeData *data, HashMap *event)
XMLFreeElement(elem); XMLFreeElement(elem);
Free(full_jid); Free(full_jid);
Free(avatar); }
Free(chat_id);
Free(mime); Free(mime);
Free(sha); Free(sha);
Free(url);
}
Free(jid); Free(jid);
Free(chat_id); Free(url);
} }
else if ((StrEquals(membership, "leave") || else if ((StrEquals(membership, "leave") ||
StrEquals(membership, "ban")) StrEquals(membership, "ban"))
@ -343,7 +345,7 @@ GetXMPPInformation(ParseeData *data, HashMap *event, char **from, char **to)
} }
matrix_name = ASGetName(data->config, room_id, matrix_sender); matrix_name = ASGetName(data->config, room_id, matrix_sender);
Free(JoinMUC(data, event, *from, muc_id, matrix_name)); Free(JoinMUC(data, event, *from, muc_id, matrix_name, NULL));
*to = muc_id; *to = muc_id;
Free(matrix_name); Free(matrix_name);
@ -432,7 +434,7 @@ ParseeMessageHandler(ParseeData *data, HashMap *event)
/* TODO: Avoid using the AS endpoints */ /* TODO: Avoid using the AS endpoints */
name = ASGetName(data->config, id, m_sender); name = ASGetName(data->config, id, m_sender);
Free(JoinMUC(data, event, encoded_from, muc_id, name)); Free(JoinMUC(data, event, encoded_from, muc_id, name, NULL));
to = muc_id; to = muc_id;

View file

@ -554,7 +554,7 @@ ParseeSendPresence(ParseeData *data)
char *rev = StrConcat(2, muc, "/parsee"); char *rev = StrConcat(2, muc, "/parsee");
/* Make a fake user join the MUC */ /* Make a fake user join the MUC */
Log(LOG_NOTICE, "Sending presence to %s", rev); Log(LOG_NOTICE, "Sending presence to %s", rev);
XMPPJoinMUC(data->jabber, "parsee", rev, false); XMPPJoinMUC(data->jabber, "parsee", rev, NULL, false);
Free(rev); Free(rev);
} }

View file

@ -131,7 +131,7 @@ RouteHead(RouteRoomAck, arr, argp)
{ {
char *rev = StrConcat(2, muc, "/parsee"); char *rev = StrConcat(2, muc, "/parsee");
Log(LOG_NOTICE, "Sending presence to %s", rev); Log(LOG_NOTICE, "Sending presence to %s", rev);
XMPPJoinMUC(args->data->jabber, "parsee", rev, false); XMPPJoinMUC(args->data->jabber, "parsee", rev, NULL, false);
Free(rev); Free(rev);
} }

View file

@ -168,9 +168,9 @@ XMPPRequestVoice(XMPPComponent *jabber, char *from, char *muc)
Free(identifier); Free(identifier);
} }
bool bool
XMPPJoinMUC(XMPPComponent *comp, char *fr, char *muc, bool care) XMPPJoinMUC(XMPPComponent *comp, char *fr, char *muc, char *hash, bool ret)
{ {
XMLElement *presence, *x, *reply, *history; XMLElement *presence, *x, *reply, *history, *photo;
char *from, *id; char *from, *id;
if (!comp || !fr || !muc) if (!comp || !fr || !muc)
{ {
@ -192,6 +192,16 @@ XMPPJoinMUC(XMPPComponent *comp, char *fr, char *muc, bool care)
XMLAddChild(presence, x); XMLAddChild(presence, x);
XMPPAnnotatePresence(presence); XMPPAnnotatePresence(presence);
if (hash)
{
x = XMLCreateTag("x");
XMLAddAttr(x, "xmlns", "vcard-temp:x:update");
photo = XMLCreateTag("photo");
XMLAddChild(photo, XMLCreateText(hash));
XMLAddChild(x, photo);
XMLAddChild(presence, x);
}
XMLEncode(comp->stream, presence); XMLEncode(comp->stream, presence);
StreamFlush(comp->stream); StreamFlush(comp->stream);
@ -200,7 +210,7 @@ XMPPJoinMUC(XMPPComponent *comp, char *fr, char *muc, bool care)
pthread_mutex_unlock(&comp->write_lock); pthread_mutex_unlock(&comp->write_lock);
if (care && (reply = ParseeAwaitStanza(id, 500))) if (ret && (reply = ParseeAwaitStanza(id, 500)))
{ {
bool exit_code = true; bool exit_code = true;

View file

@ -78,6 +78,7 @@ GenerateAvatarData(ParseeData *data, char *mxid)
end: end:
Free(mime); Free(mime);
Free(out); Free(out);
Free(mxc);
Free(b64); Free(b64);
return elem; return elem;
} }
@ -395,7 +396,7 @@ IQGet(ParseeData *args, XMLElement *stanza, XMPPThread *thr)
char *to_matrix = ParseeGetBridgedUser(args, stanza); char *to_matrix = ParseeGetBridgedUser(args, stanza);
char *name = ASGetName(args->config, NULL, to_matrix); char *name = ASGetName(args->config, NULL, to_matrix);
XMLElement *iqVCard; XMLElement *iqVCard;
Log(LOG_DEBUG, "vCard information GET for %s", to); Log(LOG_DEBUG, "vCard information GET for %s (%s)", to, to_matrix);
if (!strncmp(to, "parsee@", 7)) if (!strncmp(to, "parsee@", 7))
{ {
@ -435,6 +436,9 @@ IQGet(ParseeData *args, XMLElement *stanza, XMPPThread *thr)
return; return;
} }
Free(to_matrix);
to_matrix = ParseeDecodeMXID(to);
iqVCard = XMLCreateTag("iq"); iqVCard = XMLCreateTag("iq");
XMLAddAttr(iqVCard, "from", to); XMLAddAttr(iqVCard, "from", to);
XMLAddAttr(iqVCard, "to", from); XMLAddAttr(iqVCard, "to", from);

View file

@ -30,7 +30,7 @@ extern XMPPComponent * XMPPInitialiseCompStream(char *host, int port);
extern bool XMPPAuthenticateCompStream(XMPPComponent *comp, char *shared); extern bool XMPPAuthenticateCompStream(XMPPComponent *comp, char *shared);
/* Makes a user join/leave a MUC */ /* Makes a user join/leave a MUC */
extern bool XMPPJoinMUC(XMPPComponent *comp, char *fr, char *muc, bool care); extern bool XMPPJoinMUC(XMPPComponent *comp, char *fr, char *muc, char *hash, bool ret);
extern void XMPPLeaveMUC(XMPPComponent *comp, char *fr, char *muc, char *r); extern void XMPPLeaveMUC(XMPPComponent *comp, char *fr, char *muc, char *r);
/* TODO: XMPP stuff, I don't fucking know, I'm not a Jabbernerd. */ /* TODO: XMPP stuff, I don't fucking know, I'm not a Jabbernerd. */