[MOD] Add x-parsee tag with metadata, global nicks

Still need to grab it on the room-level from the room state if possible,
otherwise just rollback to the MXID.

I also need to consider profile pictures and bridging media, and check
if the nick was present XMPP-side first, as that can and will cause
issues, especially around semi-anonymous MUCs.
This commit is contained in:
LDA 2024-06-22 22:43:58 +02:00
commit b820a441ed
9 changed files with 102 additions and 6 deletions

View file

@ -7,6 +7,7 @@
# =========================== Parsee Flags =============================
NAME=Parsee
VERSION=0.0.0
REPOSITORY=$(shell git remote get-url origin)
# =========================== Compilation Flags ============================
CYTO_INC=/usr/local/include/ # Where Cytoplasm's include path is
@ -18,7 +19,7 @@ SOURCE=src
OBJECT=build
INCLUDES=src/include
CC=cc
CFLAGS=-I$(INCLUDES) -I$(CYTO_INC) -DNAME="\"$(NAME)\"" -DVERSION="\"$(VERSION)\"" -g -ggdb
CFLAGS=-I$(INCLUDES) -I$(CYTO_INC) -DNAME="\"$(NAME)\"" -DVERSION="\"$(VERSION)\"" -DREPOSITORY=\"$(REPOSITORY)\" -g -ggdb
LDFLAGS=-L $(CYTO_LIB) -lCytoplasm -Wl,--export-dynamic
BINARY=parsee
# ============================ Compilation =================================

View file

@ -280,3 +280,44 @@ ASSetName(const ParseeConfig *conf, char *user, char *name)
JsonFree(json);
Free(user);
}
char *
ASGetName(const ParseeConfig *c, char *room, char *user)
{
HttpClientContext *ctx;
HashMap *reply;
char *path, *ret;
if (!c || !user)
{
return NULL;
}
if (!room)
{
user = HttpUrlEncode(user);
path = StrConcat(3,
"/_matrix/client/v3/profile/", user, "/displayname"
);
ctx = ParseeCreateRequest(c, HTTP_GET, path);
Free(user);
ASAuthenticateRequest(c, ctx);
HttpRequestSendHeaders(ctx);
HttpRequestSend(ctx);
reply = JsonDecode(HttpClientStream(ctx));
JsonFree(reply);
ret = StrDuplicate(
JsonValueAsString(HashMapGet(reply, "displayname"))
);
HttpClientContextFree(ctx);
Free(path);
if (!ret)
{
ret = StrDuplicate(user);
}
return ret;
}
return NULL;
}

View file

@ -29,6 +29,9 @@ SignalHandler(int signal)
{
case SIGPIPE:
return;
case SIGUSR1:
/* TODO: Soft-restart everything */
return;
case SIGTERM:
case SIGINT:
if (!server)
@ -127,7 +130,7 @@ Main(void)
SIGACTION(SIGINT, &sigAction, NULL);
SIGACTION(SIGTERM, &sigAction, NULL);
SIGACTION(SIGPIPE, &sigAction, NULL);
SIGACTION(SIGUSR1, &sigAction, NULL);
SIGACTION(SIGUSR1, &sigAction, NULL); /* Make USR1 do a softrestart */
#undef SIGACTION
server = HttpServerCreate(&conf);

View file

@ -104,10 +104,13 @@ ParseeMessageHandler(ParseeData *data, HashMap *event)
}
jid = ParseeEncodeMXID(sender);
{
char *rev = StrConcat(3, muc_id, "/", jid);
/* TODO: Check the name's validity */
char *name = ASGetName(data->config, NULL, sender);
char *rev = StrConcat(3, muc_id, "/", name);
XMPPJoinMUC(jabber, jid, rev);
XMPPSendPlain(jabber, jid, muc_id, body, "groupchat");
Free(rev);
Free(name);
}
Free(chat_id);
Free(muc_id);

View file

