0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-12-28 08:24:08 +01:00

extensions: implement @jevolk's spamfilter core module

This commit is contained in:
William Pitcock 2016-06-25 23:07:05 -05:00
parent 6357ad5fd9
commit 189f035bd8
3 changed files with 196 additions and 0 deletions

View file

@ -13,6 +13,7 @@ extension_LTLIBRARIES = \
chm_nonotice.la \
chm_operpeace.la \
chm_quietunreg_compat.la \
chm_spamfilter.la \
chm_sslonly.la \
chm_sslonly_compat.la \
createauthonly.la \

162
extensions/chm_spamfilter.c Normal file
View file

@ -0,0 +1,162 @@
/************************************************************************
* charybdis: an advanced ircd. extensions/chm_spamfilter.c
* Copyright (C) 2016 Jason Volk
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "stdinc.h"
#include "s_conf.h"
#include "modules.h"
#include "hook.h"
#include "send.h"
#include "chmode.h"
#include "newconf.h"
#include "substitution.h"
#include "spamfilter.h"
int chm_spamfilter;
int h_spamfilter_query;
int h_spamfilter_reject;
char reject_reason[BUFSIZE - CHANNELLEN - 32];
static
void hook_privmsg_channel(hook_data_privmsg_channel *const hook)
{
// Check for mootness by other hooks first
if(hook->approved != 0 || EmptyString(hook->text))
return;
// Assess channel related
if(~hook->chptr->mode.mode & chm_spamfilter)
return;
// Assess client related
if(IsExemptSpambot(hook->source_p))
return;
// Assess type related
if(hook->msgtype != MESSAGE_TYPE_NOTICE && hook->msgtype != MESSAGE_TYPE_PRIVMSG)
return;
// Invoke the active spamfilters
call_hook(h_spamfilter_query, hook);
if(hook->approved == 0)
return;
call_hook(h_spamfilter_reject, hook);
sendto_realops_snomask(SNO_REJ|SNO_BOTS, L_NETWIDE,
"spamfilter: REJECT %s[%s@%s] on %s to %s (%s)",
hook->source_p->name,
hook->source_p->username,
hook->source_p->orighost,
hook->source_p->servptr->name,
hook->chptr->chname,
hook->reason?: "filter gave no reason");
hook->reason = reject_reason;
}
static
void substitute_reject_reason(void)
{
rb_dlink_list subs = {0};
substitution_append_var(&subs, "network-name", ServerInfo.network_name?: "${network-name}");
substitution_append_var(&subs, "admin-email", AdminInfo.email?: "${admin-email}");
const char *const substituted = substitution_parse(reject_reason, &subs);
rb_strlcpy(reject_reason, substituted, sizeof(reject_reason));
substitution_free(&subs);
}
static
void set_reject_reason(void *const str)
{
rb_strlcpy(reject_reason, str, sizeof(reject_reason));
substitute_reject_reason();
}
struct ConfEntry conf_spamfilter[] =
{
{ "reject_reason", CF_QSTRING, set_reject_reason, 0, NULL },
{ "\0", 0, NULL, 0, NULL }
};
static
int modinit(void)
{
chm_spamfilter = cflag_add(MODE_SPAMFILTER, CHM_D, chm_simple);
if(!chm_spamfilter)
return -1;
add_top_conf("spamfilter", NULL, NULL, conf_spamfilter);
return 0;
}
static
void modfini(void)
{
remove_top_conf("spamfilter");
cflag_orphan(MODE_SPAMFILTER);
}
mapi_hlist_av1 hlist[] =
{
{ "spamfilter_query", &h_spamfilter_query, },
{ "spamfilter_reject", &h_spamfilter_reject, },
{ NULL, NULL }
};
mapi_hfn_list_av1 hfnlist[] =
{
{ "privmsg_channel", (hookfn)hook_privmsg_channel },
{ NULL, NULL }
};
static const char chm_spamfilter_desc[] =
"Adds channel mode +Y which enables various spam mitigations";
DECLARE_MODULE_AV2
(
chm_spamfilter,
modinit,
modfini,
NULL,
hlist,
hfnlist,
NULL,
NULL,
chm_spamfilter_desc
);

33
extensions/spamfilter.h Normal file
View file

@ -0,0 +1,33 @@
/************************************************************************
* charybdis: an advanced ircd. extensions/spamfilter.h
* Copyright (C) 2016 Jason Volk
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#define MODE_SPAMFILTER 'Y'
#define STATCHAR_SPAMFILTER 'S'