From 09d38993bb9da1caaf09218d8928f478e84e71da Mon Sep 17 00:00:00 2001 From: LDA Date: Sun, 29 Sep 2024 09:37:46 +0200 Subject: [PATCH] [ADD] Add XMPP commands for managing whitelists --- src/XMPPCommands/Whitelist.c | 142 +++++++++++++++++++++++++++++++++++ src/include/XMPPCommands.x.h | 10 +++ 2 files changed, 152 insertions(+) create mode 100644 src/XMPPCommands/Whitelist.c diff --git a/src/XMPPCommands/Whitelist.c b/src/XMPPCommands/Whitelist.c new file mode 100644 index 0000000..8e097a8 --- /dev/null +++ b/src/XMPPCommands/Whitelist.c @@ -0,0 +1,142 @@ +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +void +ClearWhitelistCallback(XMPPCommandManager *m, char *from, XMLElement *form, XMLElement *out) +{ + ParseeData *data = XMPPGetManagerCookie(m); + char *trimmed = ParseeTrimJID(from); + + if (!ParseeIsAdmin(data, trimmed)) + { + SetNote("error", "User is not authorised to execute command."); + + Free(trimmed); + return; + } + Free(trimmed); + + if (!DbDelete(data->db, 1, "whitelist")) + { + SetNote("error", "Parsee whitelist was non-existent or could not be removed."); + return; + } + /* TODO: Cleanup old sessions? */ + SetNote("info", "Parsee whitelist was removed."); + + (void) form; +} +void +AddWhitelistCallback(XMPPCommandManager *m, char *from, XMLElement *form, XMLElement *out) +{ + ParseeData *data = XMPPGetManagerCookie(m); + char *trimmed = ParseeTrimJID(from); + char *entity = NULL; + DbRef *ref; + + GetFieldValue(entity, "entity", form); + + if (!ParseeIsAdmin(data, trimmed)) + { + SetNote("error", "User is not authorised to execute command."); + + Free(trimmed); + return; + } + if (!entity) + { + SetNote("error", "No entity found."); + Free(trimmed); + return; + } + + Free(trimmed); + + ref = DbLock(data->db, 1, "whitelist"); + if (!ref) + { + ref = DbCreate(data->db, 1, "whitelist"); + } + if (!ref) + { + SetNote("error", "Couldn't get a database entry. You're cooked."); + return; + } + JsonValueFree(HashMapSet( + DbJson(ref), + entity, JsonValueObject(HashMapCreate()) + )); + DbUnlock(data->db, ref); + + SetNote("info", "Server successfully whitelisted."); +} +void +WhitelistCallback(XMPPCommandManager *m, char *from, XMLElement *form, XMLElement *out) +{ + ParseeData *data = XMPPGetManagerCookie(m); + char *trimmed = ParseeTrimJID(from); + XMLElement *x; + XMLElement *title; + XMLElement *reported, *item, *field, *value, *txt; + + if (!ParseeIsAdmin(data, trimmed)) + { + SetNote("error", "User is not authorised to execute command."); + + Free(trimmed); + return; + } + + x = XMLCreateTag("x"); + XMLAddAttr(x, "xmlns", "jabber:x:data"); + title = XMLCreateTag("title"); + XMLAddChild(x, title); + XMLAddChild(out, x); + + Free(trimmed); + + SetTitle(x, NAME " chat whitelist"); + + XMLAddAttr(x, "type", "result"); + { + DbRef *ref = DbLock(data->db, 1, "whitelist"); + HashMap *obj; + char *serv; + JsonValue *obj_val; + reported = XMLCreateTag("reported"); + XMLAddChild(x, reported); + + if (!ref) + { + ref = DbCreate(data->db, 1, "global_bans"); + } + + obj = DbJson(ref); + + /* Report */ + Report("server", "Allowed servers"); + + /* Set */ + while (HashMapIterate(obj, &serv, (void **) &obj_val)) + { + BeginItem(); + SetField("server", serv); + EndItem(); + + (void) obj_val; + } + DbUnlock(data->db, ref); + } + + (void) form; +} diff --git a/src/include/XMPPCommands.x.h b/src/include/XMPPCommands.x.h index d305340..eaeb5b9 100644 --- a/src/include/XMPPCommands.x.h +++ b/src/include/XMPPCommands.x.h @@ -28,5 +28,15 @@ XMPPSetFormTitle(cmd, "No-fly addition form"); \ XMPPSetFormInstruction(cmd, "Select a glob pattern to add to the nofly"); \ }) \ + XMPP_COMMAND(ClearWhitelistCallback, "clear-wl", "Removes the chat whitelist", {}) \ + XMPP_COMMAND(AddWhitelistCallback, "add-wl", "Adds server to chat whitelist", { \ + XMPPOption *serv = XMPPCreateText(true, "entity", ""); \ + XMPPSetDescription(serv, "Server to mark as admin"); \ + XMPPAddOption(cmd, serv); \ + \ + XMPPSetFormTitle(cmd, "Chatlist addition form"); \ + XMPPSetFormInstruction(cmd, "Add a server to whitelist"); \ + }) \ + XMPP_COMMAND(WhitelistCallback, "wl", "Get Parsee's chat whitelist", {}) \ XMPPCOMMANDS