@ -613,6 +613,11 @@ XMLDecodeString(char *s)
cs[0] = '\'';
s += 6;
}
else if (!strncmp(s, """, 6))
{
cs[0] = '"';
s += 6;
}
else if (!strncmp(s, "<", 4))
{
cs[0] = '<';
@ -632,6 +637,7 @@ XMLDecodeString(char *s)
{
s++;
}
/* TODO: Support hexcodes */
tmp = ret;
ret = StrConcat(2, ret, cs);

View file

@ -9,7 +9,7 @@
void
XMPPSendPlain(XMPPComponent *comp, char *fr, char *to, char *msg, char *type)
{
XMLElement *message, *body, *data;
XMLElement *message, *body, *data, *parsee;
char *from;
if (!comp || !fr || !to || !msg)
{
@ -24,7 +24,32 @@ XMPPSendPlain(XMPPComponent *comp, char *fr, char *to, char *msg, char *type)
body = XMLCreateTag("body");
data = XMLCreateText(msg);
/* TODO: Add Parsee specific fields here */
parsee = XMLCreateTag("x-parsee");
{
XMLElement *parsee_version, *ver_elem;
XMLElement *parsee_link, *link_elem;
XMLElement *parsee_text, *text_elem;
parsee_version = XMLCreateTag("version");
ver_elem = XMLCreateText(VERSION);
XMLAddChild(parsee_version, ver_elem);
XMLAddChild(parsee, parsee_version);
parsee_link = XMLCreateTag("repository");
link_elem = XMLCreateText(REPOSITORY);
XMLAddChild(parsee_link, link_elem);
XMLAddChild(parsee, parsee_link);
parsee_text = XMLCreateTag("zayds-note");
text_elem = XMLCreateText("\"LDA HANG YOURSELF\" - Zayd");
XMLAddChild(parsee_text, text_elem);
XMLAddChild(parsee, parsee_text);
/* TODO: Add custom fields depending on the caller's wishes */
}
XMLAddChild(message, body);
XMLAddChild(message, parsee);
XMLAddChild(body, data);
XMLEncode(comp->stream, message);
@ -122,3 +147,13 @@ XMPPIsKiller(XMLElement *stanza)
return StrEquals( HashMapGet(stanza->attrs, "from"),
HashMapGet(stanza->attrs, "to"));
}
bool
XMPPIsParseeStanza(XMLElement *stanza)
{
if (!stanza)
{
return false;
}
return !!XMLookForUnique(stanza, "x-parsee");
}

View file

@ -102,7 +102,7 @@ ParseeXMPPThread(void *argp)
{
ParseeDMHandler(room, from_matrix, data, args->config);
}
if (mroom_id && !ParseeIsJabberPuppet(args->config, from))
if (mroom_id && !XMPPIsParseeStanza(stanza))
{
char *res = ParseeGetResource(from);
char *encoded = ParseeEncodeJID(args->config, from, false);
@ -113,8 +113,8 @@ ParseeXMPPThread(void *argp)
if (ParseeVerifyStanza(args, chat_id, s_id_str))
{
ASRegisterUser(args->config, encoded);
ASJoin(args->config, mroom_id, encoded);
ASSetName(args->config, encoded, res);
ASJoin(args->config, mroom_id, encoded);
ASSend(
args->config, mroom_id, encoded,
"m.room.message", MatrixCreateMessage(data->data)

View file

@ -39,4 +39,8 @@ extern char * ASCreateRoom(const ParseeConfig *c, char *by, char *alias);
/* Sets a user's displayname */
extern void ASSetName(const ParseeConfig *c, char *user, char *name);
/* Returns the user's name in a room, or a copy of the MXID itself, to be
* Free'd. */
extern char * ASGetName(const ParseeConfig *c, char *room, char *user);
#endif

View file

@ -52,4 +52,7 @@ extern bool XMPPQueryMUC(XMPPComponent *jabber, char *muc, MUCInfo *out);
extern char * XMPPGetMUCName(MUCInfo info);
extern void XMPPFreeMUCInfo(MUCInfo info);
/* Checks if a stanza has an x-parsee element */
extern bool XMPPIsParseeStanza(XMLElement *);
#endif