From 6f045083a2ea3fe17d99b5643c46d38daedc4a1a Mon Sep 17 00:00:00 2001 From: LDA Date: Sat, 20 Jul 2024 17:45:12 +0200 Subject: [PATCH] [ADD/WIP] Dot-separated fetching, respect 'rooms' That should get me to filter events, senders, and other things --- src/Matrix.c | 68 ++++++++++++++++++++++++++++++++++++++++++ src/Routes/RouteSync.c | 16 +++++++++- src/include/Matrix.h | 11 ++++++- 3 files changed, 93 insertions(+), 2 deletions(-) diff --git a/src/Matrix.c b/src/Matrix.c index 7186461..a2fac3f 100644 --- a/src/Matrix.c +++ b/src/Matrix.c @@ -360,3 +360,71 @@ MatrixClientWellKnown(char *base, char *identity) return response; } + +JsonValue * +MatrixGetJSON(HashMap *json, char *string) +{ + JsonValue *retVal; + HashMap *currentObj; + char *field, *fieldTemp; + size_t i, length; + + if (!json || !string) + { + return NULL; + } + + currentObj = json; + retVal = NULL; + length = strlen(string); + field = NULL; + +#define Append(ch) do \ + { \ + char chb[2] = { ch, 0 }; \ + fieldTemp = field; \ + field = StrConcat(2, field, chb); \ + Free(fieldTemp); \ + } while (0) + + /* We include the 0-terminator as a valid separator. */ + for (i = 0; i < length + 1; i++) + { + char currentChar = string[i]; + char escape; + if (currentChar == '\\' && (escape = string[i+1])) + { + if (escape != '.' && escape != '\\') + { + Append('\\'); + } + Append(escape); + i++; + continue; + } + else if (currentChar == '.' || currentChar == '\0') + { + if (!field || !currentObj) + { + Free(field); + return NULL; + } + + retVal = HashMapGet(currentObj, field); + currentObj = JsonValueAsObject(retVal); + + Free(field); + field = NULL; + continue; + } + Append(currentChar); + } +#undef Append + + if (field) + { + /* This is weird. */ + Free(field); + } + return retVal; +} diff --git a/src/Routes/RouteSync.c b/src/Routes/RouteSync.c index 72414a3..3f8a2c0 100644 --- a/src/Routes/RouteSync.c +++ b/src/Routes/RouteSync.c @@ -59,6 +59,7 @@ StripStateEventSync(HashMap *pdu) return ret; } +/* Verify whenever a room is filtered out by a filter given in. */ static bool IsRoomFiltered(Filter *filter, char *roomID) { @@ -77,7 +78,20 @@ IsRoomFiltered(Filter *filter, char *roomID) return true; } } - /* TODO: Consider rooms */ + + count = ArraySize(filter->room.rooms); + if (count) + { + for (i = 0; i < count; i++) + { + char *room = ArrayGet(filter->room.rooms, i); + if (StrEquals(roomID, room)) + { + return false; + } + } + return true; + } return false; } diff --git a/src/include/Matrix.h b/src/include/Matrix.h index 2b18fcb..a8b7011 100644 --- a/src/include/Matrix.h +++ b/src/include/Matrix.h @@ -39,8 +39,9 @@ #include #include -#include #include +#include +#include #include #include @@ -154,4 +155,12 @@ extern HashMap * MatrixRateLimit(HttpServerContext *, Db *); */ extern HashMap * MatrixClientWellKnown(char *, char *); +/** + * Decodes a dot-separated path (as defined by the Specification) and + * tries to retrieve it from a JSON object hashmap, failing with NULL + * if it cannot be found, like Cytoplasm's + * .Fn JsonGet . + */ +extern JsonValue * MatrixGetJSON(HashMap *, char *); + #endif