mirror of
https://forge.fsky.io/lda/Parsee.git
synced 2026-03-13 18:25:10 +00:00
[ADD/WIP] No-fly list for Matrix users
Imagine being in Parsee jail.
This commit is contained in:
parent
46489b50e6
commit
f434f7aa87
4 changed files with 120 additions and 20 deletions
|
|
@ -105,6 +105,8 @@ ParseeBotHandler(ParseeData *data, HashMap *event)
|
||||||
}
|
}
|
||||||
body++;
|
body++;
|
||||||
#define BAN_USER "ban-user "
|
#define BAN_USER "ban-user "
|
||||||
|
#define BAN_LIST "ban-list "
|
||||||
|
#define LS_USERS "ls-flying"
|
||||||
if (!strncmp(body, BAN_USER, strlen(BAN_USER)))
|
if (!strncmp(body, BAN_USER, strlen(BAN_USER)))
|
||||||
{
|
{
|
||||||
char user[256] = { 0 };
|
char user[256] = { 0 };
|
||||||
|
|
@ -126,6 +128,54 @@ ParseeBotHandler(ParseeData *data, HashMap *event)
|
||||||
));
|
));
|
||||||
Free(msg);
|
Free(msg);
|
||||||
}
|
}
|
||||||
|
else if (!strncmp(body, LS_USERS, strlen(LS_USERS)))
|
||||||
|
{
|
||||||
|
DbRef *listed = DbLock(data->db, 1, "global_bans");
|
||||||
|
HashMap *json = DbJson(listed);
|
||||||
|
char *str = NULL, *tmp = NULL, *banned;
|
||||||
|
JsonValue *val;
|
||||||
|
|
||||||
|
while (HashMapIterate(json, &banned, (void **) &val))
|
||||||
|
{
|
||||||
|
tmp = str;
|
||||||
|
str = StrConcat(4, str, "- ", banned, "\n");
|
||||||
|
Free(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
Free(ASSend(
|
||||||
|
data->config, id, profile,
|
||||||
|
"m.room.message",
|
||||||
|
MatrixCreateNotice("No-fly listed users:")
|
||||||
|
));
|
||||||
|
Free(ASSend(
|
||||||
|
data->config, id, profile,
|
||||||
|
"m.room.message",
|
||||||
|
MatrixCreateNotice(str)
|
||||||
|
));
|
||||||
|
|
||||||
|
Free(str);
|
||||||
|
DbUnlock(data->db, listed);
|
||||||
|
}
|
||||||
|
else if (!strncmp(body, BAN_LIST, strlen(BAN_LIST)))
|
||||||
|
{
|
||||||
|
char user[256] = { 0 };
|
||||||
|
char *msg;
|
||||||
|
|
||||||
|
body += strlen(BAN_USER);
|
||||||
|
if (sscanf(body, "%255s", &user) != 1)
|
||||||
|
{
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
msg = StrConcat(3, "Banning '", user, "'...");
|
||||||
|
Free(ASSend(
|
||||||
|
data->config, id, profile,
|
||||||
|
"m.room.message",
|
||||||
|
MatrixCreateNotice(msg)
|
||||||
|
));
|
||||||
|
Free(msg);
|
||||||
|
ParseeGlobalBan(data, user);
|
||||||
|
}
|
||||||
end:
|
end:
|
||||||
Free(profile);
|
Free(profile);
|
||||||
}
|
}
|
||||||
|
|
@ -155,7 +205,8 @@ ParseeMessageHandler(ParseeData *data, HashMap *event)
|
||||||
direct = JsonValueAsBoolean(HashMapGet(json, "is_direct"));
|
direct = JsonValueAsBoolean(HashMapGet(json, "is_direct"));
|
||||||
DbUnlock(data->db, ref);
|
DbUnlock(data->db, ref);
|
||||||
|
|
||||||
if (ParseeIsPuppet(data->config, sender))
|
if (ParseeIsPuppet(data->config, sender) ||
|
||||||
|
ParseeManageBan(data, sender, id))
|
||||||
{
|
{
|
||||||
Free(chat_id);
|
Free(chat_id);
|
||||||
Free(reply_id);
|
Free(reply_id);
|
||||||
|
|
|
||||||
|
|
@ -102,9 +102,9 @@ ParseeCleanup(void *datp)
|
||||||
} \
|
} \
|
||||||
while (0)
|
while (0)
|
||||||
|
|
||||||
CleanupField(stanza, 15 MINUTES);
|
CleanupField(stanza, 1 HOURS);
|
||||||
CleanupField(event, 15 MINUTES);
|
CleanupField(event, 1 HOURS);
|
||||||
CleanupField(id, 15 MINUTES);
|
CleanupField(id, 1 HOURS);
|
||||||
|
|
||||||
DbUnlock(data->db, ref);
|
DbUnlock(data->db, ref);
|
||||||
}
|
}
|
||||||
|
|
@ -516,3 +516,48 @@ end:
|
||||||
DbUnlock(data->db, ref);
|
DbUnlock(data->db, ref);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
void
|
||||||
|
ParseeGlobalBan(ParseeData *data, char *user)
|
||||||
|
{
|
||||||
|
DbRef *ref;
|
||||||
|
HashMap *j;
|
||||||
|
if (!data || !user)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ref = DbLock(data->db, 1, "global_bans");
|
||||||
|
if (!ref)
|
||||||
|
{
|
||||||
|
ref = DbCreate(data->db, 1, "global_bans");
|
||||||
|
}
|
||||||
|
|
||||||
|
j = DbJson(ref);
|
||||||
|
|
||||||
|
JsonValueFree(HashMapSet(j, user, JsonValueObject(HashMapCreate())));
|
||||||
|
|
||||||
|
DbUnlock(data->db, ref);
|
||||||
|
}
|
||||||
|
bool
|
||||||
|
ParseeManageBan(ParseeData *data, char *user, char *room)
|
||||||
|
{
|
||||||
|
DbRef *ref;
|
||||||
|
HashMap *j;
|
||||||
|
bool banned;
|
||||||
|
if (!data || !user)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ref = DbLock(data->db, 1, "global_bans");
|
||||||
|
j = DbJson(ref);
|
||||||
|
banned = !!HashMapGet(j, user);
|
||||||
|
DbUnlock(data->db, ref);
|
||||||
|
|
||||||
|
if (banned && room)
|
||||||
|
{
|
||||||
|
ASBan(data->config, room, user);
|
||||||
|
}
|
||||||
|
|
||||||
|
return banned;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,16 @@
|
||||||
#include <XML.h>
|
#include <XML.h>
|
||||||
#include <AS.h>
|
#include <AS.h>
|
||||||
|
|
||||||
|
#define IQ_ADVERT \
|
||||||
|
AdvertiseSimple("http://jabber.org/protocol/chatstates") \
|
||||||
|
AdvertiseSimple("urn:xmpp:message-correct:0") \
|
||||||
|
AdvertiseSimple("urn:xmpp:reactions:0") \
|
||||||
|
AdvertiseSimple("urn:xmpp:styling:0") \
|
||||||
|
AdvertiseSimple("urn:xmpp:reply:0") \
|
||||||
|
AdvertiseSimple("urn:xmpp:sid:0") \
|
||||||
|
AdvertiseSimple("jabber:x:oob") \
|
||||||
|
AdvertiseSimple("urn:parsee:x-parsee:0") \
|
||||||
|
AdvertiseSimple("urn:parsee:jealousy:0")
|
||||||
|
|
||||||
static pthread_mutex_t cond_var_lock = PTHREAD_MUTEX_INITIALIZER;
|
static pthread_mutex_t cond_var_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||||
static pthread_cond_t cond_var = PTHREAD_COND_INITIALIZER;
|
static pthread_cond_t cond_var = PTHREAD_COND_INITIALIZER;
|
||||||
|
|
@ -59,7 +69,6 @@ MessageStanza(ParseeData *args, XMLElement *stanza)
|
||||||
room = ParseeFindDMRoom(args, to, from);
|
room = ParseeFindDMRoom(args, to, from);
|
||||||
data = ArrayGet(body->children, 0);
|
data = ArrayGet(body->children, 0);
|
||||||
|
|
||||||
/* TODO: Consider having rich messages. */
|
|
||||||
chat_id = ParseeGetFromMUCID(args, from);
|
chat_id = ParseeGetFromMUCID(args, from);
|
||||||
mroom_id = ParseeGetRoomID(args, chat_id);
|
mroom_id = ParseeGetRoomID(args, chat_id);
|
||||||
if (room)
|
if (room)
|
||||||
|
|
@ -76,7 +85,6 @@ MessageStanza(ParseeData *args, XMLElement *stanza)
|
||||||
char *event_id = NULL;
|
char *event_id = NULL;
|
||||||
char *replaced = XMPPGetReplacedID(stanza);
|
char *replaced = XMPPGetReplacedID(stanza);
|
||||||
|
|
||||||
/* TODO: Create smarter puppet names */
|
|
||||||
if (ParseeVerifyStanza(args, chat_id, s_id_str) && !replaced)
|
if (ParseeVerifyStanza(args, chat_id, s_id_str) && !replaced)
|
||||||
{
|
{
|
||||||
XMLElement *oob, *oob_data;
|
XMLElement *oob, *oob_data;
|
||||||
|
|
@ -203,18 +211,10 @@ IQDiscoGet(ParseeData *args, XMPPComponent *jabber, XMLElement *stanza)
|
||||||
XMLAddAttr(feature, "var", f); \
|
XMLAddAttr(feature, "var", f); \
|
||||||
XMLAddChild(query, feature); \
|
XMLAddChild(query, feature); \
|
||||||
} \
|
} \
|
||||||
while (0)
|
while (0);
|
||||||
|
|
||||||
AdvertiseSimple("urn:xmpp:message-correct:0");
|
|
||||||
AdvertiseSimple("urn:xmpp:reactions:0");
|
|
||||||
AdvertiseSimple("urn:xmpp:styling:0");
|
|
||||||
AdvertiseSimple("urn:xmpp:reply:0");
|
|
||||||
AdvertiseSimple("urn:xmpp:sid:0");
|
|
||||||
AdvertiseSimple("jabber:x:oob");
|
|
||||||
|
|
||||||
AdvertiseSimple("urn:parsee:x-parsee:0");
|
|
||||||
AdvertiseSimple("urn:parsee:jealousy:0");
|
|
||||||
/* TODO: Advertise more things */
|
/* TODO: Advertise more things */
|
||||||
|
IQ_ADVERT
|
||||||
#undef AdvertiseSimple
|
#undef AdvertiseSimple
|
||||||
}
|
}
|
||||||
XMLAddChild(iq_reply, query);
|
XMLAddChild(iq_reply, query);
|
||||||
|
|
@ -271,10 +271,6 @@ PresenceStanza(ParseeData *args, XMLElement *stanza)
|
||||||
{
|
{
|
||||||
ParseePushJIDTable(oid, jid);
|
ParseePushJIDTable(oid, jid);
|
||||||
}
|
}
|
||||||
/* TODO: Make proper mapping in some sort of soft-DB.
|
|
||||||
* I am saying soft-DB, because this does not need to be
|
|
||||||
* stored inside the actual database, as we retrieve it at
|
|
||||||
* startup everytime from the service anyways. */
|
|
||||||
}
|
}
|
||||||
#undef MUC_USER_NS
|
#undef MUC_USER_NS
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -184,4 +184,12 @@ extern void ParseeInitialiseJIDTable(void);
|
||||||
extern void ParseePushJIDTable(char *muc, char *bare);
|
extern void ParseePushJIDTable(char *muc, char *bare);
|
||||||
extern char *ParseeLookupJID(char *muc);
|
extern char *ParseeLookupJID(char *muc);
|
||||||
extern void ParseeDestroyJIDTable(void);
|
extern void ParseeDestroyJIDTable(void);
|
||||||
|
|
||||||
|
/* Globally bans a Matrix user from ever interacting with Parsee, and bans
|
||||||
|
* them from bridged rooms where the bot has administrator. */
|
||||||
|
extern void ParseeGlobalBan(ParseeData *, char *user);
|
||||||
|
|
||||||
|
/* Verifies if a user was globally banned. If so, then apply actions to the
|
||||||
|
* room ID */
|
||||||
|
extern bool ParseeManageBan(ParseeData *, char *user, char *room);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue