diff --git a/CHANGELOG.md b/CHANGELOG.md index 2092d1f..b95b8f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,7 +30,9 @@ and speeds up Parsee a tad bit. - Start dealing with some basic PEP-based avatars. - Allows MbedTLS through a specific Cytoplasm patch. - Kicking/Banning Parsee from XMPP effectively unlinks it. -- Start adding documentation to Parsee; +- Start adding documentation to Parsee +- Add MUC whitelists for plumbing, alongside a `whitelist` tool + #### Bugfixes - Adds more information to media events so that clients can behave. diff --git a/src/Commands/Plumb.c b/src/Commands/Plumb.c index e3c4ff3..8d94dfc 100644 --- a/src/Commands/Plumb.c +++ b/src/Commands/Plumb.c @@ -24,7 +24,8 @@ CommandHead(CmdPlumb, cmd, argp) BotRequired(room); /* Check MUC viability */ - if (ParseeManageBan(args->data, muc, NULL)) + if (ParseeManageBan(args->data, muc, NULL) || + ParseeIsMUCWhitelisted(args->data, muc)) { ReplySprintf("MUC '%s' is not allowed on this bridge.", muc); goto end; diff --git a/src/Parsee/Data.c b/src/Parsee/Data.c index 0db1436..87b2263 100644 --- a/src/Parsee/Data.c +++ b/src/Parsee/Data.c @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -573,3 +574,37 @@ ParseeUnlinkRoom(ParseeData *data, char *chat_id) Free(muc); Free(room); } +bool +ParseeIsMUCWhitelisted(ParseeData *data, char *muc) +{ + char *server, *serv_start; + DbRef *ref; + bool ret; + if (!data || !muc) + { + return false; + } + + if (!DbExists(data->db, 1, "whitelist")) + { + return true; + } + + serv_start = strchr(muc, '@'); + serv_start = serv_start ? serv_start : muc; + server = StrDuplicate(serv_start + 1); + if (strchr(server, '/')) + { + *(strchr(server, '/')) = '\0'; + } + + ref = DbLockIntent(data->db, + DB_HINT_READONLY, + 1, "whitelist" + ); + ret = HashMapGet(DbJson(ref), server); + DbUnlock(data->db, ref); + Free(server); + + return ret; +} diff --git a/src/Routes/UserAck.c b/src/Routes/UserAck.c index 9bb17e2..828be65 100644 --- a/src/Routes/UserAck.c +++ b/src/Routes/UserAck.c @@ -67,7 +67,8 @@ RouteHead(RouteRoomAck, arr, argp) } muc = ParseeDecodeLocalMUC(args->data->config, room); - if (ParseeManageBan(args->data, muc, NULL)) + if (ParseeManageBan(args->data, muc, NULL) || + ParseeIsMUCWhitelisted(args->data, muc)) { HttpResponseStatus(args->ctx, HTTP_METHOD_NOT_ALLOWED); response = MatrixCreateError( diff --git a/src/include/Parsee.h b/src/include/Parsee.h index 1873dae..158f563 100644 --- a/src/include/Parsee.h +++ b/src/include/Parsee.h @@ -420,4 +420,10 @@ extern void ParseeBroadcastStanza(ParseeData *data, char *from, XMLElement *s); * Returns: NOTHING */ extern void ParseeUnlinkRoom(ParseeData *data, char *chat_id); +/** Verifies if there is no whitelists OR that a MUC's server is whitelisted. + * ---------------------- + * Returns: if a MUC is to be allowed + * Modifies: NOTHING */ +extern bool ParseeIsMUCWhitelisted(ParseeData *data, char *muc); + #endif