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:
parent
6357ad5fd9
commit
189f035bd8
3 changed files with 196 additions and 0 deletions
|
@ -13,6 +13,7 @@ extension_LTLIBRARIES = \
|
||||||
chm_nonotice.la \
|
chm_nonotice.la \
|
||||||
chm_operpeace.la \
|
chm_operpeace.la \
|
||||||
chm_quietunreg_compat.la \
|
chm_quietunreg_compat.la \
|
||||||
|
chm_spamfilter.la \
|
||||||
chm_sslonly.la \
|
chm_sslonly.la \
|
||||||
chm_sslonly_compat.la \
|
chm_sslonly_compat.la \
|
||||||
createauthonly.la \
|
createauthonly.la \
|
||||||
|
|
162
extensions/chm_spamfilter.c
Normal file
162
extensions/chm_spamfilter.c
Normal 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
33
extensions/spamfilter.h
Normal 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'
|
Loading…
Reference in a new issue