[ADD] Respect MIME, start bridging leaves/kicks

Wow, this one _wasn't_ pushed at 3AM, Outstanding.
This commit is contained in:
LDA 2024-07-07 17:30:48 +02:00
commit 43b3f8aaf5
8 changed files with 146 additions and 24 deletions

View file

@ -822,7 +822,7 @@ IQResult(ParseeData *args, XMLElement *stanza)
/* TODO: Bound checks for a size limit. */
bdata = (char *) Base64Decode(base64, b64len);
datastream = StrStreamReaderN(bdata, length);
mxc = ASUpload(args->config, datastream, length);
mxc = ASUpload(args->config, datastream, length, "image/png");
jid = ParseeLookupJID(from);
from_matrix = ParseeEncodeJID(args->config, jid, false);
@ -859,34 +859,65 @@ IQResult(ParseeData *args, XMLElement *stanza)
if (photo)
{
XMLElement *binval = XMLookForUnique(photo, "BINVAL");
XMLElement *data = ArrayGet(binval->children, 0);
XMLElement *type = XMLookForUnique(photo, "TYPE");
XMLElement *data =
binval ? ArrayGet(binval->children, 0) : NULL;
XMLElement *tdata = type ? ArrayGet(type->children, 0) : NULL;
char *base64;
char *bdata;
size_t length, b64len;
Stream *datastream;
char *mxc, *from_matrix, *jid;
char *mxc = NULL, *from_matrix = NULL, *jid = NULL;
char *room = NULL;
if (!data || !data->data)
{
Log(LOG_ERR, "%s NOT FOUND", HashMapGet(stanza->attrs, "from"));
return;
}
/* Get the base64, decode it, and shove it in a nicely put
* MXC address */
base64 = data->data;
b64len = base64 ? strlen(base64) : 0;
length = Base64DecodedSize(base64, b64len);
bdata = Base64Decode(base64, b64len);
datastream = StrStreamReaderN(bdata, length);
mxc = ASUpload(args->config, datastream, length);
jid = ParseeLookupJID(HashMapGet(stanza->attrs, "from"));
from_matrix = ParseeEncodeJID(args->config, jid, false);
ASSetAvatar(args->config, from_matrix, mxc);
/* TODO: Check if already set. */
mxc = ASUpload(
args->config,
datastream,
length,
tdata ? tdata->data : NULL
);
Free(bdata);
StreamClose(datastream);
room = ParseeGetBridgedRoom(args, stanza);
jid = ParseeLookupJID(HashMapGet(stanza->attrs, "from"));
if (jid && !StrEquals(jid, HashMapGet(stanza->attrs, "from")))
{
from_matrix = ParseeEncodeJID(args->config, jid, false);
ASSetAvatar(args->config, from_matrix, mxc);
}
else if (room)
{
char *mask = StrConcat(4,
"@", args->config->sender_localpart,
":", args->config->homeserver_host
);
HashMap *obj = HashMapCreate();
HashMapSet(obj, "url", JsonValueString(mxc));
ASSetState(
args->config,
room, "m.room.avatar", "",
mask, obj
);
Free(mask);
}
Free(from_matrix);
Free(room);
Free(jid);
Free(mxc);
}
@ -1117,7 +1148,7 @@ PresenceStanza(ParseeData *args, XMLElement *stanza)
json = DbJson(avatars);
avatar_id = GrabString(json, 1, oid);
if (StrEquals(avatar_id, p_dat->data))
if (avatar_id && StrEquals(avatar_id, p_dat->data))
{
DbUnlock(args->db, avatars);
return;
@ -1142,6 +1173,24 @@ PresenceStanza(ParseeData *args, XMLElement *stanza)
XMLFreeElement(vcard_request);
Free(from);
}
/* TODO: Sending VCard on presence is slow and stalls the thread */
if (0)
{
XMPPComponent *jabber = args->jabber;
char *from = StrConcat(2, "parsee@", args->config->component_host);
XMLElement *vcard_request = CreateVCardRequest(
from, HashMapGet(stanza->attrs, "from")
);
pthread_mutex_lock(&jabber->write_lock);
XMLEncode(jabber->stream, vcard_request);
StreamFlush(jabber->stream);
pthread_mutex_unlock(&jabber->write_lock);
XMLFreeElement(vcard_request);
Free(from);
}
#undef MUC_USER_NS
}