2012-04-17 20:09:50 +00:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2010 William Pitcock, et al.
|
|
|
|
* The rights to this code are as documented under doc/LICENSE.
|
|
|
|
*
|
|
|
|
* Automatically AKILL a list of clients, given their operating parameters.
|
|
|
|
*
|
|
|
|
* Basically this builds a keyword patricia. O(NICKLEN) lookups at the price
|
|
|
|
* of a longer startup process.
|
|
|
|
*
|
|
|
|
* Configuration.
|
|
|
|
* ==============
|
|
|
|
*
|
|
|
|
* This module adds a new block to the config file:
|
|
|
|
*
|
|
|
|
* nicklists {
|
|
|
|
* all = "/home/nenolod/atheme-production.hg4576/etc/nicklists/azn.txt";
|
|
|
|
* nick = "/home/nenolod/atheme-production.hg4576/etc/nicklists/bottler-nicks.txt";
|
|
|
|
* user = "/home/nenolod/atheme-production.hg4576/etc/nicklists/bottler-users.txt";
|
|
|
|
* real = "/home/nenolod/atheme-production.hg4576/etc/nicklists/bottler-gecos.txt";
|
|
|
|
* };
|
|
|
|
*
|
|
|
|
* You can add multiple all, nick, user and real entries. The entries will be merged.
|
|
|
|
* I would also like to say: fuck you GNAA, you guys need to go play in fucking traffic.
|
|
|
|
* Thanks for reading my crappy docs, and have a nice day.
|
|
|
|
*/
|
|
|
|
|
2012-10-04 05:01:29 +00:00
|
|
|
#include "atheme-compat.h"
|
2012-04-17 20:09:50 +00:00
|
|
|
|
|
|
|
DECLARE_MODULE_V1
|
|
|
|
(
|
|
|
|
"contrib/os_akillnicklist", false, _modinit, _moddeinit,
|
|
|
|
"0.1",
|
|
|
|
"Atheme Development Group <http://www.atheme.org>"
|
|
|
|
);
|
|
|
|
|
|
|
|
static mowgli_patricia_t *akillalllist = NULL;
|
|
|
|
static mowgli_patricia_t *akillnicklist = NULL;
|
|
|
|
static mowgli_patricia_t *akilluserlist = NULL;
|
|
|
|
static mowgli_patricia_t *akillreallist = NULL;
|
|
|
|
|
|
|
|
static mowgli_list_t conft = { NULL, NULL, 0 };
|
|
|
|
|
|
|
|
static void
|
|
|
|
add_contents_of_file_to_list(const char *filename, mowgli_patricia_t *list)
|
|
|
|
{
|
|
|
|
char value[BUFSIZE];
|
|
|
|
FILE *f;
|
|
|
|
|
|
|
|
f = fopen(filename, "r");
|
|
|
|
if (!f)
|
|
|
|
return;
|
|
|
|
|
|
|
|
while (fgets(value, BUFSIZE, f) != NULL)
|
|
|
|
{
|
|
|
|
strip(value);
|
|
|
|
|
|
|
|
if (!*value)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
mowgli_patricia_add(list, value, (void *) 0x1);
|
|
|
|
}
|
|
|
|
|
|
|
|
fclose(f);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
nicklist_config_handler_all(mowgli_config_file_entry_t *entry)
|
|
|
|
{
|
|
|
|
add_contents_of_file_to_list(entry->vardata, akillalllist);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
nicklist_config_handler_nick(mowgli_config_file_entry_t *entry)
|
|
|
|
{
|
|
|
|
add_contents_of_file_to_list(entry->vardata, akillnicklist);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
nicklist_config_handler_user(mowgli_config_file_entry_t *entry)
|
|
|
|
{
|
|
|
|
add_contents_of_file_to_list(entry->vardata, akilluserlist);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
nicklist_config_handler_real(mowgli_config_file_entry_t *entry)
|
|
|
|
{
|
|
|
|
add_contents_of_file_to_list(entry->vardata, akillreallist);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
aknl_nickhook(hook_user_nick_t *data)
|
|
|
|
{
|
|
|
|
user_t *u;
|
|
|
|
bool doit = false;
|
2012-10-04 05:08:08 +00:00
|
|
|
const char *username;
|
2012-04-17 20:09:50 +00:00
|
|
|
|
|
|
|
return_if_fail(data != NULL);
|
2013-01-20 13:34:19 +00:00
|
|
|
|
|
|
|
if (!data->u)
|
|
|
|
return;
|
2012-04-17 20:09:50 +00:00
|
|
|
|
|
|
|
u = data->u;
|
|
|
|
|
|
|
|
if (is_internal_client(u))
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (is_autokline_exempt(u))
|
|
|
|
return;
|
|
|
|
|
|
|
|
username = u->user;
|
|
|
|
if (*username == '~')
|
|
|
|
username++;
|
|
|
|
|
2014-07-08 22:08:51 +00:00
|
|
|
if (mowgli_patricia_retrieve(akillalllist, u->nick) != NULL &&
|
2012-04-17 20:09:50 +00:00
|
|
|
mowgli_patricia_retrieve(akillalllist, username) != NULL &&
|
|
|
|
mowgli_patricia_retrieve(akillalllist, u->gecos) != NULL)
|
|
|
|
doit = true;
|
|
|
|
|
|
|
|
if (mowgli_patricia_retrieve(akillnicklist, u->nick) != NULL)
|
|
|
|
doit = true;
|
|
|
|
|
|
|
|
if (mowgli_patricia_retrieve(akilluserlist, username) != NULL)
|
|
|
|
doit = true;
|
|
|
|
|
|
|
|
if (mowgli_patricia_retrieve(akillreallist, u->gecos) != NULL)
|
|
|
|
doit = true;
|
|
|
|
|
|
|
|
if (!doit)
|
|
|
|
return;
|
|
|
|
|
|
|
|
slog(LG_INFO, "AKNL: k-lining \2%s\2!%s@%s [%s] due to appearing to be a possible spambot", u->nick, u->user, u->host, u->gecos);
|
|
|
|
kline_sts("*", "*", u->host, 86400, "Possible spambot");
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
_modinit(module_t *m)
|
|
|
|
{
|
|
|
|
add_subblock_top_conf("NICKLISTS", &conft);
|
|
|
|
add_conf_item("ALL", &conft, nicklist_config_handler_all);
|
|
|
|
add_conf_item("NICK", &conft, nicklist_config_handler_nick);
|
|
|
|
add_conf_item("USER", &conft, nicklist_config_handler_user);
|
|
|
|
add_conf_item("REAL", &conft, nicklist_config_handler_real);
|
|
|
|
|
|
|
|
akillalllist = mowgli_patricia_create(strcasecanon);
|
|
|
|
akillnicklist = mowgli_patricia_create(strcasecanon);
|
|
|
|
akilluserlist = mowgli_patricia_create(strcasecanon);
|
|
|
|
akillreallist = mowgli_patricia_create(strcasecanon);
|
|
|
|
|
|
|
|
hook_add_event("user_add");
|
|
|
|
hook_add_user_add(aknl_nickhook);
|
|
|
|
hook_add_event("user_nickchange");
|
|
|
|
hook_add_user_nickchange(aknl_nickhook);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
_moddeinit(module_unload_intent_t intent)
|
|
|
|
{
|
|
|
|
hook_del_user_add(aknl_nickhook);
|
|
|
|
hook_del_user_nickchange(aknl_nickhook);
|
|
|
|
|
|
|
|
del_conf_item("ALL", &conft);
|
|
|
|
del_conf_item("NICK", &conft);
|
|
|
|
del_conf_item("USER", &conft);
|
|
|
|
del_conf_item("REAL", &conft);
|
|
|
|
del_top_conf("NICKLISTS");
|
|
|
|
}
|