mirror of
https://forge.fsky.io/lda/Parsee.git
synced 2026-03-13 15:15:10 +00:00
[ADD] Add XMPP commands for managing whitelists
This commit is contained in:
parent
a38e14e029
commit
09d38993bb
2 changed files with 152 additions and 0 deletions
142
src/XMPPCommands/Whitelist.c
Normal file
142
src/XMPPCommands/Whitelist.c
Normal file
|
|
@ -0,0 +1,142 @@
|
||||||
|
#include <Cytoplasm/HashMap.h>
|
||||||
|
#include <Cytoplasm/Memory.h>
|
||||||
|
#include <Cytoplasm/Json.h>
|
||||||
|
#include <Cytoplasm/Util.h>
|
||||||
|
#include <Cytoplasm/Str.h>
|
||||||
|
#include <Cytoplasm/Log.h>
|
||||||
|
|
||||||
|
#include <XMPPFormTool.h>
|
||||||
|
#include <XMPPCommand.h>
|
||||||
|
#include <Parsee.h>
|
||||||
|
#include <XMPP.h>
|
||||||
|
#include <XML.h>
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
@ -28,5 +28,15 @@
|
||||||
XMPPSetFormTitle(cmd, "No-fly addition form"); \
|
XMPPSetFormTitle(cmd, "No-fly addition form"); \
|
||||||
XMPPSetFormInstruction(cmd, "Select a glob pattern to add to the nofly"); \
|
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
|
XMPPCOMMANDS
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue