diff --git a/include/channel.h b/include/channel.h index 88bded9c..c8c7e602 100644 --- a/include/channel.h +++ b/include/channel.h @@ -175,7 +175,6 @@ typedef int (*ExtbanFunc)(const char *data, struct Client *client_p, #define MODE_FREEINVITE 0x0800 /* allow free use of /invite */ #define MODE_FREETARGET 0x1000 /* can be forwarded to without authorization */ #define MODE_DISFORWARD 0x2000 /* disable channel forwarding */ -#define MODE_NOCTCP 0x8000 /* Block CTCPs directed to this channel */ #define CHFL_BAN 0x10000000 /* ban channel flag */ #define CHFL_EXCEPTION 0x20000000 /* exception to ban channel flag */ diff --git a/modules/Makefile.in b/modules/Makefile.in index 3b1a4754..358064c5 100644 --- a/modules/Makefile.in +++ b/modules/Makefile.in @@ -56,6 +56,7 @@ CORE_SRCS = \ TSRCS = \ chm_nocolour.c \ + chm_noctcp.c \ m_accept.c \ m_admin.c \ m_away.c \ diff --git a/modules/chm_noctcp.c b/modules/chm_noctcp.c new file mode 100644 index 00000000..0e2a9438 --- /dev/null +++ b/modules/chm_noctcp.c @@ -0,0 +1,79 @@ +/* + * charybdis: an advanced ircd. + * chm_noctcp: block non-action CTCP (+C mode). + * + * Copyright (c) 2012 William Pitcock + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice is present in all copies. + * + * 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 "modules.h" +#include "hook.h" +#include "client.h" +#include "ircd.h" +#include "send.h" +#include "s_conf.h" +#include "s_user.h" +#include "s_serv.h" +#include "numeric.h" +#include "chmode.h" +#include "inline/stringops.h" + +static unsigned int mode_noctcp; + +static void chm_noctcp_process(hook_data_privmsg_channel *); + +mapi_hfn_list_av1 chm_noctcp_hfnlist[] = { + { "privmsg_channel", (hookfn) chm_noctcp_process }, + { NULL, NULL } +}; + +static void +chm_noctcp_process(hook_data_privmsg_channel *data) +{ + /* don't waste CPU if message is already blocked */ + if (data->approved || data->msgtype == MESSAGE_TYPE_NOTICE) + return; + + if (*data->text == '\001' && strncasecmp(data->text + 1, "ACTION ", 7) && data->chptr->mode.mode & mode_noctcp) + { + sendto_one_numeric(data->source_p, ERR_CANNOTSENDTOCHAN, form_str(ERR_CANNOTSENDTOCHAN), data->chptr->chname); + data->approved = ERR_CANNOTSENDTOCHAN; + return; + } + else if (rb_dlink_list_length(&data->chptr->locmembers) > (unsigned)(GlobalSetOptions.floodcount / 2)) + data->source_p->large_ctcp_sent = rb_current_time(); +} + +static int +_modinit(void) +{ + mode_noctcp = cflag_add('C', chm_simple); + if (mode_noctcp == 0) + return -1; + + return 0; +} + +static void +_moddeinit(void) +{ + cflag_orphan('C'); +} + +DECLARE_MODULE_AV1(chm_noctcp, _modinit, _moddeinit, NULL, NULL, chm_noctcp_hfnlist, "$Revision$"); diff --git a/modules/core/m_message.c b/modules/core/m_message.c index b2934e9f..ad7ba36a 100644 --- a/modules/core/m_message.c +++ b/modules/core/m_message.c @@ -527,18 +527,6 @@ msg_channel(enum message_type msgtype, if(result == CAN_SEND_OPV || !flood_attack_channel(msgtype, source_p, chptr, chptr->chname)) { - if (msgtype != MESSAGE_TYPE_NOTICE && *text == '\001' && - strncasecmp(text + 1, "ACTION ", 7)) - { - if (chptr->mode.mode & MODE_NOCTCP) - { - sendto_one_numeric(source_p, ERR_CANNOTSENDTOCHAN, - form_str(ERR_CANNOTSENDTOCHAN), chptr->chname); - return; - } - else if (rb_dlink_list_length(&chptr->locmembers) > (unsigned)(GlobalSetOptions.floodcount / 2)) - source_p->large_ctcp_sent = rb_current_time(); - } sendto_channel_flags(client_p, ALL_MEMBERS, source_p, chptr, "%s %s :%s", cmdname[msgtype], chptr->chname, text); } @@ -692,25 +680,6 @@ msg_channel_flags(enum message_type msgtype, struct Client *client_p, return; } - if (msgtype != MESSAGE_TYPE_NOTICE && *text == '\001' && - strncasecmp(text + 1, "ACTION ", 7)) - { - if (chptr->mode.mode & MODE_NOCTCP) - { - sendto_one_numeric(source_p, ERR_CANNOTSENDTOCHAN, - form_str(ERR_CANNOTSENDTOCHAN), chptr->chname); - return; - } - else if (rb_dlink_list_length(&chptr->locmembers) > (unsigned)(GlobalSetOptions.floodcount / 2)) - { - /* This overestimates the number of users the CTCP - * is being sent to, so large_ctcp_sent might be - * set inappropriately. This should not be a problem. - */ - source_p->large_ctcp_sent = rb_current_time(); - } - } - sendto_channel_flags(client_p, type, source_p, chptr, "%s %c%s :%s", cmdname[msgtype], c, chptr->chname, text); } diff --git a/src/chmode.c b/src/chmode.c index ee963289..3a6379de 100644 --- a/src/chmode.c +++ b/src/chmode.c @@ -1485,7 +1485,7 @@ struct ChannelMode chmode_table[256] = {chm_nosuch, 0 }, /* @ */ {chm_nosuch, 0 }, /* A */ {chm_nosuch, 0 }, /* B */ - {chm_simple, MODE_NOCTCP }, /* C */ + {chm_nosuch, 0 }, /* C */ {chm_nosuch, 0 }, /* D */ {chm_nosuch, 0 }, /* E */ {chm_simple, MODE_FREETARGET }, /* F */