From 8042ccc0ccb1ec37e87356664e319ba8bd95222b Mon Sep 17 00:00:00 2001 From: LDA Date: Thu, 22 Aug 2024 00:04:50 +0200 Subject: [PATCH] [ADD] Add basic Matrix ID parser --- .gitignore | 3 +++ Makefile | 2 ++ src/MatrixEventHandler.c | 8 +++----- src/MatrixID.c | 34 ++++++++++++++++++++++++++++++++ src/Parsee/User.c | 20 +++++++++++-------- src/XMPP/Component.c | 1 + src/XMPPThread/Stanzas/Message.c | 2 -- src/include/Matrix.h | 15 ++++++++++++++ 8 files changed, 70 insertions(+), 15 deletions(-) create mode 100644 src/MatrixID.c diff --git a/.gitignore b/.gitignore index ff7606f..422a0f1 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,6 @@ tools/out/* ayaya/* ayaya + +#ctags +tags diff --git a/Makefile b/Makefile index 88cfb8d..7236d15 100644 --- a/Makefile +++ b/Makefile @@ -41,6 +41,8 @@ all: binary utils binary: $(OBJ_FILES) $(CC) $(LDFLAGS) $(OBJ_FILES) -o $(BINARY) +tags: + @ctags --recurse $(SOURCE)/ clean: rm -rf $(OBJECT) $(BINARY) $(AYAS) diff --git a/src/MatrixEventHandler.c b/src/MatrixEventHandler.c index 41c229e..effcc45 100644 --- a/src/MatrixEventHandler.c +++ b/src/MatrixEventHandler.c @@ -11,6 +11,8 @@ #include #include +#include + static void JoinMUC(ParseeData *data, HashMap *event, char *jid, char *muc, char *name) { @@ -20,7 +22,7 @@ JoinMUC(ParseeData *data, HashMap *event, char *jid, char *muc, char *name) char *rev = StrConcat(3, muc, "/", nick); int nonce = 0; - while (!XMPPJoinMUC(data->jabber, jid, rev, true) && nonce < 20) + while (!XMPPJoinMUC(data->jabber, jid, rev, true) && nonce < 32) { char *nonce_str = StrInt(nonce); char *input = StrConcat(4, sender, name, data->id, nonce_str); @@ -122,10 +124,6 @@ ParseeMemberHandler(ParseeData *data, HashMap *event) goto end; } - /* TODO: We need to deal with the nick properly, as XMPP - * requires us to provide it whenever we want to even think - * about leaving... - * I love how this is the last place victim of the dreaded [p]... */ name = StrDuplicate(ParseeLookupNick(muc_id, sender)); rev = StrConcat(3, muc_id, "/", name); diff --git a/src/MatrixID.c b/src/MatrixID.c new file mode 100644 index 0000000..4488fd4 --- /dev/null +++ b/src/MatrixID.c @@ -0,0 +1,34 @@ +#include + +#include + +#include + +UserID * +MatrixParseID(char *user) +{ + UserID *ret = NULL; + char *localstart, *serverstart; + if (!user || *user != '@') + { + return NULL; + } + + localstart = user + 1; + serverstart = strchr(user, ':'); + if (!*localstart || !serverstart || localstart == serverstart) + { + return NULL; + } + if (!*++serverstart) + { + return NULL; + } + + ret = Malloc(sizeof(*ret)); + memset(ret, '\0', sizeof(*ret)); + memcpy(ret->localpart, localstart, serverstart - localstart - 1); + memcpy(ret->server, serverstart, strlen(serverstart)); + + return ret; +} diff --git a/src/Parsee/User.c b/src/Parsee/User.c index 9e2ee22..42cfb1b 100644 --- a/src/Parsee/User.c +++ b/src/Parsee/User.c @@ -10,32 +10,36 @@ #include #include +#include + bool ParseeIsPuppet(const ParseeConfig *conf, char *user) { - char *localpart; + UserID *id; bool flag = true; size_t len; - if (!user || !conf || *user != '@') + if (!user || + !conf || + *user != '@' || + !(id = MatrixParseID(user))) { return false; } - localpart = user + 1; len = strlen(conf->namespace_base); - if (strncmp(localpart, conf->namespace_base, len)) + if (strncmp(id->localpart, conf->namespace_base, len)) { flag = false; } - len = strlen(conf->sender_localpart); - if (!strncmp(localpart, conf->sender_localpart, len)) + if (StrEquals(id->localpart, conf->sender_localpart)) { flag = true; } - /* TODO: Check serverpart. 2 Parsee instances may be running in the same - * room. */ + flag = flag && StrEquals(id->server, conf->server_base); + + Free(id); return flag; } char * diff --git a/src/XMPP/Component.c b/src/XMPP/Component.c index b43488b..c44d14b 100644 --- a/src/XMPP/Component.c +++ b/src/XMPP/Component.c @@ -154,6 +154,7 @@ XMPPAuthenticateCompStream(XMPPComponent *comp, char *shared) if (ev->type != XML_LEXER_ELEM || !StrEquals(ev->element, "handshake")) { + Log(LOG_DEBUG, "type=%d elem='%s'", ev->type, ev->element); Log(LOG_ERR, "Excepted empty handshake reply, got nonsense."); Log(LOG_ERR, "Another service (possibly Parsee) may have taken over."); Log(LOG_ERR, ""); diff --git a/src/XMPPThread/Stanzas/Message.c b/src/XMPPThread/Stanzas/Message.c index 1b207b1..230131d 100644 --- a/src/XMPPThread/Stanzas/Message.c +++ b/src/XMPPThread/Stanzas/Message.c @@ -162,7 +162,6 @@ end_error: PEPManagerHandle(thr->info->pep_manager, stanza); - /* TODO: Separate the chatstate processing code. */ ProcessChatstates(args, stanza); to = ParseeDecodeMXID(HashMapGet(stanza->attrs, "to")); @@ -317,7 +316,6 @@ end_error: reaction = ArrayGet(react_child, i); react_data = ArrayGet(reaction->children, 0); - /* TODO: We should manage removed reactions. */ Free(ASSend( args->config, mroom_id, encoded, "m.reaction", diff --git a/src/include/Matrix.h b/src/include/Matrix.h index 3d86abd..0ffb7ec 100644 --- a/src/include/Matrix.h +++ b/src/include/Matrix.h @@ -3,6 +3,21 @@ #include +/* A simple representation of everything. It is not as complex as + * Telodendria's CommonID parser, simply because Parsee does not + * need such complexity. */ +typedef struct UserID { + /* We're being extra leinent. */ + char localpart[256]; + char server[256]; +} UserID; + +/** Parses a Matrix user ID, with no attention to detail. + * ----------- + * Returns: a valid user ID[HEAP] | NULL + * Thrasher: Free */ +extern UserID * MatrixParseID(char *user); + /* Creates an error message JSON, with the specified code and message. */ extern HashMap * MatrixCreateError(char *err, char *msg);