mirror of
https://forge.fsky.io/lda/Parsee.git
synced 2026-03-13 21:25:11 +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"); \
|
||||
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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue